我最近选择了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
有人可以建议我如何在情节中生成不透明的表面吗?
感谢您提供任何帮助。
答案 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
这给出了:
要创建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
给出:
与第一个例子相比,我做了以下添加:
我添加了明确的边距并设置了手动yrange
和zrange
。这是必需的,因为在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
最后,这是结果图: