我想把我用笛卡尔坐标在3D中绘制的图作为曲面,并在极坐标下将其视为2D热图。这样做的原因是我正在获取该坐标系中某个系统的数据。我只找到了一些相关的例子,但我在尝试让它与我的数据一起工作时遇到了困难。我目前使用的是矩阵格式,如果这有助于图表的工作,我可以重新格式化数据集。
数据是在扬声器上进行的SPL测量。麦克风放置在固定距离(例如,固定半径)处,并且在整个扬声器水平方向上每10度测量一次。SPL测量值是频率的函数,从20 to到20 20Hz。
我想使用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和直接从上面查看(设置视图0.0),在3D中将我的极地数据绘制为heatmap+contour线。如果我首先将现有的极坐标数据转换为笛卡尔坐标,我可能会得到类似于此网页中所示的内容:how to create a 3d polar graph with gnuplot我也可以从上面看到它,但我想添加极坐标网格,并具有角度和半径的标签。我是否必须手动执行此操作,或者是否可以使用multiplot来覆盖从0.0查看的2D网格和3D绘图?
我不确定如何处理这一点。任何关于采取什么方向的建议都将不胜感激。
-Charlie
发布于 2013-09-14 03:45:07
image
绘图仅适用于均匀分布的矩形网格,就像排列任何位图图像一样。否则,您必须将splot
与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-14 11:18:05
我拿了Christoph发布的命令文件,并试着让它满足我的需要,除了标签,我仍然有问题。图看起来像这样:
为了得到这个结果,我必须重新计算我的测量数据的坐标,将它们从极坐标系统(frequency=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度,因此只有该扇区填充极地图。其他角度数据可用于填充绘图。
如果我能得到一些标签方面的帮助,我可以称之为“完成”。我还需要让angle的标签起作用。关于如何标记极性r轴tics的意见也将非常受欢迎。
https://stackoverflow.com/questions/18792461
复制相似问题