Thank you very much, Allin. I am just busy with preparing lectures but I 
am going to have a look at it tomorrow.

Best,
Artur

Am 06.12.2017 um 19:11 schrieb Allin Cottrell:
> On Tue, 5 Dec 2017, Artur Tarassow wrote:
> 
>> I want to plot a stacked barplot over time by providing the matrix 
>> 'mat' (rows=Time, cols=variables) and a vector 'xmat'. xmat is based 
>> on the $obsdate command holding daily dates in the format YYYYMMDD. My 
>> objective is to handle date strings on the x-axis correctly. But this 
>> drives me nuts...
> 
> Here's a somewhat improved version of my suggestion. As it stands it's 
> adapted to quarterly data. It would be straightforward to generalize it 
> to cover monthly data, daily would require a little more work.
> 
> In this version I've simplified things a little by assuming that Artur's 
> "xmat" (time variable) is not an optional extra but is the last column 
> of the matrix argument to stackplot().
> 
> <hansl>
> set verbose off
> 
> function void stackplot (matrix mat,
>      int nstep[1::4] "Print only n-th value on xaxis",
>      string fname)
> 
>    k = cols(mat)
>    tmpfile = sprintf("%s/stackedbar.gp", $dotdir)
>    outfile @tmpfile --write
> 
>    printf "set encoding utf8\n"
>    printf "set nokey\n"
>    printf "set style data histogram \n"
>    printf "set style histogram rowstacked\n"
>    printf "set style fill solid border -1\n"
>    printf "set style fill solid 0.35\n"
>    printf "set xtics nomirror rotate by -45\n"
> 
>    # write data block
>    printf "$data << EOF\n"
>    loop i=1..rows(mat) -q
>      loop j=1..k-1 -q
>        printf "%g ", mat[i,j]
>      endloop
>      cond = (i == 1 || (i+1) % nstep == 0)
>      printf "%g\n", cond ? mat[i,k] : -1
>    endloop
>    printf "EOF\n"
> 
>    # define a gnuplot function
>    printf "# start literal lines\n"
>    printf "qdate(x)=sprintf(\"%%gQ%%g\",floor(x),10*(x-floor(x)))\n"
>    printf "# end literal lines\n"
> 
>    # write plot specification
>    printf "plot \\\n"
>    loop j=1..k-1 -q
>      if j == 1
>        printf "$data using 1:xtic($%d < 0. ? \"\" : qdate($%d))", k, k
>      else
>        printf "$data using %d", j
>      endif
>      printf "%s\n", j == k-1 ? "" : ",\"
>    endloop
> 
>    outfile --close
>    gnuplot --input="@tmpfile" --output="@fname"
> end function
> 
> open data9-7 -q
> smpl 1975:1 1980:4
> # quarterly data
> series date = $obsmajor + $obsminor/10
> stackplot({QNC}~{QNC/2}~{date}, 2, "display")
> </hansl>

Reply via email to