This being my first question here makes me a litte nervous. Here I go.
What I want to achieve is to plot four different data files in a multiplot (2x2, maybe more). So far I succesfully plotted this disregarding the different ranges in the y-axis on each, the x-axis is, however, homogenous to all subplots.
So, what I would like is to set to each y-axis 10 "ytics" with a number of minor tics (and, by extension, the x-axis as well). I believe this is done with GPVAL_X (or GPVAL_DATA_X) and GPVAL_Y (or GPVAL_DATA_Y) _MIN/_MAX. So far so good.
This however, does not achieve the result I was aiming for: http://postimg.org/image/uyavbtxn5/
On panel A) the y-axis is correctly divided in 10 segments, not so the x-axis.
Panel B) display correctly both axes.
Panel C) Display the x-axis correctly, whereas the y-axis no.
Panel D) Similar to C), but on the y-axis the tics appear disordered.
This poses the following questions:
1) How can I produce correctly this multiplot using GPVAL (or GPVAL_DATA)?
2) Why the plotted function appears in front of the corresponding label if it specified to otherwise?
This figure was produced with the following code:
reset
# Term
GNUTERM = "x11"
## Output
set t epslatex standalone color solid size 20in,12in font "ptm, 20"
set o "test.tex"
# Axes & Labels
set style line 11 lc rgb '#2F4F4F' lt 1
set border 3 back ls 11
set tics nomirror out
set format y "\\tiny $%2.2t \\cdot 10^{%S}$"
set format x "\\tiny $%1.1t$"
set xlabel "$\\rho$"
unset ylabel
unset key
# Grid
set style line 12 lc rgb'#2F4F4F' lt 0 lw 1.5
set grid back ls 12
# Border
set border 31 linewidth .75 # thin border
# Multiplot Files
set multiplot layout 2,2 columnsfirst
## UL
## Labels
LABEL = "A) $sin(x)$"
set obj 10 rect fill at graph 0.3, graph 0.75 size char strlen(LABEL), char 2
set label 10 at graph 0.3, graph 0.75 LABEL front center
plot sin(x)
## Tics
set xtics add GPVAL_X_MIN,(GPVAL_X_MAX-GPVAL_X_MIN)/10.,GPVAL_X_MAX
set ytics add GPVAL_Y_MIN,(GPVAL_Y_MAX-GPVAL_Y_MIN)/10.,GPVAL_Y_MAX
set mxtics 5
set mytics 5
## LL
## Labels
LABEL = "B) $cos(x)$"
set obj 10 rect fill at graph 0.3, graph 0.75 size char strlen(LABEL), char 2
set label 10 at graph 0.3, graph 0.75 LABEL front center
plot cos(x)
## Tics
set xtics add GPVAL_X_MIN,(GPVAL_X_MAX-GPVAL_X_MIN)/10.,GPVAL_X_MAX
set ytics add GPVAL_Y_MIN,(GPVAL_Y_MAX-GPVAL_Y_MIN)/10.,GPVAL_Y_MAX
set mxtics 5
set mytics 5
## UR
## Labels
LABEL = "C) $cos(x) sin(x)$"
set obj 10 rect fill at graph 0.3, graph 0.75 size char strlen(LABEL), char 2
set label 10 at graph 0.3, graph 0.75 LABEL front center
plot cos(x)*sin(x)
## Tics
set xtics add GPVAL_X_MIN,(GPVAL_X_MAX-GPVAL_X_MIN)/10.,GPVAL_X_MAX
set ytics add GPVAL_Y_MIN,(GPVAL_Y_MAX-GPVAL_Y_MIN)/10.,GPVAL_Y_MAX
set mxtics 5
set mytics 5
## LR
## Labels
LABEL = "D) $cos(x) / sin(x)$"
set obj 10 rect fill at graph 0.3, graph 0.75 size char strlen(LABEL), char 2
set label 10 at graph 0.3, graph 0.75 LABEL front center
plot cos(x)/sin(x)
## Tics
set xtics add GPVAL_X_MIN,(GPVAL_X_MAX-GPVAL_X_MIN)/10.,GPVAL_X_MAX
set ytics add GPVAL_Y_MIN,(GPVAL_Y_MAX-GPVAL_Y_MIN)/10.,GPVAL_Y_MAX
set mxtics 5
set mytics 5
unset multiplot
# Clean-up
set o
set t x11
reset
exit 0
Related
I am having a series of problems when defining the axes in my graphic and I would like to share it with you to see if among all we can find the error
I have found on this website a user who has made it similar. My idea is to have one axis on the left and two on the right. But for some reason, it's probably silly, it does not appear correctly.
My code is as following:
set terminal postscript eps enhanced color "Times-Roman" 15
set output "TC_8.eps"
set multiplot
set xlabel "Temperature/{/Symbol \260} C"
set xrange [0:1500]
set key off
set autoscale y
set autoscale y2
##### first plot
set yrange[0:15]
set ylabel "Thermal Diffusivity/(mm^2/s)" textcolor rgb "red"
plot "dt8.txt" using 1:2 smooth cspline lc rgbcolor "red"
##### Second plot
set y2range[0:40]
set y2tics nomirror
set y2label "Thermal Conductivity/ (W/m K))" offset 8, 0 textcolor rgb "green"
plot "dt8.txt" using 1:4 axes x1y2 smooth cspline lc rgbcolor "green"
##### Third plot
set y2range[0:2]
set y2tics no mirror
set y2label "Specific Heat/ (J/(g K))" offset 16, 0 textcolor rgb "blue"
plot "dt8.txt" using 1:3 axes x1y2 smooth cspline lc rgbcolor "blue"
unset multiplot
and the data series is very simple
20 11.466 0.733 28.894
499.6 6.338 1.119 24.38
998.9 5.3 1.292 23.542
1499 4.639 1.645 26.247
The problem is that the two axes on the right do not appear correctly, and the data lines ... either.
Thanks in advance
Do not hesitate to append your plot result and give the reference where you have found something similar.
One way might be to change the margins of the graph and plot another dummy graph just for the third (separated) axis. By the way, you can put two datalines into one plot.
Code: (edit: modified to make it copy&paste including data)
### 3 y-axes
reset session
$Data <<EOD
20 11.466 0.733 28.894
499.6 6.338 1.119 24.38
998.9 5.3 1.292 23.542
1499 4.639 1.645 26.247
EOD
set key off
set autoscale y
set autoscale y2
set lmargin 10
set tmargin 2
set bmargin 4
set rmargin 20
set multiplot
##### first plot
set xlabel "Temperature / {/Symbol \260}C" font ",11"
set xrange [0:1500]
set ylabel "Thermal Diffusivity / (mm^2/s)" textcolor rgb "red" font ",11"
set yrange[0:16]
set ytics nomirror
set y2range[0:40]
set y2tics nomirror
set y2label "Thermal Conductivity / (W/m K)" offset -1,0 textcolor rgb "green" font ",11"
set grid xtics, ytics
plot $Data u 1:2 axes x1y1 smooth cspline lc rgbcolor "red", \
'' u 1:4 axes x1y2 smooth cspline lc rgbcolor "green"
##### Second plot
unset xlabel
unset ylabel
unset y2label
unset tics
set y2range[0:2]
plot $Data u 1:3 axes x1y2 smooth cspline lc rgbcolor "blue"
##### Third plot
set rmargin 10
set border 8 # only right border visible
set y2label "Specific Heat/ (J/(g K)" offset -1,0 textcolor rgb "blue" font ",11"
set y2tics nomirror offset 0,0
plot NaN # plot nothing
unset multiplot
### end of code
Result:
How can I add an X grid with different spacing than the tics? My plot is a histogram showing # of patents (of a certain type) granted per year, and the year range is large (1807-1971). I'd like to tic/label each year but only add X grid lines every decade (and also use a different color for the matching decade labels).
I've been searching for an answer and trying things for hours and getting nowhere. Are either of these possible?
My current plot (with no X grid) looks like:
And the script is:
set style data histograms
set style histogram gap 1
set style fill solid
set title "Number of Prism Glass Patents Granted" font "fixed, 24" offset 0,-0.9
set xlabel "Year" font "fixed,18" offset 0,0.8
set nokey
set xtics out nomirror rotate font "fixed, 8" offset 0,0.4
set grid y
plot 'frequency.dat' using 2:xtic(1) linecolor 'blue'
I assume your data consists out of two columns: Year and number of patents.
Why do you use xitc(1), is it necessary to label every single year?
What about using minor and major xtics? I would use plotstyle with boxes.
Code:
### major and minor xtics
reset session
# generate some random data
set print $Data
do for [i=1807:1971] {
print sprintf("%d %d", i, int(rand(0)*100))
}
set print
set xlabel "Year"
set xtics out nomirror
unset x2tics
set xtics 10
set mxtics 10
set grid ytics
set grid xtics
set boxwidth 0.5
plot $Data u 1:2 with boxes fill solid 1.0 lc rgb "blue" notitle
### end of code
Result:
Addition:
Another version with grid every 10 years and label with different color. Labels are only shown when number of patents>0. Instead of using xtics it is done by plotting with labels.
Code:
### major and minor xtics
reset session
set term pngcairo size 1600,360
set output "tbGrid.png"
xmin = 1807
xmax = 1971
# generate some random data
set print $Data
do for [i=xmin:xmax] {
print sprintf("%d %d", i, int(rand(0)+0.4)*(int(rand(0)*100)))
}
set print
set xlabel "Year" offset 0,-1.5
set xrange[xmin-1:xmax+1]
set xtics 10 format "" out nomirror
set mxtics 10
set bmargin 5
set grid ytics
set grid xtics
set boxwidth 0.5
myTic(n,p) = p==0 ? "" : sprintf("%d",n)
myColor(n) = int(n)%10==0 ? 0xff0000 : 0x000000
plot $Data u 1:2 with boxes fill solid 1.0 lc rgb "blue" notitle, \
'' u 1:(0):(myTic($1,$2)):(myColor($1)) with labels \
tc rgb var rotate offset 0,-1.5 font ",8" notitle
set output
### end of code
Result:
The grid for each axis is generated from the tics for that same axis, so yes they always match. However if your plot uses only the x1 axis, you could define the range and tics for the x2 axis also and turn on the grid only for x2 and not for x1.
Recent gnuplot versions have a command set link x2 that ensures the x1 and x2 axes agree on the range and scale. If your version does not support this you can still set them to match explicitly:
set xrange [min:max]
set x2range [min:max]
set xtics <whatever> # these will label the actual plot
set x2tics <something else> # these will be used only for grid lines
set x2tics scale 0.0 format "" # show no x2 tics or labels on the plot
set grid x2 nox
plot ...
Thank you both-- here's my final plot:
...and its script:
# histogram of # of prism glass patents granted per year
###
set term png size 1800,600
xmin = 1807
xmax = 1971
set title sprintf("Prism Glass Patents Granted %d-%d", xmin, xmax) \
font "fixed, 24" offset 0,-0.5
set xlabel "Year" font "fixed,24" offset 0,-2
# x tic for each year
set xrange [xmin-1:xmax+1]
set xtics 1 out nomirror format ""
# x2 tic and gridline for each decade
set x2tics 1800,10,1970
set x2tics out font "fixed, 12" offset 0,-0.6
set grid x2 nox
set grid y # y axis is count
set boxwidth 0.5
set bmargin 5
set nokey
myTic(y,n) = n==0 ? "" : sprintf("%d",y) # only label year if count>0
myColor(y) = y==1897 ? 0x0000FF : 0x000000 # highlight 1897 (biggest year)
plot 'frequency.dat' using 1:2 with boxes fill solid lc rgb "blue", \
'' using 1:(0):(myTic($1,$2)):(myColor($1)) with labels \
tc rgb var rotate offset 0.1,-1.2 font "fixed,8"
Good day,
I need to create a group bar chart graph with different scales.
Consider following data example:
Metric A B
Group1 10 1500
Group2 20 4000
I am using this answer and this code:
reset
set style histogram cluster gap 1
set style data histograms
set style fill solid 1.00 border
set yrange [0:]
set ytics nomirror
set y2range [0:]
set y2tics
set key right autotitle columnheader
plot 'file.dat' u 2 every ::::0, '' u 3:xtic(1) every ::::0,\
newhistogram lt 1 at 1,\
'file.dat' u 2 every ::1::1 axes x1y1, '' u 3:xtic(1) every ::1::1 axes x1y2
The code above creates this plot:
However, what I need is:
Left Y scale to be [0:20]
All numbers from A to be plotted according to left Y scale
All numbers from B to be plotted according to right Y scale
If possible, to put labels on both left and right Y scale.
If possible, to have only one pair of A and B in the legend.
This way, the Violet color Bars will be much higher, and dependent only on column A number range.
Thank you very much!
try using 2 axis using y2:
set ytics nomirror
set y2tics
set yrange [0:20]
set y2range [0:]
set key right
label = "MyLabel"
set ylabel label
set y2label label
set style data histograms
plot 'histplot.dat' using 2 ti col axis x1y1, '' u 3:xticlabels(1) ti col axis x1y2
I am trying to arrange several plots with histograms in a multiplot mode.
I have successfully plotted them. (Please see the attached pic)
.
But I have a problem with plotting the legend (or key).
I want the legend to be at the middle of the last row and the most right column in the multiplot (please see the attached plot).
I have tried to plot the legend but no avail. To have a better understanding of what I did, I have provided the whole script on which I am working.
Hope I get some help to draw the legend and place that at last column and last row.
#!/usr/bin/gnuplot
#########################################################################################
set terminal postscript eps size 7.8,6.8 enhanced color font 'Helvetica,20'
set output 'yy_HB_all_Chap6_LYOsystems.eps'
#########################################################################################
set macro
labelFONT="font 'Helvetica,24'"
labelFONTin="font 'Helvetica,18'"
scaleFONT="font 'Helvetica,16'"
scaleFONTx="font 'Helvetica,15'"
keyFONT="font 'Helvetica,24'"
set key spacing 3.5 samplen 3 #keyFONT
#########################################################################################
set xtics #scaleFONT
set ytics #scaleFONT
set xlabel "Oxygen" #labelFONT
set ylabel "Hydrogen Bond" #labelFONT offset 2.2,0
#set label "Hydrogen Bonds" at -2.0,0.35 rotate by 90 right #labelFONT
#########################################################################################33
set style histogram rowstacked
set style data histograms
set boxwidth 0.75 absolute
set style fill solid 1.00 noborder
#set boxwidth 0.8
#set style fill transparent solid 0.75 noborder
set yrange [0:2.5]
set xrange [0:12]
set multiplot layout 3,2 title ""
##PLOT_1 (1,1)
set label "(a) {/Symbol-Oblique b}Mal-C_{12}(12%wat)" at 1, 2.2 #labelFONTin
plot "HB-data-maltoLyo12per.dat" using 2 t "Lipid-lipid" lc rgb "#191970", '' using 3:xticlabels(5) t "Water-lipid" lc rgb "#6495ED"
###PLOT_2 (1,2)
unset label
set label "(b) {/Symbol-Oblique b}Mal-C_{12}(23%wat)" at 1, 2.2 #labelFONTin
plot "HB-data-maltoLyo23per.dat" using 2 t "Lipid-lipid" lc rgb "#191970", '' using 3:xticlabels(5) t "Water-lipid" lc rgb "#6495ED"
###PLOT_3 (2,1)
unset label
set label "(c) {/Symbol-Oblique b}Mal-C_{12}C_{8}({/Helvetica-Italic R}) " at 1, 2.2 #labelFONTin
plot "HB-data-bcmLyo25perR.dat" using 2 t "Lipid-lipid" lc rgb "#191970", '' using 3:xticlabels(5) t "Water-lipid" lc rgb "#6495ED"
###PLOT_4 (2,2)
unset label
set label "(d) {/Symbol-Oblique b}Mal-C_{12}C_{8}({/Helvetica-Italic S}) " at 1, 2.2 #labelFONTin
plot "HB-data-bcmLyo25perS.dat" using 2 t "Lipid-lipid" lc rgb "#191970", '' using 3:xticlabels(5) t "Water-lipid" lc rgb "#6495ED"
###PLOT_4 (3,1)
unset label
set label "(e) {/Symbol-Oblique b}Mal-C_{12}C_{8}({/Helvetica-Italic RS}) " at 1, 2.2 #labelFONTin
plot "HB-data-bcmLyo25perRS.dat" using 2 t "Lipid-lipid" lc rgb "#191970", '' using 3:xticlabels(5) t "Water-lipid" lc rgb "#6495ED"
######################################################################################################
#set size 0.3,0.3
#set origin 0.70,0.6
set bmargin at screen 0
set key center #keyFONT
set border 0
unset xlabel
unset ylabel
unset label
unset tics
set format x ""
set format y ""
set yrange [0:1]
plot 2 ls 1 title "Lipid-lipid",\
2 ls 2 title "Water-lipid"
######################################################################################################
unset multiplot
You can do this with a trick:
unset key
just after the set multiplot command, so no key is displayed for the first plots. Then, before the last one, issue a command that will restore the key and put it in the right place, that is, outside of the current plot:
###PLOT_4 (3,1)
set key at graph 1.5,screen 0.5 center center
A while back I found a method to join Axes in a nice way. Now that I revisit the plot-making for a report I find that I'm not satisfied...
The reason for this is the overlap between the labels at the tics of my plot. Since I joined the axes, the last of the left and first of the right plot tics will overlap, shown in the below example with random sin and cos plotted.
How can I circumvent this in a general way. Please note that I will be plotting a lot of figures like these in series, figuring out each of these tics depending on the values of my data is not an option for me.
Thanks in advance!
My plot-file: JointAxes.gp
# Generic gnuPlot script for plotting multiple plots in a single figure
# Resetting all variables. Standard for all plots.
reset
# Setting (terminal) options.
set terminal pdfcairo color font ",8"
set output 'JointAxes.pdf'
# Option to plot multiple graphs in one picture, note the number of figs here is 4 (2 by 2).
set multiplot layout 2,2 rowsfirst
# Macro's needed to produce a figure with all plots 'touching'.
set macros
# Small plot labels
LABEL = "at graph 0.9,0.9"
# Axes adjustment
set format x "%.1f"
XAXE = 'set xlabel "Extent"; set xtics -2*pi,pi/3 # N.B. tics should be changed due to conjoined axes.
YAXE = 'set ylabel "Amplitude"; set ytics -1,0.25
NOX = "unset xtics;\
unset xlabel"
NOY = "unset ytics;\
unset ylabel"
# Locking the graphs at fixed points in the figure
# Margins for each row resp. column
TMARGIN = "set tmargin at screen 0.90; set bmargin at screen 0.55"
BMARGIN = "set tmargin at screen 0.55; set bmargin at screen 0.20"
LMARGIN = "set lmargin at screen 0.10; set rmargin at screen 0.50"
RMARGIN = "set lmargin at screen 0.50; set rmargin at screen 0.90"
# General plot markup
unset key
# Legend/key adjustment
# set key samplen 3 # length of legend colour-bar
# set key spacing 1 # spacing between samples
# Optional: Adjusting range
set yrange [-1:1]
set xrange [-pi:pi]
# Plotting the first of the 'sub'-plot
#YAXE; #NOX
#TMARGIN; #LMARGIN
set label 1 'a' #LABEL
plot sin(x)
# Plotting the second 'sub'-plot, i.e. a new plot command.
#NOX; #NOY
#TMARGIN; #RMARGIN
set label 1 'b' #LABEL
plot cos(x)
# Plotting 3rd
#YAXE; #XAXE
#BMARGIN; #LMARGIN
set label 1 'c' #LABEL
plot sin(x + 1.57)
#And Fourth
#NOY; #XAXE
#BMARGIN; #RMARGIN
set label 1 'd' #LABEL
plot cos(x + 1.57)
unset multiplot
set terminal wxt
set output
# OEF