gnuplot:如何在3D绘图中使xy,xz和yz平面不透明/固定?

时间:2013-08-26 23:04:38

标签: 3d gnuplot

我最近选择了GNUplot,并使用“矩阵”数据格式绘制了一些3D数据集。在我在网上发现的一些命令文件的混搭之后,它运行得很好,但我还没有找到关于如何执行以下操作的任何内容:

我想将我的数据绘制为一个3D表面,其中xy平面中的实体/不透明表面位于z最小值,xz和yz平面位于x和y数据限制。例如,我的情节目前看起来像这样:

http://audio.claub.net/temp/waterfall__plot_normalized_to_on-axis.JPG

我希望它有不透明的平面,如下图所示:

http://www.musicanddesign.com/images/NOTE_Polar_surface_SE_Datadata.gif

(很抱歉没有发布实际图片,但我对这个论坛太新了,还没有那个特权)。

我猜我需要手动将平面添加为具有自己的矩阵数据结构的额外3D表面,但我不知道该怎么做。

我目前正在使用以下命令绘制数据:

reset
set xrange [100:20000]
#set yrange [-60:60]
#set zrange [-25:3]
set logscale x
set cntrparam levels increment GPVAL_DATA_Z_MAX-2,-2,-30
# GPVAL_DATA_Z_MAX above contains the max z value in the data set
set surface
set contour surface
set style data lines
set ticslevel 0
set xlabel 'frequency  [Hz]' #offset 0,2.25
set xtics add ("200" 200,"500" 500,"2000" 2000,"5000" 5000,"20000" 20000)
set mytics 4
set ylabel "angle\n[deg]" offset -12,0
set view 60,20
set clabel
set tics out
set key at 120000,-20 noautotitle title "SPL level"
set hidden3d offset 3
set isosamples 200,100
splot 'data.dat' nonuniform matrix using 2:1:3 lt 9

有人可以建议我如何在情节中生成不透明的表面吗?

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:4)

以下是绘制这些平面的方法(首先是代码和结果,然后是解释):

reset
set terminal pngcairo size 1000,800
set output 'test.png'
set xrange [100:20000]
set logscale x
set cntrparam levels increment -2,-2,-30

set contour surface
set style data lines
set ticslevel 0
set xlabel 'frequency (in Hz)' #offset 0,2.25
set xtics add ("200" 200,"500" 500,"2000" 2000,"5000" 5000,"20000" 20000)
set mytics 4
set ylabel "angle (in deg)" rotate parallel
set view 60,20
set tics out
set key at screen 0.94, screen 0.5 noautotitle title "SPL level"
set hidden3d offset 3

splot 'data.dat' nonuniform matrix using 2:1:3 lt 9, \
      '' nonuniform matrix using 2:(-60):($1 == -60 ? $3-0.02 : ($1 == -50 ? -40 : 1/0)) lt -3 nocontour,\
      '' nonuniform matrix using (20000):1:(($2 > 18500 && $2 < 20000) ? -40 : ($2 == 20000 ? $3-0.02 : 1/0)) lt -3 nocontour

这给出了:

enter image description here

要创建xz - 平面(splot命令中的第2行),我执行了以下操作:

  • 如果y值等于第一个值(-60),则使用z - 文件的值(仅-0.02}对于化妆品,只需删除它,看看差异)。如果y - 值等于第二个值(-50),则z - 值将设置为最小值(-40)。对于表面的所有其他点1/0,它会生成未跳过的未定义数据点。

  • lt -3表示不会绘制任何曲面线。

  • nocontour省略了此平面的轮廓

相应地生成yz - 平面,但现在必须检查x - 值。这假定您知道数据文件的限制和增量。我没有,或者如果这些经常变化,则需要更多的欺骗。

正如您可能已经注意到的,我还更改了文件的其他部分:

  • GPVAL_DATA_Z_MAX仅在绘图后可用,因此您无法使用它来设置增量。 (仅当您在没有reset的情况下调用脚本两次时)。您可以使用stats命令提取最小和最大数据值。

  • 您可以使用screen坐标定位key

  • ylabel可以与rotate parallel平行于轴定位。

编辑:如何在平面上添加具有相同颜色的轮廓线

以下是代码:

reset
set terminal pngcairo size 1000,800
set output 'test.png'
set xrange [100:20000]

# added following block:
set yrange [-60:60]
set zrange [-40:5]
set lmargin screen 0.2
set tmargin screen 0.8
set rmargin screen 0.8
set bmargin screen 0.2

set logscale x
set cntrparam levels increment -2,-2,-30

set contour surface
set style data lines
set ticslevel 0
set xlabel 'frequency (in Hz)' #offset 0,2.25
set xtics add ("200" 200,"500" 500,"2000" 2000,"5000" 5000,"20000" 20000)
set mytics 4
set ylabel "angle (in deg)" rotate parallel
set view 60,20
set tics out
unset key

set hidden3d nooffset
set multiplot
splot 'data.dat' nonuniform matrix using 2:1:3 lt 9,\
      '' nonuniform matrix using 2:(-60):($1 == -60 ? $3-0.02 : ($1 == -50 ? -40 : 1/0)) lt -3 nocontour, \
      '' nonuniform matrix using (20000):1:(($2 > 18500 && $2 < 20000) ? -40 : ($2 == 20000 ? $3-0.02 : 1/0)) lt -3 nocontour

unset tics
unset xlabel
unset ylabel
unset border

unset surface
unset hidden3d
splot 'data.dat' nonuniform matrix using 2:(-60):($1 == -60 ? $3-0.02 : ($1 == -50 ? -40 : 1/0)) lt 9,\
      '' nonuniform matrix using (20000):1:(($2 > 18500 && $2 < 20000) ? -40 : ($2 == 20000 ? $3-0.02 : 1/0)) lt 9
unset multiplot

给出:

enter image description here

与第一个例子相比,我做了以下添加:

  • 我添加了明确的边距并设置了手动yrangezrange。这是必需的,因为在splot模式下使用第二个multiplot命令绘制平面的轮廓线,但在取消设置边框,抽搐和标签后(否则由于不同的抗锯齿,绘图可能会锁定锯齿状) )。

  • 仅绘制平面的轮廓。在绘制它们之前我需要unset surface,因为轮廓线类型是相对于曲面线类型的。所以我需要使用lt 9,但不希望绘制表面本身。

答案 1 :(得分:0)

尝试按

更改最后一行
set pm3d
splot 'data.dat' nonuniform matrix using 2:1:3 lt 9 with pm3d at s

更改颜色添加

set palette rgbformulae 33,13,10
在splot之前

答案 2 :(得分:0)

感谢Christoph的精彩回答,我现在能够看到如何将“边”添加到绘图中,以便结果看起来像3D对象。

我修改了一些命令。既然我可以添加边,那么也可以使轮廓线从z轴上穿过“侧面”并且遇到表面的下降边缘。这样做意味着我不需要键,因为观察者可以从z轴交叉点读取线的位置。我正在使用的代码以及到结果图的链接如下所示。我希望所有网格表面都是相同的颜色,并且轮廓线必须在表面和侧面具有相同的颜色。如果我使用多色countour线,每张脸上的颜色总是不同的。所以我想出了这种方法,它只对所有等高线使用一种颜色,但这应该可以满足我的需要。

以下是代码:

reset
set terminal pngcairo size 1000,800 #I use a ported windows version, so I use the win term
set output 'test.png'
set xrange [100:20000]
set logscale x
set cntrparam levels increment 0,-5,-40
set contour surface
set style data lines
set ticslevel 0
set xlabel 'frequency (in Hz)' #offset 0,2.25
set xtics add ("200" 200,"500" 500,"2000" 2000,"5000" 5000,"20000" 20000)
set mytics 4
set ylabel "angle (in deg)"
set view 60,20
set tics out
unset key
unset clabel
set hidden3d offset 3
splot 'test.dat' nonuniform matrix using 2:1:3 w l lt 1 lc rgb "#3D59AB", \
      '' nonuniform matrix using 2:(-60):($1 == -60 ? $3-0.02 : ($1 == -50 ? -40 : 1/0)) w l lt 1 lc rgb "#3D59AB" ,\
      '' nonuniform matrix using 2:(60):($1 == 60 ? $3-0.02 : ($1 == 50 ? -40 : 1/0)) w l lt 1 lc rgb "#3D59AB" ,\
      '' nonuniform matrix using (20000):1:(($2 > 18500 && $2 < 20000) ? -40 : ($2 == 20000 ? $3-0.02 : 1/0)) lt -999 

最后,这是结果图:

enter image description here

相关问题