如何在gnuplot中基于给定数据绘制极坐标热图?
解决Gnuplot极坐标热图(θ∈[0,π/3])的问题
一、核心思路:用多边形填充实现目标热图
你提到的曲线填充方法是可行的,针对θ范围[0, π/3](即60度)的场景,我们可以基于规则网格数据生成扇形多边形,逐个填充对应cm[]值的颜色,精准匹配需求范围。
二、完整代码与关键部分解释
先给出适配θ∈[0,π/3]的可运行代码,再拆解你看不懂的循环和重复打印逻辑:
# 基础绘图环境设置 set terminal pngcairo size 800,800 set output "polar_heatmap.png" set polar set angles degrees # 用角度更直观,换成radians的话对应π/3=60度 set grid polar 10 # 极坐标网格间隔10度 set xrange [0:1.2] # 只显示θ=0到60度的区域,更紧凑 set yrange [-0.7:1.2] set style fill solid 1.0 border 0 # 填充无边界,避免网格干扰 # 示例规则网格数据(替换成你的实际数据文件,格式:r theta cm) $data << EOD 0.2 0 0.1 0.2 15 0.3 0.2 30 0.5 0.2 45 0.7 0.2 60 0.9 0.4 0 0.2 0.4 15 0.4 0.4 30 0.6 0.4 45 0.8 0.4 60 1.0 0.6 0 0.15 0.6 15 0.35 0.6 30 0.55 0.6 45 0.75 0.6 60 0.95 0.8 0 0.25 0.8 15 0.45 0.8 30 0.65 0.8 45 0.85 0.8 60 1.0 1.0 0 0.3 1.0 15 0.5 1.0 30 0.7 1.0 45 0.9 1.0 60 1.0 EOD # 网格参数:r的数量Nr,θ的数量Ntheta(θ从0到60度,间隔15度共5个点) Nr = 5 Ntheta = 5 # 循环绘制每个扇形单元 do for [i=0:Nr-2] { do for [j=0:Ntheta-2] { # 获取当前扇形的四个顶点坐标 r1 = word($data[i*Ntheta + j + 1], 1) th1 = word($data[i*Ntheta + j + 1], 2) r2 = word($data[(i+1)*Ntheta + j + 1], 1) th2 = word($data[(i+1)*Ntheta + j + 1], 2) r3 = word($data[(i+1)*Ntheta + j + 2], 1) th3 = word($data[(i+1)*Ntheta + j + 2], 2) r4 = word($data[i*Ntheta + j + 2], 1) th4 = word($data[i*Ntheta + j + 2], 2) # 获取当前单元的cm值(可根据需求取顶点或中心点值) cm_val = word($data[i*Ntheta + j + 1], 3) # 自定义颜色映射 set palette defined (0 "#0000ff", 1 "#ff0000") set cbrange [0:1] # 绘制闭合扇形并填充颜色 plot '-' with filledcurves fillcolor palette z=cm_val notitle r1, th1 r2, th2 r3, th3 r4, th4 r1, th1 # 重复第一个点闭合多边形 e } }
关于你疑惑的循环与重复打印:
[j=0:5]和[j=5:0:-1]的作用
这是早期用双曲线围成填充区域的写法:j=0:5按顺序画一条边,j=5:0:-1反向画另一条边,两条边形成闭合区域才能被填充。换成上面的filledcurves方法后,不需要反向循环,直接按顺序给出顶点即可。重复打印第一个点的作用
Gnuplot的filledcurves要求路径必须闭合才能正确填充,最后重复第一个点是为了让扇形的首尾连接,形成封闭图形。
三、不规则原始数据的替代方案:dgrid3d+pm3d
如果你的原始数据是不规则的x/y/r/theta格式,可以用插值转成规则网格后直接绘制:
set terminal pngcairo size 800,800 set output "polar_heatmap_pm3d.png" set polar set angles degrees set xrange [0:1.2] set yrange [-0.7:1.2] set pm3d map # 平面映射模式 set palette defined (0 "#0000ff", 1 "#ff0000") set cbrange [0:1] # 用dgrid3d将不规则数据插值为20x20的规则极坐标网格 set dgrid3d 20,20 qnorm 2 # 加载原始数据文件,第4列r、第5列theta、第3列cm plot "raw_data.txt" using 4:5:3 with pm3d notitle
- 若原始数据已是规则网格,直接去掉
set dgrid3d即可。
内容的提问来源于stack exchange,提问作者Suntory
相关产品推荐
相关产品推荐

