4

我最近拿起了 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

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

感谢您对此的任何帮助。

.

4

3 回答 3

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

这给出了:

在此处输入图像描述

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

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

  • lt -3意味着没有绘制表面线。

  • nocontour省略此平面的轮廓

相应地生成-plane 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

这使:

在此处输入图像描述

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

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

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

于 2013-08-27T09:06:28.513 回答
1

感谢 Christoph 的出色回答,我现在可以看到如何将“边”添加到绘图中,以使结果看起来像 3D 对象。

我稍微修改了命令。现在我可以添加边了,最好让等高线从 z 轴抽动穿过“边”并与曲面的下降边缘相交。这样做意味着我不需要密钥,因为查看器可以从其 z 轴交点读取线的位置。下面给出了我正在使用的代码以及指向结果图的链接。我希望所有网格表面都是相同的颜色,并且轮廓线在表面和侧面必须具有相同的颜色。如果我使用多色计数线,每张脸上的颜色总是不同的。所以我想出了这种方法,它只对所有轮廓线使用一种颜色,但这应该可以满足我的需要。

这是代码:

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 

.

最后,这是结果图:

在此处输入图像描述

于 2013-08-27T18:00:07.523 回答
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 之前

于 2013-08-26T23:35:34.063 回答