Currently, gnuplot does not permit the "set samples" parameter to determine the sampling of splot isolines when hidden3d is implemented. This strikes me as a limitation that could be overcome with some attention. It's quite alarming to apply "set hidden3d" and have a gorgeously rendered splot turn jagged. And it's disappointing to not be able to use the gorgeous higher sampling with the hidden3d option; I hate having to choose when I really want both! I'll be happy to tackle this will a little bit of help.
For example, the jaggedness in these plots (http://www.gnuplot.info/demo/hidden.html) could be alleviated if "set samples 100" affected them like they do when hidden3d is not set.
Ethan Merritt
2012-05-02
Do you mean "set isosamples"?
Douglas
2012-05-02
The problem is that if you set isosamples to a large value, you have too many plotted lines and the graph is indiscernible. What we want is something like
set hidden3d
set samples 100
set isosamples 10
splot exp(x**2/2.0) w l
to behave the same as if we hadn't set hidden3d. Right now, setting hidden3d samples with the same resolution as isosamples and results in a jagged plot. If isosamples is increased, the plot is smoother, but becomes unreadable.
Douglas
2012-05-02
Whoops, the splot function was meant to be splot exp(-(x**2+y**2)/2.0) w l
Ethan Merritt
2012-05-02
Okay, then "set isosamples 100,10".
Ethan Merritt
2012-05-02
Sorry, I don't understand what you're looking for. What's wrong with setting isosamples to the resolution you want? Yes, it draws a lot of lines. That's what you asked for. If you ask for a coarser sampling then you get a coarser sampling. Try setting the linewidth to 0.1 or less.
Douglas
2012-05-02
But that's the point. Without hidden3d, for instance, you plot
unset hidden3d
set samples 100, 100
set isosamples 10, 10
splot exp(-(x**2+y**2)/2.0) w l
This looks fine. We have 10 lines in each direction but the sampling resolution is high so they curve appropriately.
On the other hand
set hidden3d
set samples 100, 100
set isosamples 10, 10
splot exp(-(x**2+y**2)/2.0) w l
produces jagged lines and
set hidden3d
set samples 100, 100
set isosamples 100, 100
splot exp(-(x**2+y**2)/2.0) w l
draws too many lines. What I'm looking for are the curvy lines of the first script but with hidden3d working correctly. There must be a way to make that happen.
Ethan Merritt
2012-05-03
My Mileage Varies
I think this looks great:
set hidden3d
set isosamples 100,100
splot exp(-(x**2+y**2)/2.0) w l lw 0.1
The combination of "smooth lines but far apart" is not compatible with hidden3d, which is based on rectangles rather than lines. The only way to get a smooth surface tiled with rectangles is to have really small rectangles.
Douglas
2012-05-03
That looks good, but it would be unpublishable unless you could rely on an extremely high fidelity printer at the publisher.
I understand that the current implementation of hidden3d uses the isoline rectangles to do the job, but this seems like a limitation I could help gnuplot overcome. One solution that comes to mind: if nothing else, I would expect that isolines could be computed at the higher "set samples" resolution, but then only draw every tenth line, for instance, when "set samples" is a multiple of "set isosamples".
Douglas
2012-05-04
It's worth pointing out that the behavior I'm asking for is fairly common in other plotting packages. For instance, in Mathematica, the placement of a mesh (with proper line occlusion) is entirely separated from the interpolation of the function. See the second example: http://reference.wolfram.com/mathematica/ref/Mesh.html
Douglas
2012-05-04
Similarly, in matplotlib, the commands rstride and cstride do exactly what I'm suggesting: simply skip over isolines by a certain interval. Feel free to the try the ball example from here: http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html
Simply set rstride=10 and cstride=10, and you'll see that you get proper sampling of the function (curved mesh lines) even though not all the lines are shown (precisely one/tenth of the isolines are shown in each direction).