【发布时间】:2012-12-07 19:12:39
【问题描述】:
我正在 Gnuplot 中制作一些 3D 曲面图,在我的图的每个边界上都有标记非常有用。在随附的示例图中,左上角或右上角水平边界(边界 256 和 512)上没有 tic 标记。为了在后面的垂直平面上绘制垂直网格线,我需要在这些边界上有记号。我怎样才能做到这一点?
【问题讨论】:
标签: gnuplot
我正在 Gnuplot 中制作一些 3D 曲面图,在我的图的每个边界上都有标记非常有用。在随附的示例图中,左上角或右上角水平边界(边界 256 和 512)上没有 tic 标记。为了在后面的垂直平面上绘制垂直网格线,我需要在这些边界上有记号。我怎样才能做到这一点?
【问题讨论】:
标签: gnuplot
我还没有找到使用grid 和border 解决此问题的方法。但是,有一个相对简单的解决方法,它仅在您每次绘制数据时不更改范围时才有用。
基本上,您在后墙上绘制一个与 x-y 平面中网格线的线型、数量和位置相匹配的恒定曲面。
首先,设置范围。我标记了它们,因为我们稍后会需要这些数字。
xmin=0 ; xmax = 100
ymin=0.01 ; ymax=1000
zmin=0 ; zmax=990
set xrange [xmin:xmax]
set yrange [ymin:ymax]
set zrange [zmin:zmax]
设置 z 轴与 x-y 平面 (ticslevel) 的交点,我猜了一个视角以在视觉上与您的示例相匹配。我们想在multiplot之前设置这些。
set ticslevel 0.0
set view 60,45,1
现在乐趣来了。对于这部分,您必须知道 x-y 平面中的网格线数(与 x 和 y 轴上的主要抽动数相同)。我们将首先绘制后网格墙,因此它们最后位于您的数据/函数后面。另外,我关闭了这部分的网格和边框,但如果你把它们留在里面,它们应该完全重叠。
set multiplot
unset grid
set border 0
即使 y 轴具有对数刻度,网格也是线性分隔的(等距网格线)。所以此时我想要y轴上的线性比例。 (如果你在此之前set logscale y,请将其注释掉。)我不想要y轴上的线性标签,因为它们在对数刻度上是不同的,所以我相应地设置了格式。
set format y ""
set isosamples 6,9 # - set this to number of tics on y-axis,z-axis
这是在不同范围内绘图时唯一可能更改的手动设置。您需要将isosamples的数字设置为y轴,z轴上的抽动数。
为了控制 gnuplot 为每个表面使用多少行,我们需要设置 isosamples(在上面完成)和虚拟变量的范围u,v。注意线类型 0,它是网格线类型。
我在 x = xmin 处绘制我的第一面墙:
set parametric
set urange [ymax:ymin]
set vrange [zmax:zmin]
splot xmin,u,v w lines lt 0
同样,我们在 y = ymax 处做另一面墙。
set urange [xmin:xmax]
set vrange [zmin:zmax]
splot u,ymax,v w lines lt 0
unset parametric
现在我有了墙,我可以绘制图片中已有的内容。设置边框,抽动,重新启用我们之前禁用的 y 轴标签,设置 y 轴上的对数刻度(现在是个好时机)并将 isosamples 重置为默认值。
set xtics mirror
set ytics mirror
set ztics mirror
set grid ytics xtics back
set logscale y
set format y " %g"
set isosamples 10,10
并按照您的习惯绘制数据/函数。
splot 'data.txt' w lines
unset multiplot
我们已经完成了......
可能的必要修改:
我猜你的 x 轴和 y 轴会和我的不同,因为通过 view 60,135,1 之类的东西很容易实现相反的结果。不过,这也会切换 x 和 y。然后你的表面会改变坐标。
【讨论】:
您可以使用x2tics 和y2tics 在此处尝试设置抽动。
这是Xtics的文档。
【讨论】: