gnuplot hypertext is not working - gnuplot

I have the below gnuplot script, I'm trying to display the third column when the mouse hover over a point of the plot.
set title "Cloud"
set xlabel "Date"
set ylabel "Number"
filename ='data.dat'
stats filename using 4 nooutput
set xdata time
set timefmt '%Y-%m-%d'
set format x '%Y'
rand_x(x) = x + 60*60*24*7 * (rand(0) - 0.5)
rand_y(y) = y + (rand(0) - 0.5)
set xrange [ "1995-01-19":"2013-12-12" ]
plot for [i=0:int(STATS_max)-1] filename \
using (rand_x(timecolumn(1))):(i < $4 ? rand_y($2) : 1/0):3 pointtype 7 linecolor palette notitle
u 0:1:2 with labels hypertext point pt 7 ps var lc rgb "#ffee99"
And the data file looks like below:
1999-01-19 21 0 1
2009-07-01 0 1 1
2008-08-20 2 1 1
2008-12-18 1 1 1
2004-05-12 4 1 1
2009-07-29 2 1 1
2008-08-07 0 1 1
2006-03-08 1 1 1
2004-08-31 9 1 1
2001-03-27 12 1 1
2009-08-19 0 1 1
2010-07-14 2 1 1
2009-06-24 0 1 1
2009-11-11 0 1 1
2010-10-13 0 1 1
2012-02-22 0 1 1
2011-05-11 0 1 1
2011-03-03 0 1 1
2011-09-21 0 1 1
2011-12-20 0 1 1
2011-10-05 0 1 1
2012-05-03 0 1 1
2011-10-05 0 2 1
2013-01-09 0 2 1
2011-06-03 0 2 1
So can you please tell me what's wrong with my script?
Thanks.

First a remark for the readers: hypertext works only with the 4.7 development version.
To your problem: For plotting the labels, you must also use the same x and y columns 1 and 2 (you use 0 and 1). And you need the third column for the labels and a fourth one for the ps var. So your plot part for the labels is:
plot for [i=0:int(STATS_max)-1] filename \
using (rand_x(timecolumn(1))):(i < $4 ? rand_y($2) : 1/0):3 pointtype 7 linecolor palette notitle,\
'' u 1:2:3:3 with labels hypertext point pt 7 ps var lc rgb "#ffee99"

Related

How to use Gnuplot to print 3D plots (splot) with error bars and different linespoints

using Gnuplot to plot 3D charts with splot and errors with zerror does not allow us to have different lines with points. Here are examples. I would like to use splot with error bars and still differentiate lines by different points. Like it is mentioned here:
The operation of with is also the same as in plot, except that the
plotting styles available to splot are limited to lines, points,
linespoints, dots, and impulses; the error-bar capabilities of plot
are not available for splot.
Is there another solution for this problem in Gnuplot?
As you note, there doesn't seem to be a direct plotting style for drawing error bars in 3D. It is possible to manipulate the input data to pseudo-draw the error bars with lines style.
Sample Script:
$inputdata <<EOD
# x y z zlow zhigh
1 1 1 0 2
2 1 2 1 3
3 1 3 2 4
4 1 4 3 5
5 1 5 4 6
1 2 5 1 7
2 2 4 1 7
3 2 3 1 7
4 2 2 1 7
5 2 1 1 7
1 3 3 1 4
2 3 3 2 5
3 3 3 3 6
4 3 3 2 5
5 3 3 1 4
EOD
# construct errorbar's line segments data
set table $first
plot $inputdata using 1:2:4:($1-0.1):4:5:0 with table
set table $second
plot $inputdata using 1:2:5:($1+0.1):4:5:0 with table
unset table
# summarize data into data block $errbars
stats $inputdata using 0 nooutput
set print $errbars
do for [i=1:STATS_records] {
print $first[i]
print $second[i]
print ""
print ""
}
set print
set xrange [0:6]
set yrange [0:4]
set key noautotitle
splot $inputdata using 1:2:3:2 with linespoints pt 7 lc variable, \
$errbars using 1:2:3:2 with lines lc variable, \
$errbars using 4:2:5:2 with lines lc variable, \
$errbars using 4:2:6:2 with lines lc variable
pause -1
It uses the line-wise data (x,y,z,zlow,zhigh) of the data points and error range as inputs to build the data to draw the error bars and whiskers. Once that's done, we can draw each part of the error bar in lines style.
Result:
Here's another solution using vector style which is actually much simpler than above script.
Sample script:
$inputdata <<EOD
# x y z zlow zhigh
1 1 1 0 2
2 1 2 1 3
3 1 3 2 4
4 1 4 3 5
5 1 5 4 6
1 2 5 1 7
2 2 4 1 7
3 2 3 1 7
4 2 2 1 7
5 2 1 1 7
1 3 3 1 4
2 3 3 2 5
3 3 3 3 6
4 3 3 2 5
5 3 3 1 4
EOD
set xrange [0:6]
set yrange [0:4]
unset key
set style arrow 3 heads size 0.05,90 lc variable
splot $inputdata using 1:2:3:2 with linespoints pt 7 lc variable, \
$inputdata using 1:2:4:(0):(0):($5-$4):2 with vectors arrowstyle 3
pause -1
Thanks.

Summing over y values for same x value

I want gnuplot to plot the sum of all z values in all cases where the x and y values are equal.
A dummy data file looks like this:
#testfile
0 0 1
0 1 1
0 1 1
0 1 1
1 0 1
1 1 1
1 1 2
1 1 2
I am using plot "testfile" u 1:2:3 w p ps variable to scale the points according to the value in the third column, and I would like to find a command that gives the same plot for the above data file as if I were to plot this data file:
#testfile2
0 0 1
0 1 3
1 0 1
1 1 5
If that makes it easier, in my real data file, I always have to sum over two lines.
I don't know if you're looking for a gnuplot-only solution, but what you want could be accomplished with a simple awk one-liner, either ran separate or embedded on gnuplot. By the way, this assumes that you you always have to sum over two lines:
Input file:
0 1 1
0 1 1
1 0 1
1 0 2
1 1 2
1 1 2
By running:
awk '{sum+=$3} (NR%2)==0{print $1,$2,sum; sum=0;}' testfile
You would get:
0 1 2
1 0 3
1 1 4
Then you could save in a separate file and plot with the line you mentioned above. Alternatively, you can embed the awk line within gnuplot using:
plot "<awk '{sum+=$3} (NR%2)==0{print $1,$2,sum; sum=0;}' testfile" u 1:2:3 not w p ps variable pt 7
Hope it helps!

How to set different heights for separate plots using multiplot

How can one set different heights for two or more plots in multiplot-mode using set size <x>,<y> respecting correct arrangement for the x-axes of the plots? Following problem: I've got a heatmap plot and another linespoint plot with the same time axis. The heatmap plot contains way more information and should use e.g. 80% of the canvas height. Using
set multiplot layout 2,1 margins .1,.8,.05,.95 spacing .05
sets the plots in perfect arrangement but without the possibility to change heights; or at least I didn't manage to get it right. Here are two examples using code from the gnuplot demopage:
$map2 << EOD
0 0 5
0 1 4
0 2 3
0 3 1
0 4 0
1 0 2
1 1 2
1 2 0
1 3 0
1 4 1
2 0 0
2 1 0
2 2 0
2 3 1
2 4 0
3 0 0
3 1 0
3 2 0
3 3 2
3 4 3
4 0 0
4 1 1
4 2 2
4 3 4
4 4 3
EOD
set multiplot layout 2,1 margins .1,.8,.05,.95 spacing .05
plot '$map2' using 2:1:3 with image
plot sin(x)*cos(x)**2, tan(x)
unset multiplot
which results:
Setting explicit sizes and origins before the plotting commands doesn't have any effect.
Plotting without the margins/spacing option and instead setting explicit sizes and origins for each plot one could only guess the correct x-width for the second plot. Guessing it between .85 and .9 in the code:
$map2 << EOD
0 0 5
0 1 4
0 2 3
0 3 1
0 4 0
1 0 2
1 1 2
1 2 0
1 3 0
1 4 1
2 0 0
2 1 0
2 2 0
2 3 1
2 4 0
3 0 0
3 1 0
3 2 0
3 3 2
3 4 3
4 0 0
4 1 1
4 2 2
4 3 4
4 4 3
EOD
set multiplot layout 2,1
set size 1,.75
set origin 0.025,.25
plot '$map2' using 2:1:3 with image
set size .85,.25 # <---
set origin 0.025,0
plot sin(x)*cos(x)**2, tan(x)
unset multiplot
lets me plot it like that:
I hope I could explain my question and thanks a lot for your help! It is highly appreciated!
If I have understood your question, you have to only change rmargin and lmargin:
set size 1,1
set origin 0,0
unset bmargin, unset lmargin, unset tmargin, unset rmargin
set multiplot
set size 1,0.8
set origin 0,0.2
set lmargin at screen 0.1
set tmargin at screen 0.95
set rmargin at screen 0.9
plot 'map2.dat' using 2:1:3 with image
set size 1,0.2
set origin 0,0
set tmargin 0
set lmargin at screen 0.1
set bmargin at screen 0.1
set rmargin at screen 0.9
plot[GPVAL_X_MIN:GPVAL_X_MAX] sin(x)*cos(x)**2, tan(x)
unset multiplot

gif animation creation with gnuplot, using a single file with keeping previous data on the plot

This question was answered partly in couple of places, like Create a gif in Gnuplot from a single file.
Yet there is a problem, the provided answer is going to plot only points at each index.
lets say I have the following data set:
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
my code for creating the gif is :
set terminal gif animate delay 50
set output 'foobar.gif'
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1.5
stats 'Datafile' nooutput
do for [i=1:int(STATS_blocks)] {
splot 'Datafile' index (i-1) matrix with p ls 1
}
This code will generate a gif that just contains the data of each index. while I want the second dataset to be added to the first one the animation.
How should I do that?
Well I managed to find the answer by my own, and sorry #Christoph the easiest answer is always erasing the question. Yes it is possible with adding a second loop. I knew that I needed to add a second loop, but I was not sure how to:
set terminal gif animate delay 50
set output 'foobar.gif'
set grid
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1.5
stats 'Datafile' nooutput
set ztics 1
set zrange [-2:7]
do for [i=1:int(STATS_blocks)] {
splot for [j=1:i] 'Datafile' index (j-1) matrix notitle with p ls 1
}
This will generate what I want.

gnuplot | 3D layers

I have the below data file which has:
1st column is the layer number.
2nd column is the X axis.
3rd column is the Y axis.
1 1999-01-19 21 0 1
1 2009-07-01 0 1 1
1 2008-08-20 2 1 1
1 2008-12-18 1 1 1
2 2004-05-12 4 1 1
2 2009-07-29 2 1 1
3 2008-08-07 0 1 1
4 2006-03-08 1 1 1
4 2004-08-31 9 1 1
4 2001-03-27 12 1 1
My questions:
1. How can I plot the above data file in 3D knowing that each layer must have different Z offset and different color?
the below must be plotted with Z=1
1 1999-01-19 21 0 1
1 2009-07-01 0 1 1
1 2008-08-20 2 1 1
1 2008-12-18 1 1 1
and the below with Z=2
2 2004-05-12 4 1 1
2 2009-07-29 2 1 1
and so on.
2.If I want to select the layer number 2, other layers must be shaded with gray and this layer must be colored with red for example, is that possible? so it's like highlighting the selected layer.
thx.
To plot the points just use
set xdata time
set timefmt '%Y-%m-%d'
set format x '%Y'
splot 'data.dat' using 2:3:1
That uses the layer number as z-value. To get something else, just specify a function for the z-value depending on the layer number:
zpos(z) = 1 + 0.5*z
splot 'data.dat' using 2:3:(zpos($1))
For the coloring use linecolor rgb variable. That allows you to specify the color in the last column. This color must be the integer representation of an rgb-tuple which is 65536*red + 256*green + blue, with red, green and blue being in the range [0:255].
The following script plots the points in layer 2 in dark red:
set xdata time
set timefmt '%Y-%m-%d'
set format x '%Y'
rgb(r,g,b) = 65536*r + 256*g + b
gray = rgb(200,200,200)
red = rgb(200,0,0)
layer = 2
set view 66,20
splot 'data.dat' using 2:3:1:($1 == layer ? red : gray) with points pt 7 linecolor rgb variable notitle
The result with 4.6.4 is:

Resources