7

我想使用笛卡尔坐标绘制一个我在 3D 中作为曲面绘制的图,并将其作为 POLAR 坐标中的 2D 热图查看。这样做的原因是我正在获取该坐标系中系统的数据。我只找到了一些相关的例子,但在试图让它与我的数据一起工作时遇到了困难。我目前正在使用矩阵格式,如果这有助于图表正常工作,我可以重新格式化数据集。

数据是在扬声器上进行的 SPL 测量。麦克风位于固定距离(例如固定半径)处,并且在水平方向围绕整个扬声器每隔 10 度进行一次测量。SPL 测量值是 20Hz 至 20kHz 频率的函数。

我想使用 gnuplot 创建一个 2D 极坐标图。频率将被绘制为半径,扬声器周围的角度将是角度,“高度”将是 SPL 级别。这应该生成一个表面,但是,我想创建一个热图 pm3d,然后从上方(例如视图 0,0)或作为 2D 图查看它。我还需要添加显示 SPL 间隔的等高线并将其叠加在热图上。

我在这里找到了与笛卡尔坐标类似的东西:http: //gnuplot-tricks.blogspot.com/2009/07/maps-contour-plots-with-labels.html 当我尝试使用极坐标制作最终二维图的这种方法时,我收到一条错误消息,指出极坐标图不支持“带图像”选项。有人可以试试这个或确认这个吗?

我已经能够使用 splot 将我的极坐标数据绘制为 3D 中的热图 + 轮廓线,并从正上方查看(设置视图 0.0)。如果我首先将现有的极坐标数据转换为笛卡尔坐标,我可能会得到类似于此网页中显示的内容: 如何使用 gnuplot 创建 3d 极坐标图 我也可以从上面查看,但我想添加在极坐标网格中,并有角度和半径的标签。我是否必须手动执行此操作,还是可以使用 multiplot 覆盖 2D 网格和从 0.0 查看的 3D 图?

我不知道如何解决这个问题。任何关于采取什么方向的建议将不胜感激。

-查理

4

2 回答 2

10

绘图仅适用于均匀分布的image矩形网格,就像排列任何位图图像一样。否则,您必须使用splotwith pm3d

set grid polar作品仅适用于 2D,因此您必须使用multiplot极坐标网格覆盖热图。这是一个非常冗长的示例,向您展示它是如何工作的:

reset
set terminal pngcairo size 800,800
set output '3d-polar.png'

set lmargin at screen 0.05
set rmargin at screen 0.85
set bmargin at screen 0.1
set tmargin at screen 0.9

set pm3d map
unset key

set multiplot

# plot the heatmap
set parametric
set isosamples 500

unset border
unset xtics
unset ytics

set angles degree
r = 6
set urange[0:r] # radius
set vrange[0:360] # angle
set xrange[-r:r]
set yrange[-r:r]
set colorbox user origin 0.9,0.1 size 0.03,0.8
splot u*cos(v), u*sin(v), (cos(v)*besj0(2*u))**2

# now plot the polar grid only
set style line 11 lc rgb 'white' lw 2
set grid polar ls 11
set polar
set rrange[0:r]
unset raxis
set rtics format '' scale 0
unset parametric
set for [i=0:330:30] label at first (r+0.35)*cos(i), first (r+0.35)*sin(i)\
center sprintf('%d', i)
plot NaN w l
unset multiplot

结果是:

在此处输入图像描述

现在一些技巧的一些细节:

  • 为了获得正方形大小,您不能使用set size ratio 1,因为 2D 和 3D 绘图的边距不同,即使您指定了一些绝对边距。因此,我设置了一个方形画布大小(终端选项size 800,800),并设置了适当的绝对边距。

  • 你不能unset rtics,因为那样网格就会消失。

  • 必须手动设置网格标签。

  • 颜色框也是手动设置的,否则它会与0标签重叠。

  • 绘图NaN只绘制网格

于 2013-09-13T19:45:06.830 回答
4

我拿了 Christoph 发布的命令文件并玩了一下,并设法让它满足我的需要,除了标签,我仍然遇到问题。情节是这样的:

具有轮廓和 pm3d 表面的有限角度极坐标图

为了得到这个结果,我不得不重新计算我的测量数据的坐标,将它们从极坐标系(频率=r,theta=离轴角,z=SPL)更改为笛卡尔坐标系(x,y, z)。同时我修改了极坐标网格的呈现方式。虽然我想要一个对数极坐标 r 轴,但笛卡尔坐标必须用于 pm3d 数据,所以我在使用 r 数据计算 x,y,z 坐标之前先取了 r 数据的对数。另外,我知道极坐标对数 r 轴刻度的最小值为 10,当使用对数刻度极坐标网格时,这似乎设置为等于图的中心。为了使网格和表面数据正确排列,我从 r 值中减去 log10(10),然后使用它们来计算用于 pm3d 地图的笛卡尔坐标。所以总的来说,我使用的方程是

r = log10( frequency ) - 1
x = r cos( theta )
y = r sin( theta )
z = SPL

然后我使用以下命令文件来绘制数据:

reset 
set terminal pngcairo size 800,800 
set output '3d-polar.png'
set lmargin at screen 0.05
set rmargin at screen 0.85
set bmargin at screen 0.1
set tmargin at screen 0.9
set pm3d map interpolate 20,20
unset key
set multiplot

# plot the heatmap

set cntrparam levels increment 3,-3, -24
set contour surface
set palette rgb 33,13,10 #rainbow (blue-green-yellow-red)
set cbrange [-18:0]
unset border
unset xtics
unset ytics
set angles degree
r = 3.31
set xrange[-r:r]
set yrange[-r:r]
set colorbox user origin 0.9,0.1 size 0.03,0.8
splot 'new_test.dat' using 1:2:3

# now plot the polar grid only
set style line 11 lc rgb 'black' lw 1 lt 0
set grid polar ls 11
set polar
set logscale r 10
set rrange[10:20000]
unset raxis
set rtics format '' scale 0
set rtics (10,20,100,200,1000,2000,10000,20000)
#unset parametric
#set for [i=0:330:30] label at first (r+0.35)*cos(i), first (r+0.35)*sin(i) \
#center sprintf('%d', i)

plot NaN w l

unset multiplot
unset output

用于生成绘图的数据仅跨越 +/- 30 度,因此只有该扇区填充极坐标图。额外的角度数据可用于填充绘图。

如果我能得到一些关于标签的帮助,我可以称之为“完成”。我仍然需要获得角度工作的标签。关于如何标记极地 r 轴抽动的输入,这也是非常受欢迎的。

于 2013-09-14T03:18:05.230 回答