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

Cha*_*lie 4 3d gnuplot

我最近选择了GNUplot,并正在使用“矩阵”数据格式绘制一些3D数据集。将我在网络上找到的一些命令文件混合在一起后,它运行良好,但是我没有找到有关如何执行以下操作的任何信息:

我想将我的数据绘制为3D表面,其中x / y数据限制的xy平面和xz和yz平面的实心/不透明表面在xy平面。例如,我的情节当前看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

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

感谢您对此的任何帮助。

Chr*_*oph 5

这是绘制这些平面的方法(首先是代码和结果,然后是说明):

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
Run Code Online (Sandbox Code Playgroud)

这给出:

在此处输入图片说明

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

  • 如果该y值等于第一个值(-60),则z使用文件的-value(-0.02仅用于化妆品,只需删除该值即可查看差异)。如果y-value等于第二个值(-50),则z-value设置为最小值(-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
Run Code Online (Sandbox Code Playgroud)

这使:

在此处输入图片说明

与第一个示例相比,我做了以下补充:

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

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