I try to make a figure using multiplot, but some axes are weird (see figure). I use epslatex to generate a standalone tex file. It looks like a "box" limits the axis, but I cannot figure out what the corresponding option is.
The code used to generate the figure is below.
reset
set term epslatex color standalone header \
"\\usepackage[utf8]{inputenc}\n\\usepackage[T1]{fontenc}\n\\usepackage{cmbright}\n"
set output 'correlations.tex'
set pm3d at b
set pm3d map
unset surface
set pm3d corners2color c4
eps = 1.e-6
f(x)=(log(abs(x)/eps+1))*sgn(x)
set palette functions 2*(gray), 1-2*abs((gray)-.5), 2-2*(gray)
zmax = 1
set cbrange [f(-zmax):f(zmax)]
SX=0.8; SY=0.8
set bmargin 0; set tmargin 0; set lmargin 0; set rmargin 0
X0=0.1; Y0=0.1
DX=0.46; DY=0.64
set size X0+SX+DX,Y0+SY+DY
set origin 0,0
#
# Multiplot
#
set multiplot
#
# bottom left
#
set origin X0,Y0
unset colorbox
unset key
set size square SX,SY
xmax = 5
xshift = 0
set xrange [-xmax-xshift:xmax-xshift]
set yrange [-xmax:xmax]
set xlabel '$x_\parallel$'
set ylabel '$x_\perp$'
set xtics -5,5,5
set ytics -5,5,5
datafile = '../Résultats/correl_pm_smooth2f1.0cutoff5.0xMax5.0nX61.dat'
splot datafile u 1:2:(f($3)) w l t '',\
datafile u 1:(-$2):(f($3)) w l t ''
#
# top left
#
set origin X0,Y0+DY
set xlabel ''
set ylabel ''
set xtics ("" -5, "" 0., "" 5)
datafile = '../Résultats/correl_pm_smooth2f0.0cutoff5.0xMax5.0nX61.dat'
splot datafile u 1:2:(f($3)) w l t '',\
datafile u 1:(-$2):(f($3)) w l t ''
#
# top right
#
set origin X0+DX,Y0+DY
set xtics ("" -5, "" 0., "" 5)
set ytics ("" -5, "" 0., "" 5)
datafile = '../Résultats/correl_pm_smooth2f0.5cutoff5.0xMax5.0nX61.dat'
splot datafile u 1:2:(f($3)) w l t '',\
datafile u 1:(-$2):(f($3)) w l t ''
set origin X0+DX,Y0
set colorbox
set xtics -5,5,5
datafile = '../Résultats/correl_pm_smooth2f5.0cutoff5.0xMax5.0nX61.dat'
splot datafile u 1:2:(f($3)) w l t '',\
datafile u 1:(-$2):(f($3)) w l t ''
unset multiplot
I found the answer. With the epslatex terminal, the size and position of the various items refer to the size of the canvas and should thus be contained in the 1x1 box.
Changing the size of the terminal is done via "set term epslatex size 5,5…".
Related
I'm trying to plot the following 3 intersecting planes:
x + 2y + 4z = 7
2x + 3y + 3z = 1
3x + 7y + 2z = -11
To add emphasis, I wanted to include some headless arrows along the intersection of each pair of planes and a small sphere to indicate the intersection point. But for some reason the planes themselves seem to be out of alignment with the axes. From the equations I can easily find the coordinate of the intersection point, find the coordinates of the edges of the lines that run along the intersection of each pair of planes and if needed find the parametric equation of the lines. But so far when I plot the lines as arrows from the edges of my plot or the intersection as a circle, the planes seem to be wrongly positioned within the coordinates. I can see that the circle or the lines are positioned correctly, but the planes themselves seem to have been shifted. What could be causing this? Am I entering the equations wrong? Maybe the shift of the xy plane moves things around? I think it must be something obvious I'm just not seeing. I find it quite puzzling.
reset
samps = 500
set samples samps,samps
set isosamples samps,samps
f(x,y) = 7/4 - x/4 - y/2
set table $Data01
splot f(x,y)
unset table
g(x,y) = 1/3 - 2/3*x - y
set table $Data02
splot g(x,y)
unset table
h(x,y) = -11/2 - 3/2*x - 7/2*y
set table $Data03
splot h(x,y)
unset table
Zmin = 1.0
Zmax = 3.5
set xrange [-1.2:0.5]
set yrange [-4:0]
set zrange [Zmin:Zmax]
set hidden3d
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set xyplane at Zmin
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
set border 1023-128
set xtics out nomirror
set ytics out nomirror
set ztics out
#set xtics add ('' -4)
Frac(z) = (z - Zmin) / (Zmax - Zmin)
#MyPalette01
Red01(z) = 0
Green01(z) = 255*256
Blue01(z) = int(255*Frac(z))
MyPalette01(z) = Red01(z) + Green01(z) + Blue01(z)
#MyPalette02
Red02(z) = 255*256*256
Green02(z) = int(165*Frac(z))*256
Blue02(z) = 0
MyPalette02(z) = Red02(z) + Green02(z) + Blue02(z)
# MyPalette03
Red03(z) = int(-95*Frac(z)+255)*256*256
Green03(z) = int(32*Frac(z))*256
Blue03(z) = int(-15*Frac(z)+255)
MyPalette03(z) = Red03(z) + Green03(z) + Blue03(z)
#Red03(z) = int(255*Frac(z))*256*256
#Green03(z) = int(255*Frac(z))*256
#Blue03(z) = int(255*Frac(z))
set object circle at -1,-2,3 size 0.05 front
unset key
set pm3d
set pm3d lighting primary 0.5 specular 0.6
set pm3d ftriangles
set style fill transparent solid 0.75 noborder
set pm3d depthorder
unset colorbox
set view 68, 126
splot $Data01 u 1:2:3:(MyPalette01($3)) w l lc rgb var notitle, \
$Data02 u 1:2:3:(MyPalette02($3)) w l lc rgb var notitle, \
$Data03 u 1:2:3:(MyPalette03($3)) w l lc rgb var notitle
I found how to set multiple styles for each plane in here:
Gnuplot 5.2 splot: Multiple pm3d palette in one plot call
And this is how it looks:
Any Ideas?
I have 2 generic Gnuplot files: plot1.plt and plot2.plt already saved.
I need to merge them in a single plot in which plot2.plt is an inset of plot1.plt.
I think I can explain better with a picture.
The final result, let's say, should be something like that
In this image plot2.plt is the inset and the main plot is plot1.plt. Each file can be loaded in Gnuplot correctly and independently.
Thank you for any advice.
Edit:
The code is (but it's not working correctly) something like this:
set multiplot
load "plot1.plt" # plot main figure
set size 0.6, 0.5 # set size of inset
set origin 0.4, 0.5 # move bottom left corner of inset
load "plot2.plt" # plot inset
unset multiplot
plot1.plt and plot2.plt are generic plot files. To not make it more complicate you can generate them in this way:
plot sin(x)
save "plot1.plt" #or choose your folder
plot exp(x)
save "plot2.plt" #or choose your folder
The above code yields:
What I get from the code above
Setting different size or origin for the inset, unfortunately, does not affect the result.
I'm using GNUPLOT version 5.0 patchlevel 4.
I'm sorry for my bad English, I'm not a native speaker. Please feel free to fix grammar/spelling.
EDIT 2:
I now provide the code for the file plot1.plt. Please feel free to edit and remove (entirely or partially) it if you think it's too long.
#!/gnuplot
#
#
# G N U P L O T
# Version 5.0 patchlevel 4 last modified 2016-07-21
#
# Copyright (C) 1986-1993, 1998, 2004, 2007-2016
# Thomas Williams, Colin Kelley and many others
#
# gnuplot home: http://www.gnuplot.info
# faq, bugs, etc: type "help FAQ"
# immediate help: type "help" (plot window: hit 'h')
# set terminal wxt 0 enhanced
# set output
unset clip points
set clip one
unset clip two
set bar 1.000000 front
set border 31 front lt black linewidth 1.000 dashtype solid
set zdata
set ydata
set xdata
set y2data
set x2data
set boxwidth
set style fill empty border
set style rectangle back fc bgnd fillstyle solid 1.00 border lt -1
set style circle radius graph 0.02, first 0.00000, 0.00000
set style ellipse size graph 0.05, 0.03, first 0.00000 angle 0 units xy
set dummy x, y
set format x "% h"
set format y "% h"
set format x2 "% h"
set format y2 "% h"
set format z "% h"
set format cb "% h"
set format r "% h"
set timefmt "%d/%m/%y,%H:%M"
set angles radians
set tics back
unset grid
set raxis
set style parallel front lt black linewidth 2.000 dashtype solid
set key title "" center
set key inside right top vertical Right noreverse enhanced autotitle nobox
set key noinvert samplen 4 spacing 1 width 0 height 0
set key maxcolumns 0 maxrows 0
set key noopaque
unset label
unset arrow
set style increment default
unset style line
unset style arrow
set style histogram clustered gap 2 title textcolor lt -1
unset object
set style textbox transparent margins 1.0, 1.0 border
unset logscale
set offsets 0, 0, 0, 0
set pointsize 1
set pointintervalbox 1
set encoding default
unset polar
unset parametric
unset decimalsign
set view 60, 30, 1, 1
set samples 100, 100
set isosamples 10, 10
set surface
unset contour
set cntrlabel format '%8.3g' font '' start 5 interval 20
set mapping cartesian
set datafile separator whitespace
unset hidden3d
set cntrparam order 4
set cntrparam linear
set cntrparam levels auto 5
set cntrparam points 5
set size ratio 0 1,1
set origin 0,0
set style data points
set style function lines
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
unset x2zeroaxis
unset y2zeroaxis
set xyplane relative 0.5
set tics scale 1, 0.5, 1, 1, 1
set mxtics default
set mytics default
set mztics default
set mx2tics default
set my2tics default
set mcbtics default
set mrtics default
set xtics border in scale 1,0.5 mirror norotate autojustify
set xtics norangelimit autofreq
set ytics border in scale 1,0.5 mirror norotate autojustify
set ytics norangelimit autofreq
set ztics border in scale 1,0.5 nomirror norotate autojustify
set ztics norangelimit autofreq
unset x2tics
unset y2tics
set cbtics border in scale 1,0.5 mirror norotate autojustify
set cbtics norangelimit autofreq
set rtics axis in scale 1,0.5 nomirror norotate autojustify
set rtics norangelimit autofreq
unset paxis 1 tics
unset paxis 2 tics
unset paxis 3 tics
unset paxis 4 tics
unset paxis 5 tics
unset paxis 6 tics
unset paxis 7 tics
set title ""
set title font "" norotate
set timestamp bottom
set timestamp ""
set timestamp font "" norotate
set rrange [ * : * ] noreverse nowriteback
set trange [ * : * ] noreverse nowriteback
set urange [ * : * ] noreverse nowriteback
set vrange [ * : * ] noreverse nowriteback
set xlabel ""
set xlabel font "" textcolor lt -1 norotate
set x2label ""
set x2label font "" textcolor lt -1 norotate
set xrange [ * : * ] noreverse nowriteback
set x2range [ * : * ] noreverse nowriteback
set ylabel ""
set ylabel font "" textcolor lt -1 rotate by -270
set y2label ""
set y2label font "" textcolor lt -1 rotate by -270
set yrange [ * : * ] noreverse nowriteback
set y2range [ * : * ] noreverse nowriteback
set zlabel ""
set zlabel font "" textcolor lt -1 norotate
set zrange [ * : * ] noreverse nowriteback
set cblabel ""
set cblabel font "" textcolor lt -1 rotate by -270
set cbrange [ * : * ] noreverse nowriteback
set paxis 1 range [ * : * ] noreverse nowriteback
set paxis 2 range [ * : * ] noreverse nowriteback
set paxis 3 range [ * : * ] noreverse nowriteback
set paxis 4 range [ * : * ] noreverse nowriteback
set paxis 5 range [ * : * ] noreverse nowriteback
set paxis 6 range [ * : * ] noreverse nowriteback
set paxis 7 range [ * : * ] noreverse nowriteback
set zero 1e-008
set lmargin -1
set bmargin -1
set rmargin -1
set tmargin -1
set locale "Italian_Italy.1252"
set pm3d explicit at s
set pm3d scansautomatic
set pm3d interpolate 1,1 flush begin noftriangles noborder corners2color mean
set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB
set palette rgbformulae 7, 5, 15
set colorbox default
set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault
set style boxplot candles range 1.50 outliers pt 7 separation 1 labels auto unsorted
set loadpath
set fontpath
set psdir
set fit brief errorvariables nocovariancevariables errorscaling prescale nowrap v5
GNUTERM = "wxt"
plot sin(x)
# EOF
OK, here a generic answer, extracted from Philipp K. Janert "Gnuplot in Action".
# functions to be plotted
f(x,a) = x<a ? sqrt(a-x) : 0 # Magnetization
g(x,b) = 0.25*x**4 + b*x**2 # Free Energy
# does the magic:
set multiplot
# the full graph
set grid
plot [-3:2.5][-1:2] f(x,0) notitle w l lw 3
# formatting the inset graphs
unset grid
unset tics
unset xtics
unset ytics
unset key
set tmargin 0; set bmargin 0; set rmargin 0; set lmargin 0
set size 0.2 # relative size of the insets
# draw three insets, clear background, at given origins
set origin 0.175,0.425
clear
plot [-2.5:2.5][-1.5:2] g(x,-1)
set origin 0.4625,0.125
clear
plot [-2.5:2.5][-0.5:3] g(x,0)
set origin 0.675,0.425
clear
plot [-2.5:2.5][-0.5:3] g(x,1)
# cleanup
unset multiplot
which yields
Without your code, have to stop right here but this should get you going.
Ok,
I found the answer my myself, so I'm going to share my findings.
As in the question, let plot2.plt be an inset of plot1.plt. Opening plot2.plt with any text editor we can see the code behind the plot. We have to search these two specific lines:
set size ratio 0 1,1
set origin 0,0
since plot2.plt, in my example, is loaded after the commands set size and set origin,
set multiplot
load "plot1.plt" # plot main figure
set size 0.6, 0.5 # set size of inset
set origin 0.4, 0.5 # move bottom left corner of inset
load "plot2.plt" # plot inset
unset multiplot
they overwrite the expected correct size and ratio. To fix that I ended editing the plot2.plt in this way:
set size ratio 0 0.6,0.5 #old line: set size ratio 0 1,1
set origin 0.4,0.5 #old line: set origin 0,0
Let's say we save the modified file as plot2_mod.plt. Now, to get the correct inset we can write:
set multiplot
load "plot1.plt" # plot main figure
load "plot2_mod.plt" # plot inset
unset multiplot
and the result is:
Plot with the desired inset
Obviously there's still some work to do, but this answer the main point of the question: how to plot an inset using already saved .plt files.
I'm sorry for my bad English, I'm not a native speaker. Please feel free to fix grammar/spelling.
Thank you all for your help and suggestions.
I want to plot a parallel plate capacitor setup with plates at x = -1 and x = +1 lying in the yz plane. I have to then show the potential varying in between them and the vector plot of electric field.
How can I generate the solid plates in 3D?
I am not sure if Gnuplot is the best tool for this, nevertheless an approximation could be perhaps achieved with parametric plotting, where the x-coordinate is fixed and y/z are directly mapped to the u/v parameters:
set terminal pngcairo rounded font ",16"
set xr [-4:4]
set yr [-4:4]
set zr [-4:4]
set palette defined ( 0 "black", 1 "#666666" )
set pm3d at s
unset surface
unset colorbox
set isosamples 100
unset key
set parametric
set ur [-2:2]
set vr [-2:2]
splot \
-1,u,v w l lc rgb '#333333', \
+1,u,v w l lc rgb '#333333'
#or set larger ur/vr and use, e.g.,
# -1,(u>-2&&u<2?u:1/0),(v>-2&&v<2?v:1/0) w l lc rgb '#333333', \
# +1,(u>-2&&u<2?u:1/0),(v>-2&&v<2?v:1/0) w l lc rgb '#333333'
This would give you:
I basically want to draw 2d color surface (or contour plot)
of rosenbrock function f(x,y) = (a-x)^2 + b * (y-x*x) ^2
and append some points (x,y) on this image.
Sample file with points looks as follows:
#x #y
15.00000 12.00000
8.00000 9.00000
The thing is, both graphs do not share the same coordinate system on output image:
coordinate systems do not overlap on each other
gnuplot code:
#!/usr/bin/env gnuplot
reset
set terminal png size 700,700
enhanced set output 'output.png'
set tmargin screen 1
set bmargin screen 0
set border 0 back
set size square
xr=20
yr=20
set xrange [-xr:xr]
set yrange [-yr:yr]
unset key #disablegraph name
unset colorbox
set surface
set multiplot
set view map
set cntrparam levels 10# contour tenderness
set style data pm3d
set pm3d
set contour
a=1 #rosenbrock parameter
b=1 #rosenbrock parameter
#set isosamples 50
splot (a-x) * (a-x) + b * (y-x*x) * (y-x*x) # 2d rosenbrock
unset view
unset pm3d
plot 'data.dat' pt 5, 'data.dat' using 1:2:($0+1) with labels offset 1 notitle
mixing 2d and surface plots with multiplot is usually a mess. I guess you probably don't need multiplot in this simple case. Maybe something like this is enough:
set size square
xr=20
yr=20
set xrange [-xr:xr]
set yrange [-yr:yr]
unset key
unset colorbox
set surface
set pm3d map
set contour
set cntrparam levels 10# contour tenderness
rosenbrock(x,y,a,b)= (a-x) * (a-x) + b * (y-x*x) * (y-x*x)
splot rosenbrock(x,y,1,1) w pm3d, 'data.dat' u 1:2:0 w p pt 5, 'data.dat' using 1:2:(1):($0+1) with labels offset 1,1 notitle
I'd like to plot 3D surface plot combined with heatmap plot of the same function (from file data) at the bottom (like in the chapter "Combining surfaces with images" in Gnuplot Cookbook).
The wanted picture looks like this and this.
Contour plot is plotted with the script.
Is it possible to draw two graphs (contour and 3D) in the polar coordinates in one plot via Gnuplot?
Output is nothing, so there is an error in the code:
reset
set terminal pngcairo size 800,800 enhanced font 'Verdana,20'
set output '3d-polar_AbsPsiSquared.png'
set lmargin at screen 0.05
set rmargin at screen 0.85
set bmargin at screen 0.1
set tmargin at screen 0.9
set pm3d
unset key
set multiplot
stats '_FullWV.dat' using ($3*$3+$4*$4)
max(a,b) = (a>b) ? a : b
round2(x) = x - floor(x) < 0.5 ? floor(x) : ceil(x)
round(x, n) = round2(x*10**n)*10.0**(-n)
Z_MAX = max(-STATS_min, STATS_max)
Z_MAX = round(Z_MAX,1)
set parametric
set grid xtics ytics
set angles degree
#set zrange[-1,1]
#set cbrange [-1:1]
set autoscale fix
#set autoscale xfix
#set autoscale yfix
set autoscale zfix
#set autoscale
set cbrange [-Z_MAX : Z_MAX]
set palette model RGB defined ( 0"#6495ED", 1"blue", 2"#00008B",3"white",\
4"green",5"yellow",6"red")
#splot '_FullWV.dat' u ($2*cos($1)):($2*sin($1)):($3*$3+$4*$4)
set size ratio -1
set hidden front
set xyplane at -1
splot '_FullWV.dat' u (abs(($3*$3+$4*$4))<1e-3 ? NaN : $2*cos($1)):($2*sin($1)):($3*$3+$4*$4) with pm3d at b, '_FullWV.dat' u (abs(($3*$3+$4*$4))<1e-3 ? NaN : $2*cos($1)):($2*sin($1)):($3*$3+$4*$4) with pm3d
unset multiplot
Seems, the solution is depthorder option of pm3d, so the right script is:
reset
set terminal postscript eps size 5,6 enhanced color font 'Helvetica,20' linewidth 2
set output "3d.eps"
set tics scale 1.25
set xlabel '{/Helvetica-Oblique x, a.u.}'
set ylabel '{/Helvetica-Oblique y, a.u.}'
set zlabel '{/Helvetica-Oblique E, a.u.}'
set pm3d depthorder
unset key
set multiplot
unset colorbox
stats '_FullWV.dat' using ($3*$3+$4*$4)
max(a,b) = (a>b) ? a : b
round2(x) = x - floor(x) < 0.5 ? floor(x) : ceil(x)
round(x, n) = round2(x*10**n)*10.0**(-n)
Z_MAX = max(-STATS_min, STATS_max)
Z_MAX = round(Z_MAX,1)
set parametric
set grid xtics ytics ztics
set mxtics 2
set mytics 2
set tics out
set decimalsign ","
set format x "%.1f"
set format y "%.1f"
set format z "%.0f"
set angles degree
set view 61,33
set ztics floor(Z_MAX/3)
set autoscale fix
set autoscale zfix
set cbrange [0 : Z_MAX]
set palette model RGB defined ( 0"#168de2", 1"#0201db", 2"#00008B", 3"#00dcf5",\
4"#09df67",5"yellow",6"red")
set size ratio 1
set hidden3d front
set xyplane at -10
splot '_FullWV.dat' u (abs(($3*$3+$4*$4))<1e-3 ? NaN : $2*cos($1)):($2*sin($1)):($3*$3+$4*$4) with pm3d at b, '_FullWV.dat' u (abs(($3*$3+$4*$4))<1e-3 ? NaN : $2*cos($1)):($2*sin($1)):($3*$3+$4*$4) with pm3d
unset multiplot