首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用3D数据集的热图的gnuplot 2D极地图-可能吗?

使用3D数据集的热图的gnuplot 2D极地图-可能吗?
EN

Stack Overflow用户
提问于 2013-09-14 01:58:58
回答 2查看 11.2K关注 0票数 7

我想把我用笛卡尔坐标在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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 03:45:07

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

set grid polar仅适用于2D,因此必须使用multiplot将热贴图与极轴栅格叠加。下面是一个很长的例子,向你展示它是如何工作的:

代码语言:javascript
运行
复制
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确实只绘制网格
票数 10
EN

Stack Overflow用户

发布于 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地图的笛卡尔坐标。所以总的来说,我使用的方程式是

代码语言:javascript
运行
复制
r = log10( frequency ) - 1
x = r cos( theta )
y = r sin( theta )
z = SPL

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

代码语言:javascript
运行
复制
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的意见也将非常受欢迎。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18792461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档