Can hypertext be used with pm3d surface plot in Gnuplot? - gnuplot

I am trying to read coordinates of various points of the 3D surface (heatmap) created with pm3d. If I plot just the points in the 3D space with splot command, I can use hypertext to display their X, Y, Z coordinates interactively. But when I use pm3d command, hypertext seems not working. Is it possible to use simultaneously hypertext and pm3d?

Does this work for you?
f(a,b) = sin(a)*cos(b)
set xrange [-pi:pi]; set yrange [-pi:pi]
set samples 21; set isosamples 21
set pm3d
set pm3d depthorder
splot '++' using 1:2:(f($1,$2)):(sprintf("%.2g %.2g %.2g",$1,$2,f($1,$2))) \
with labels point lc "#FF000000" hypertext
That should give you a pm3d surface with hypertext labels at each vertex. The point lc "#FF000000" is to make the points transparent so they don't interfere with viewing the surface.

Related

gnuplot multiplot layout not being overridden by set origin, ways to position subplots

This question is to some part identical to what has already been asked here. But the referenced question never received the answer to the point whether the issue presented here is a bug or documentation confusion.
Documentation states with respect to the layout option of multiplot:
With the layout option you can generate simple multiplots without
having to give the set size and set origin commands before each plot:
Those are generated automatically, but can be overridden at any time.
My understanding of that text is that layout sets origin and size and at any time, i can change those specifications. Then this should work:
set xrange [0:10]
set multiplot layout 3,1 margins 0.1,0.95,0.12,0.95 spacing 0,0
unset key
plot cos(x) axes x1y1 w l ls 3 notitle
plot sin(x) axes x1y1 w l ls 3 notitle
set key bottom center out horizontal
plot sin(x) axes x1y1 w l ls 3 notitle
set origin 0.3,0.5
set size 0.2,0.1
set xrange [1:2]
plot cos(x) axes x1y1 w l ls 3 notitle
unset multiplot
But it does not. gnuplot completely ignores set size and set origin commands. What it should do is to plot 3 plots under each other and then create an inset at screen position (0.3,0.5) of size relative to canvas (0.2,0.1).
My questions are:
Is this a bug that should be reported or is this poorly formulated documentation issue (that layout can be overridden by set position and set size)?
multiplot offers two ways to position the sub-plots, set origin + set size and set *margin where * stands for one of b,t,l,r. Can someone provide a deeper explanation when one should use which? (For me it feels the proper way that was meant to do it is set origin and margins just became a dirty trick that works but was not meant for that)
What would be the cleanest way to produce the plot that I am looking for that would be easily reproducible (for any other problem, not just 3 plots but any plots and without some tedious calculations of positions)?
Is there a way to print the settings of origin, size, margins and any other relevant settings that are automatically calculated (and used) when the layout option is specified?
My guess would be that it is a bit unclear documentation.
It's a matter of taste and convenience and depends on your situation. Setting origin and size is setting the place for the (sub-)"canvas". This (sub-)"canvas" still can have some individual b,t,l,r margins. Note, margins are the space between graph border and canvas-border.
Apparently, the margins which you are setting in the multiplot layout are kept for your extra plot.
So, apparently you have to reset them, e.g. set margins 0,0,0,0. And then you are probably getting your intended plot.
I am not aware that you can extract the automatically calculated values for margins. There are no such values
listed in show var GPVAL.
Code:
### multiplot layout with manual origin and size
reset session
set xrange [0:10]
unset key
set ytics 0.5
set multiplot layout 3,1 margins 0.1,0.95,0.12,0.95 spacing 0,0
plot cos(x) axes x1y1 w l ls 3 notitle
plot sin(x) axes x1y1 w l ls 3 notitle
set key bottom center out horizontal
plot sin(x) axes x1y1 w l ls 3 notitle
set margins 0,0,0,0
set origin 0.3,0.5
set size 0.2,0.1
set xrange [1:2]
plot cos(x) axes x1y1 w l ls 3 notitle
unset multiplot
### end of code
Result:

Gnuplot: How to continue a pm3d plot to the outside of the set range?

I have a problem with plotting my data points with pm3d in gnuplot. In my data file, the points (2-dim domain) are not rectangular aligned, but parabolic as shown in this figure, where the data points are not aligned exactly above each other. My goal is to create a heatmap with pm3d for a specific xrange where the heatmap is continued to the borders of the selected xrange.
What I did:
Plotted the data set with pm3d using the following minimal code example:
set terminal qt
set xrange [-0.25:1.00]
set view map
splot "data.txt" u 1:2:3 with pm3d
What I got:
A heatmap of my data file, but with ugly corners at the border points at where I cut my x-domain, because the border points are not aligned "above" each other.
What I expected:
A heatmap where the "heat" values are continued to the real border of the domain as it is the case for a simple "with lines" plot, shown in this figure.
My attempts so far to achieve what I expected:
I tried several pm3d options, including the option clip1in, which only requires 1 clip of a "heat rectangle" to be inside the domain, but the result was that the corners are no laying outside of the domain, which doesn't solve the problem unfortunately.
Additional information:
OS: Ubuntu 20.04
$ gnuplot -V
gnuplot 5.2 patchlevel 8
If anybody knows how I achieve what I'm trying to do, it would be nice to share that knowledge!
Cheers!
Gnuplot 5.4 does offer this sort of smooth clipping on the z coordinate, but unfortunately that doesn't help because you want clipping on x in this case.
Here is an example of performing x clipping by manual intervention.
The complicated expression for the x coordinate is just to generate points
with a non-orthogonal grid.
xclip(x) = x > 6. ? 6. : x # clip x to maximum value of 6.
f(x,y) = sin(sqrt(x*x + y*y)) # some function to plot
set sample 21; set isosample 21
set view map
set xrange [-6 : 6]
unset key
set multiplot layout 1,2
set title "No clipping"
splot '++' using ($1+$2*$2/10.) :($2):(f($1,$2)) with pm3d
set title "Manual clipping at x=6"
splot '++' using (xclip($1+$2*$2/10.)):($2):(f($1,$2)) with pm3d
unset multiplot

