Hello fellow stackers,
So I am a gnuplot afficcionado and I keep trying to use gnuplot to draw all sorts of things (including molecules) using it. These days I decided that it would be awesome if I could draw polyhedran in it with this beautiful thining-edge occlusion effect that we see in the interactive javascript polyhedral images here. See how the backside of the polyhedron is drawn differently from the front side and how they change dynamically as you rotate the solid? How can I do that in gnuplot?
I agree that is a really nice representation. Gnuplot cannot currently do the equivalent of "draw the inside edges using thinner lines", but the combination of partial transparency and using the background color as the fill color for the faces creates almost the same effect.
# Generation of polyhedral vertices and faces not shown.
# Each face is an object of type polygon, e.g.
# set object 1 polygon from ... to ... to ...
# make all the faces semi-transparent
set for [i=1:20] object i fillstyle transparent solid 0.6 fillcolor bgnd border lw 2
# use pm3d depthorder sorting to render the objects
# NB: gnuplot version 5.3 required
set for [i=1:20] object i polygon depthorder
set xrange [-2:2]; set yrange [-2:2]; set zrange [-2:2]
set view equal xyz
set view 30,30,1.5
unset border
unset tics
unset key
unset label
splot NaN
Results shown below for a cube and for an icosahedron. You can rotate them interactively as with any other splot.
Related
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
I am plotting a transparent surface using pseudofile '++' (gnuplot 5.2):
set isosample 100
set style fill transparent solid 0.65
splot [0:5][0:5] '++' u 1:2:(sin($1)*sin($2)) w pm3d
but it results in a plot with both lines around each tile of the surface.
I am not sure how to make these transparent as the tiles, or how to suppress them altogether. Using the noborder or any border option of set style fill does not seem to change the output at all.
EDIT: The problem is actually terminal dependent.
above plot is with the qt terminal using its built in export
png, jpg and gif have lines :
But if exported as vector graphics (svg or pdf), again the screen rendering will depend on the viewer used (okular no lines, acrobat reader 9 has them), with some renderers having no lines: check here how your browser behaves (firefox, chromium, epiphany on my linux box are all line-free)
Output of show pm3d:
pm3d style is explicit (draw pm3d surface according to style)
pm3d plotted at SURFACE
taking scans direction automatically
subsequent scans with different nb of pts are flushed from BEGIN
flushing triangles are not drawn
clipping: all 4 points of the quadrangle in x,y ranges
pm3d quadrangles will have no border
steps for bilinear interpolation: 1,1
quadrangle color according to averaged 4 corners
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.
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.
I am generating mapped 3D plots using the following config file (XRANGE and YRANGE are set later)
#!/usr/bin/gnuplot
reset
set term postscript eps enhanced
set size square
set xlabel "X position"
set ylabel "Y position"
#Have a gradient of colors from blue (low) to red (high)
set pm3d map
set palette rgbformulae 22,13,-31
set xrange [0 : XRANGE]
set yrange [0 : YRANGE]
set style line 1 lw 1
unset key
set dgrid3d 45,45
set hidden3d
splot "data.data" u 1:2:3
The resulting image looks something like this
Note: I have converted to jpg so the quality is lower, and I have placed a border around the image.
A great deal of space is wasted above and below. This is not a problem until I embed the image into a LaTex document, at which point it will look like so (again, pdf document converted to jpg image)
The image on the right is also created with GnuPlot, but it is slightly larger (as is evident by looking at the border I have drawn around the top two images). The reason for this is because GnuPlot pads the 3D plot with top and bottom white space. How can I remove this without having to manually edit all 50+ plots I have?
There are two solutions to this, one is unreliable, the other is a hack.
Using GnuPlot, the margin settings can be used to specify distances from the appropriate margins. For example, setting lmargin 0 and bmargin 0 essentially pushes the axes off the page. Similar values can be assigned to the tmargin and rmargin to stretch the graph. Although this worked for 2D graphs, it did not work for 3D graphs (I suspect this has to do with the fact that I set the graph to be a square).
When graphs are set to be of square size, Gnuplot still calculates for the entire screen. The eps file can be manipulated directly to change this by looking for a line like so %%BoundingBox: 50 50 410 302 and changing 410 to something smaller. Alternatively, and this is what I did, you can run eps2eps in.eps out.eps and it will crop it for you. Just make sure in.eps is not the same file as out.eps or it won't work.
I also crop the Bounding Box afterwards, since I hate playing around with margins in gnuplot. I realized that somehow, eps2eps indeed does adjust the bounding box, but it also transforms text (labels etc) into pixel-graphic?!
I usually use "epstool" which conserves text as text when croping the bb, the command I use is:
epstool --copy --bbox in.eps out.eps
Use the <scale> argument in set view, this will magnify the plot without changing text size or title position.
In your case, because you use the map view, you need:
set view 180,0,1.5
where 180,0 is equivalent to map view and 1.5 is the scaling factor.