Before we turn to the complete chart, first we should see how we can plot just one single plane, taken the values from the file. For the sake of simplicity, I will use 'ribbon.dat', given in the post yesterday. Also, if you haven't read that post, you should now, for I will simply change two lines, but I will not go through the whole code again.
If you recall, our data file, after some processing in gnuplot, looked like this (well, at least, the first column)
#Surface 0 of 1 surfaces #IsoCurve 0, 3 points #x y z type 0 13 0.901743 i 1 13 0.901743 i 2 13 0 i #IsoCurve 1, 3 points #x y z type 0 12 0.860648 i 1 12 0.860648 i 2 12 0 i ...
This is what we called 'rib2.dat'. We used the every keyword of splot to single out the first (0) and second (1) line in gnuplot. Now, what would happen, if we plotted the second and third lines? We would get a single plane, standing vertically, and having a "shape" given by the 'z' values, as in this figure:
Just for the record, our plot is produced by these three lines in 'ribbon_r.gnu'
r=rand(0); g=rand(0); b=rand(0) set palette model RGB defined (0 r/cm g/cm b/cm, 1 r/cm g/cm b/cm) splot 'rib2.dat' every ::1::2 u (A-1):2:3 w pm3d
i.e., we restrict the 'x' values to 'A-1', and plot the second and third columns of the second and third records in each block. (Remember that the numbering of the records begins with 0!)
The figure is almost OK, with the tiny glitch that the negative values are plotted "downwards", i.e., the reference line is 0. We can fix this with the helper function
zr(x) = (x==0?zmin:x)
which returns the minimum of the zrange, if the 'z' value is smaller, than 0, otherwise it returns 'z'. So, by modifying the plot as
r=rand(0); g=rand(0); b=rand(0) set palette model RGB defined (0 r/cm g/cm b/cm, 1 r/cm g/cm b/cm) splot 'rib2.dat' every ::1::2 u (A-1):2:(zr($3)) w pm3d
we get
Remember that, since we use a random number to determine the RGB values, the colour scheme of the plot will be different after each call of the script, and this is why the plot looks a bit different to the previous one. Nevertheless, the point is not this, but that the plots go up from the bottom of the graph to the corresponding 'z' values. If you are satisfied with this, you can stop here, there is nothing more to it. However, we could turn what we have into a "real" wall chart by adding a "roof" to the walls. All it takes is four extra lines in our 'for' loop, which will now look like this (this is wall_r.gnu for reference)
A=A+1 set table 'rib.dat' plot filename u A:A unset table set table 'rib2.dat' splot 'rib.dat' mat unset table r=rand(0); g=rand(0); b=rand(0) set palette model RGB defined (0 r/cm/cm g/cm/cm b/cm/cm, 1 r/cm/cm g/cm/cm b/cm/cm) splot 'rib2.dat' every ::1::2 u (A-1):2:(zr($3)):3 w pm3d set palette model RGB defined (0 r g b, 1 r g b) splot 'rib2.dat' every ::0::1 u (A-1+B*$1):2:3 w pm3d set palette model RGB defined (0 r/cm g/cm b/cm, 1 r/cm g/cm b/cm) splot 'rib2.dat' every ::1::2 u (A-1+B):2:(zr($3)):3 w pm3d if(A<C) reread
Note that we plot the same file, 'rib2.dat', thrice, each time with a different shade of the same colour: first with the darkest, and this is the plane farthest from the viewer, then the roof of the walls, i.e., the ribbons, with the lightest, and finally, the front plane of the walls with a medium shade. The main script reads as follows
reset filename="ribbon.dat" mult=1.2; cm=1.4 A=0; B=0.3; set xlabel 'x axis [a.u.]'; set ylabel 'y axis [a.u.]'; set ticslevel 0 unset key; unset colorbox set tics out nomirror set border 1+2+4+8+16+32+64+256+512 back mini(x)=(x<0 mult:x="" mult="" x="">0?x*mult:x/mult) zr(x) = (x==0?zmin:x) set isosample 100, 3 set xrange [0:1]; set yrange [0:1] set table 'bg.dat' splot x unset table; set xrange [*:*]; set yrange [*:*] splot filename mat C=GPVAL_DATA_X_MAX+1 ymax = GPVAL_DATA_Y_MAX+1 zmin = mini(GPVAL_DATA_Z_MIN) zmax = maxi(GPVAL_DATA_Z_MAX) set xrange [-0.5:C-0.5] set yrange [0:ymax] set zrange [zmin:zmax] set cbrange [0:1] set multiplot set palette model RGB defined (0 0.3 0.3 0.85, 1 0.9 0.9 0.95) splot 'bg.dat' u ($1*C-0.5):($2*ymax):(zmin):3 w pm3d, \ '' u ($1*C-0.5):(ymax):(1.9999*$2*(zmax-zmin)+zmin):3 w pm3d, \ '' u (-0.5):($1*ymax):(1.9999*$2*(zmax-zmin)+zmin):(0) w pm3d set cbrange [zmin:zmax] unset border; unset tics; unset xlabel; unset ylabel; unset zlabel l 'wall_r.gnu' unset multiplot 0>
This is identical to 'ribbon.gnu' from yesterday, with the exception of the definition of the helper function 'zr(x)'. The resulting figure looks like this one
There are two more things that we could do with this graph: One is that we can add a grid to the surfaces by adding these three lines to our 'for' loop
set style line 1 lt -1 lw 0.5 ps 0 set pm3d implicit at s set pm3d depthorder hidden3d 1
(Or, we could add this to our main script, but only after plotting the background, otherwise, that will be gridded, too.) By doing so, we get the following figure
The second is that instead of drawing the back plane of the wall, we could add a front plane, thereby "closing" the volume. We do this by replacing the first plot command in our 'for' loop by
splot 'rib2.dat' every ::0:(ymax-2):1:(ymax-1) u (A-1+B*$1):(0):(zz($2,$3)) w pm3d
and adding the helper function
zz(x,y) = (x==1?zmin:y)
to the main script. What the plotting command does is to take only the last two blocks, and choose only the first and second records. The last two blocks will have 1 and 0 in the second column, so we use that and the helper function to determine which 'z' value we want to pick to draw our rectangle in the front.
Of course, you should plot the front plane after you plotted the ribbon on the top, otherwise, parts of it might be covered. Once you do that, you get the following image
I believe, there is not too much else that we could do here, but we have gone a long way, and produced a decent-looking wall chart! I should also point out that, if you want to use the second plot, i.e., the wall chart without the roofs, you can still add a grid. All you have to do is to add those three lines that we discussed in connection with the grid on the complete wall chart, and you can, naturally, add a grid to the ribbon plot that we discussed yesterday.
Hallo, mein name ist Ali, ich bin auch Physiker. Es würde mich sehr freuen, wenn du mit mir über Physik sprechen könnte. Ich mache mein Magisterarbeit, und bald werde ich das beenden. Ich komme aus Méxiko und ich habe gestudiert an der "Universidad Nacional Autónoma de México". Nächsten Monat mache ich eine Deutsche prüfung, und ich will mein Sprache üben. Irgendwie würde es sehr interessant anderen Physiker der Welt kennen lernen. Ich liebe gnuplot benutzen.
ReplyDeleteWenn du willst mit mir sprechen, lasse ich hier mein e-mail tlatoani_m at hotmail.com