histogram using gnuplot for multiple data in the same graph

I am trying to plot two data series plotted in one graph (histogram) using gnuplot. One is Baseline data and other one is Optimized. The script looks like this currently.
n=50
max=0.07946462
min=0.0
reset
width=(max-min)/n #interval width
hist(x,width)=width*floor(x/width)+width/2.0 #function used to map a value
to the intervals
set term png #output terminal and file
set output "histogram.png"
set xrange [min:max]
set yrange [0:]
set style fill solid 0.5 #fillstyle
set termopt enhanced # turn on enhanced text mode
set xlabel "PowerDensity(mA/um2)"
set ylabel "Area(um2)"
set title 'Power Density Histogram'
plot 'power_density_oxili_sptp.txt' u (hist($2,width)):($1) smooth frequency
w boxes lc rgb"blue" title 'Baseline', 'power_density_oxili_sptp.txt' u
(hist($3,width)):($1) smooth frequency w boxes lc rgb"red" title 'Optimized'
The output of this will be as given
enter image description here
The problem here, I am not able to see baseline data (blue) completely,since it is hiding below the optimized data.Either I need to see both data or I need to plot histogram separately in the same graph.
Br
Sree
It looks like you want the two histograms to be transparent. For that you should set the transparent flag in your fillstyle (see help fillstyple):
set style fill transparent solid 0.5
In addition, you need to specify truecolor to get transparent areas from the standard png terminal (see help png):
set term png truecolor
Alternatively you can use the pngcairo terminal.

Using gnuplot, how can I plot sin(x) in the x-z plane and sin(x) in the x-y plane, both at the same time?

Using gnuplot, how can I plot sin(x) in the x-z plane and sin(x) in the x-y plane, both at the same time? I'm guessing I need to use the set parametric command and the splot command, but I can't seem to work out the rest! Does anyone know how to do this? I'm trying to generate a plot which demonstrates the nature of an electromagnetic wave. Thanks.
Yes, parametric mode is a possibility. For example, splot u,0,sin(u), u,sin(u),0 will plot the two (!) parametric curves u,0,sin(u) and u,sin(u),0. The variable u is the parametric dummy variable, for a simple sine function we only need one of them, even in 3d mode.
It might look a bit nicer with the following settings, but this is of course my biased opinion, far from finished, and depends on your needs:
set terminal pngcairo
set output "emfield.png"
set yrange [-2:2]
set zrange [-2:2]
set parametric
umax = 6*pi
set urange [0:umax]
unset border
unset xtics
unset ytics
unset ztics
# Set zeroaxes
set xyplane at 0
set arrow from 0,0,0 to (umax*1.1),0,0 size screen 0.020,15,60 filled
set arrow from 0,1,0 to 0,-1,0 size screen 0.020,15,60 filled
set arrow from 0,0,-1.4 to 0,0,1.4 size screen 0.020,15,60 filled
splot u,0,sin(u) lc 6, u,sin(u),0 lc 7
The result looks like this:

Multiple fill styles in 3D Gnuplot graphs using splot

I'm using Gnuplot 5.0.0 to plot multiple intersecting surfaces, which I have set to be transparent. However, I am also mapping some points to these surfaces to indicate how the surfaces are explored during the course of a calculation. The trouble is that the points are not easily visible as they have also been made transparent by the line
set style fill transparent solid 0.60 border
which makes everything in the plot transparent to the same extent. Using a Gnuplot tutorial on transparency (http://www.gnuplotting.org/filledcurves-with-different-transparency/), I tried the following to set the surface transparency independent of that of the points:
splot 'surffile' with pm3d palette fs transparent solid 0.60
But using this method, I get the error "unexpected or unrecognized token", so it seems to me that the the fs method of setting transparency is incompatible with splot.
Is there a way that I can make my surfaces transparent, whilst leaving the points on the surface opaque?
Edit: MCVE
set palette rgb 21,22,23
set pm3d depthorder border linetype -1 linewidth 0.5
splot 'dplgwp01' u 2:3:5 w points,\
'dplgwp01' u 2:3:4 w points,\
'pesd1' with pm3d palette fs transparent solid 0.60,\
'pesd2' u 1:2:3 with pm3d palette fs transparent solid 0.60
dplgwp01 contains data points that I want to remain opaque, whilst pesd1 and pesd2 are surfaces that I want to be transparent.

Resources