gnuplot 2D极坐标图与3D数据集的热图 - 可能吗?

时间:2013-09-13 17:58:58

标签: gnuplot heatmap

我想使用笛卡尔坐标拍摄我在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 当我尝试使用极坐标进行最终2D绘图时,我收到一条错误消息,即极坐标图不支持“with image”选项。有人可以尝试这个或确认一下吗?

我已经能够使用直接在上面的splot和view(设置视图0.0)将我的极地数据绘制为3D中的热图+等高线。如果我首先将现有的极坐标数据转换为笛卡尔坐标,我可能会得到类似于此网页中显示的内容: how to create a 3d polar graph with gnuplot 我也可以从上面看到这个,但我想在极坐标网格中添加并且有角度和半径的标签。我是否必须手动执行此操作,还是可以使用多重绘图覆盖2D网格和从0.0开始查看的3D绘图?

我不知道如何处理这个问题。任何关于采取何种方向的建议都将受到赞赏。

-Charlie

2 个答案:

答案 0 :(得分:10)

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

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

结果是:

enter image description here

现在有一些关于一些技巧的细节:

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

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

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

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

  • 绘图NaN仅绘制网格

答案 1 :(得分:4)

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

limited angle polar plot with contours and pm3d surface

为了得到这个结果,我不得不重新计算测量数据的坐标,将它们从极坐标系(频率= r,θ=离轴角度,z = SPL)改为笛卡尔坐标系(x) ,Y,Z)。与此同时,我修改了极地网格的呈现方式。虽然我想要一个对数极坐标r轴,但是必须将笛卡尔坐标用于pm3d数据,所以我在使用它之前记录了r数据来计算x,y,z坐标。此外,我知道极坐标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轴抽动的输入。