I am trying to plot a time series on the left, and its histogram on the right. I have 10000 samples. The files ts.dat and hist.dat contains point to plot in the correct form. How can I plot the two axis aligned? With the code below, gnuplot aligns the canvas, and as the x labels are of different length the axis y length is different.
set term pngcairo font "Times New Roman, 8" size 640, 240
set out 'mp.png'
set multiplot
set tics out
set tics scale 0.5
unset key
set size .66, 1
set yrange[-6:6]
set xtics rotate by 45 right
set xlabel "Iteration no."
set ylabel "USD"
plot 'ts.dat' with lines
set origin .66, 0
set size .33, 1
set yrange [-6:6]
set format y ""
set style fill transparent solid 0.3
set xlabel "No. of occurences"
unset ylabel
plot 'hist.dat' using 2:1 with filledcurves
unset multiplot
Check help margins.
If you set a fixed bottom margin manually, e.g. set bmargin 3 or set bmargin at screen 0.1, the bottom x-axes should be aligned in both plots.
Related
I have tried with the following code:
set term epslatex size 1.3, 1.3 standalone color colortext 9
set output "./test.tex"
set size square 1.3, 1.3
set xtics 1
set style line 1 lt 2 lc rgb "#470024" lw 3
#plot
set yrange [0: 1]
set xrange [0: 5]
set ytics 0.2
set border 1+2+4+8
set ylabel '$y_{\rm wait}$' offset 0.8,0,0
set xlabel '$t$' offset 0,0.5,0
plot exp(-(x)**0.3) w l ls 1 lw 3 notitle
set output
The current output.
The expected ylabel: the subscript is a normal text, instead of an italic form.
(the following part is added 2 days later)
Thanks to your help, I updated the code:
set term epslatex size 1.3, 1.3 standalone color colortext 8
set output "./text.tex"
set size square 1.5, 1.3
set xtics 1
set style line 1 lt 2 lc rgb "#470024" lw 3
#plot
set yrange [0: 1]
set xrange [0: 5]
set ytics 1
set border 1+2+4+8
set ylabel '$y_\textrm{wait}$' offset 0.8,0,0
set xlabel '$t$' offset 0,0.5,0
plot exp(-(x)**0.3) w l ls 1 lw 3 title "$N_\textrm{wait}$"
set output
Now the ylabel is exactly what I want, but I can not obtain the correct subscript for the legend.
This is not an issue with gnuplot, it is an issue with using the deprecated \rm with a modern LaTeX. Use instead \textup or \textrm. For a more complete discussion, see https://tex.stackexchange.com/questions/151897/always-textrm-never-rm-a-counterexample
gnuplot command:
set ylabel '$y_{\textup {wait}}$' offset 0.8,0,0
Edit
If the example below does not work for you then we'll need more information - gnuplot version, latex version, etc
set term epslatex standalone
set out 'font.tex'
set yrange [0: 1]
set xrange [0: 5]
set ytics 0.2
set border 1+2+4+8
set ylabel '$y_{\textrm {wait}}$' offset 0.8,0,0
set xlabel '$t$' offset 0,0.5,0
plot exp(-(x)**0.3) w l ls 1 lw 3 title '$Math_{\textup {Roman}}$'
From this question it turned out that in some cases it might be desirable to align a subplot relative to another's plot axes coordinates.
If you check the gnuplot documentation, you will find that labels, arrows, objects (rectangles, polygons, circles, ...) can be positioned in different coordinate systems, i.e. axes, graph and screen (see help coordinates).
Subplots in a multiplot environment, however, (as far as I know) can only be aligned and sized relative to the screen, see help origin and help size.
Of course, you could always fiddle around with screen coordinates to find the desired positions, but when the size of the terminal or plot, axis labels or automargins might change you will have to start over again.
Question: How to align a subplot relative to the coordinates of another plot?
Aligning a subplot relative to another's plot coordinates is basically a "simple" transformation of coordinates, however, it's not too obvious how to do this in gnuplot.
I haven't found an example on the gnuplot homepage or elsewhere (this shouldn't mean it doesn't maybe exist somewhere), so I would like to share a way which should make life easier and somebody else might find it useful not to have to "reinvent the wheel".
Code:
### multiplots relative to other plots' axes coordinates
reset session
# function to store the current terminal values for later use
GetPlotParams(n) = sprintf("%g %g %g %g %g %g %g %g", \
GPVAL_X_MIN, \
GPVAL_X_MAX-GPVAL_X_MIN, \
GPVAL_Y_MIN, \
GPVAL_Y_MAX-GPVAL_Y_MIN, \
real(GPVAL_TERM_XMIN)/GPVAL_TERM_XSIZE*GPVAL_TERM_SCALE, \
real(GPVAL_TERM_YMIN)/GPVAL_TERM_YSIZE*GPVAL_TERM_SCALE, \
real(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN)/GPVAL_TERM_XSIZE*GPVAL_TERM_SCALE, \
real(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN)/GPVAL_TERM_YSIZE*GPVAL_TERM_SCALE ) \
# real() in order to avoid integer division
PosX(s,x) = word(s,5)+word(s,7)*(x-word(s,1))/word(s,2) # screen position of the subplot
PosY(s,y) = word(s,6)+word(s,8)*(y-word(s,3))/word(s,4)
SizeX(s,dx) = word(s,7)*dx/word(s,2) # screen size of a subplot
SizeY(s,dy) = word(s,8)*dy/word(s,4)
set multiplot
set title "First plot"
set xtics 1
set yrange[-100:100]
set ytics 20
set grid xtics, ytics
plot 25*sin(2*x)/x+10 w l lw 2 notitle
mp1 = GetPlotParams(0) # store parameters of 1st plot
# set white background for future plots
set object 1 rect from graph 0, graph 0 to graph 1, graph 1 behind fc "white"
set margins 0,0,0,0
unset xlabel
set format x ""
unset ylabel
set format y ""
set grid x2tics, ytics
# second plot
set title "2^{nd} plot at -9,30 rel. to first plot" offset 0,-0.5
set origin PosX(mp1,-9),PosY(mp1,30) # relative to plot1
set size SizeX(mp1,5),SizeY(mp1,50) # relative to plot1
plot 50*sin(x) w l lc "red" notitle
mp2 = GetPlotParams(0) # store parameters of 2nd plot
# third plot
set title "3^{rd} plot at 4,30 rel. to first"
set origin PosX(mp1,4),PosY(mp1,30) # relative to plot1
set size SizeX(mp1,5),SizeY(mp1,50) # relative to plot1
set format y ""
plot 50*cos(x)+20*sin(2*x) w l lc "magenta" notitle
mp3 = GetPlotParams(0) # store parameters of 3rd plot
# fourth plot
set title "4^{th} plot from 2^{nd} x=0 to 3^{nd} x=0"
set origin PosX(mp2,0),PosY(mp1,-80) # relative to plot1 and plot2
set size PosX(mp3,0)-PosX(mp2,0),SizeY(mp1,60) # relative to plot1, plot2 and plot3
set xrange [*:*]
set format x
set yrange[*:*]
set format y
plot x**2 w l lc "green" notitle
mp4 = GetPlotParams(0) # store parameters of 4th plot
# fifth plot
set title "5^{th} plot" offset 0,-1
set origin PosX(mp4,-4),PosY(mp4,20) # relative to plot4
set size SizeX(mp1,5),SizeY(mp4,60) # relative to plot1 and plot4
set format x ""
set format y ""
plot (int(2*x)%5)*8 w l lc "blue" notitle
mp5 = GetPlotParams(0)
unset multiplot
### end of code
Result: (actually, a nonsense plot just for illustration. Terminal: set term wxt size 650,480)
I am trying to use the multiplot feature of gnuplot to make a inset graphic on the main plot. I can generate the plot exactly as I want with term='wxt' except for the axis labels, which require LaTeX formatting for generating the desired symbols. When I submit the same commands to term='epslatex', the plot is fine, but all text (axis and tic mark labels) is positioned incorrectly.
I thought using the set size & origin commands might have confused the epslatex terminal output, so I attempted to use the layout command and make the plots side by side just to see if the text would print correctly. It did not.
I'm using gnuplot 4.6 patch 4, and Linux Mint 17.
My script is below. The commented sections indicate the original script that used set size and origin commands to manually place the second plot as a inset, rather than side by side.
set term epslatex color font ",16"
unset key
set termoption dash
set style line 1 lc rgb 'blue' lw 2 lt 1
set style line 2 lc rgb 'red' lw 2 lt 3
set style line 3 lc rgb 'green' lw 2 lt 5
set style line 4 lc rgb 'magenta' lw 2 lt 7
set style line 5 lc rgb 'black' lw 1 lt 0
set output "gr-thresholds.tex"
#set size 1,1
# set multiplot
set multiplot layout 1,2
# bigger plot
set autoscale
set ytics scale default autofreq
set xrange[0:14]
set yrange[0:1.7]
set xlabel 'r (\AA)'
set ylabel '$g(r)$'
#set size 1,1
#set origin 0,0
plot "foo1.csv" w l ls 2, \
"foo2.csv" w l ls 3 , \
"foo3.csv" w l ls 1, \
"foo4.csv" w l ls 4
#small inset
#set size 0.4, 0.4
#set origin 0.5,0.15
set xrange[1.2:2.2]
set yrange[0:0.8]
set ytics 0, 0.2, 2
set xlabel ""
set ylabel ""
plot "foo1.csv" w l ls 2, \
"foo2.csv" w l ls 3 , \
"foo3.csv" w l ls 1, \
"foo4.csv" w l ls 4
unset multiplot
set output
The figure that was generated:
It might be a problem with the way you generate a pdf. The two commands dvipdfm and dvipdf produce different outcomes.
If I take your code, but plot sin(x) instead, and use the following in the terminal:
$ latex file.tex
$ dvipdfm file.dvi
I also get a mismatch between the axes and the plots.
If I use dvipdf however everything looks fine:
$ dvipdf file.dvi
Ok,
Per Tom Fenech's suggestion, I made a minimum code sample to reproduce the error, and the issue that arose is a machine state problem. To generate my graphs, I had run the script twice, once using term wxt and then again using term epslatex.
The problem is that somewhere the state of the gnuplot environment is changed and is not reset by this script. Specifically, the first time through, the default placement of the text labels is fine. The second time through, the range and labels are still attached to the size and origin from the last plot, which is the inset. I thought this was due to the order of the commands set origin/size relative to x/ylabel and x/y range, but simply running the below code twice without restarting gnuplot will generate two different plots. The first time is exactly what I wanted, the second time will skew the labels as shown above.
So I have a "solution", but it is fragile. I would appreciate if someone could explain what I need to do to make this script run multiple times without restarting each time.
Cheers,
--Jim
set term epslatex color font ",16"
unset key
f(x) = sin(x)
set output "sin.tex"
set multiplot
set size 1,1
set origin 0,0
set xrange[0:14]
set yrange[0:6]
set xlabel 'r (\AA)'
set ylabel '$g(r)$'
plot f(x)
#small inset
set size 0.4, 0.4
set origin 0.5,0.15
set xrange[1:3]
set yrange[0:4]
set ytics 0, 0.2, 2
set xlabel ""
set ylabel ""
plot f(x)
unset multiplot
set output
I have to plot 4 graphs without vertical spaces between them and add a caption in my tex document. The problem is that the caption is overlapped with the x-axis label because of the zero bottom margin, I think.
The gnuplot file is something like this
set term epslatex
set output 'foo.tex'
set xrange [-1:1]
set yrange [-1:1]
set multiplot layout 4,1
set ylabel '$y$'
unset xlabel
unset xtics
set tmargin 0
set bmargin 0
plot x w lines
plot x*x w lines
plot x*x*x w lines
set xlabel '$x$'
set xtics
plot x*x*x*x w lines
unset multiplot
and the tex file is
\documentclass[a4paper,11pt]{toptesi}
\usepackage{graphicx}
\begin{document}
\begin{figure}
\input{foo}
\caption{bla bla}
\end{figure}
\end{document}
and the "bla bla" comes over the x label... I tried to put an set bmargin "something" before the last graph but this have the problem that the last graph hasn't the size of the first three anymore... How to fix the size of plots but allow a bmargin for the tex caption?
Try this code...
set term epslatex size <width> <height>
set output 'foo.tex'
set xrange [-1:1]
set yrange [-1:1]
set multiplot
# setup sizes of single plots
set size 1,.25
set ylabel '$y$'
unset xlabel
unset xtics
set tmargin 0
set bmargin 0
# set bottom left corner of current plot
set origin 0,.75
plot x w lines
set origin 0,.5
plot x*x w lines
set origin 0,.25
plot x*x*x w lines
set xlabel '$x$'
set xtics
# set bmargin back
set bmargin 3 #might be enought for place xlabel, try it...
set origin 0,0
plot x*x*x*x w lines
unset multiplot
set out
set term pop
But... The bottom panel is smaller than others, so you must increase vertical size of bottom panel (using set size 1, a) a>0.25 and decrease vertical size of others (set size 1, b before each plot command) and satisfy that a+3b=1. This fine tuning will depend on size parameter of epslatex terminal.
Much much better solution might be this:
...
set size 0,.25
set tmargin 0
set bmargin 1
set origin .75,0
plot ...
set tmargin -1
set bmargin 2
set origin .5,0
plot ...
set tmargin -2
set bmargin 3
set origin .25,0
plot ...
set tmargin -3
set bmargin 4
set origin .25,0
plot ...
Now we might have enough space for bottom xlabel and all of the panels have same height. Unfotunatelly gnuplot 4.6.3 interprets tmargin -3 as tmargin 0. So we can't use it right now... May be in some newer version.
I am having difficulty with the alignment of the different key titles when placed horizontally, apparently due to the differing lengths in the titles.
Having two short plot titles (1st and 4th) and two longer titles (2nd and 3rd) it leaves a larger gap between the final two titles (presumably as it is setting the gaps between them all by the same maximum string length). I have searched but found no way to alter this.
A simplified example is shown below. Any suggestions or help would be greatly appreciated.
set terminal postscript eps size 5.12,2.3 enhanced color "Helvetica" 12
set output 'example.eps'
set title 'Difficulty of Long and Short Title usage in Horizontal Keys' font "Helvetica, 20"
set key inside bottom center horizontal font "Helvetica, 20" width 1.8
set ylabel 'ylabel' font "Helvetica, 20"
set xlabel 'xlabel' font "Helvetica, 20"
set lmargin screen 0.10
set rmargin screen 0.95
set yrange [-1.5:1.5]
plot sin(x) title 'short', \
cos(x) title 'long title 1', \
-0.5 title 'long title 2', \
0.5 title 'short' w l ls 4
The result is:
One possible workaround for this would be to generate the first three graphs and the last one with two different plot commands in multiplot mode:
set terminal postscript eps size 5.12,2.3 enhanced color "Helvetica" 12
set output 'example.eps'
set title 'Difficulty of Long and Short Title usage in Horizontal Keys' font "Helvetica, 20"
set ylabel 'ylabel' font "Helvetica, 20"
set xlabel 'xlabel' font "Helvetica, 20"
set lmargin screen 0.10
set rmargin screen 0.95
set yrange [-1.5:1.5]
set bmargin screen 0.15
set tmargin screen 0.9
set multiplot
set key horizontal font "Helvetica, 20" width 1.8 at graph 0.4, graph 0.1 center maxrows 1
plot sin(x) title 'short', \
cos(x) title 'long title 1', \
-0.5 title 'long title 2'
unset title
unset xlabel
unset ylabel
unset border
unset tics
set key horizontal font "Helvetica, 20" width 1.8 at graph 0.84, graph 0.1 center maxrows 1
plot 0.5 title 'short' w l ls 4
unset multiplot
However, this requires some tweaking:
Before the second plot you must remove title, labels, tics and border, otherwise the graph might look jagged because of different anti-aliasing
To have the same margins you must also set fixed tmargin and bmargin
You must position your keys manually
The above code gives you:
Now you must judge if its worth.
You might use the svg terminal and make the adjustments by opening the svg file on inkscape.