You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    }
}

关于你疑惑的循环与重复打印:

  1. [j=0:5]和[j=5:0:-1]的作用
    这是早期用双曲线围成填充区域的写法:j=0:5按顺序画一条边,j=5:0:-1反向画另一条边,两条边形成闭合区域才能被填充。换成上面的filledcurves方法后,不需要反向循环,直接按顺序给出顶点即可。

  2. 重复打印第一个点的作用
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:37:53