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

如何用gnuplot从二进制文件绘制极坐标2D热图?

方案1:用gnuplot插值将散乱点转为网格(支持管道输入)

利用gnuplot的dgrid3d命令对散乱点进行插值,生成结构化网格后再绘制pm3d热图,完全支持管道传入二进制数据。

步骤:

  1. 编写gnuplot命令(或直接在终端输入):
set terminal qt  # 替换为你需要的终端,如png、svg
set pm3d map     # 转为2D热图模式,隐藏Z轴
set dgrid3d 50,50 qnorm 2  # 生成50×50网格,二次插值(qnorm控制权重)
# 从标准输入读取二进制数据,格式为连续的3个float(X,Y,Z)
splot '-' binary format="%f%f%f" with pm3d
  1. 管道传入数据(假设C程序编译为gen_data):
./gen_data | gnuplot -p

可选优化:

  • 若需要极坐标坐标轴,添加:
    set polar
    set xrange [-1:1]
    set yrange [-1:1]
    set grid polar
    
  • 调整dgrid3d的分辨率(如100,100)可提升热图精细度,但会增加计算时间。

方案2:修改C程序,输出结构化网格数据(高效无插值)

如果数据可以按规则极坐标网格采样(固定半径和角度步长),直接输出结构化网格数据更高效,无需插值。

修改后的C程序:

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[]) {
    const int r_steps = 20;    // 半径方向采样数
    const int theta_steps = 50; // 角度方向采样数

    // 按角度扫描线输出:每一行对应一个固定角度,包含所有半径的点
    for(int t = 0; t < theta_steps; t++) {
        float theta = t * 2 * M_PI / theta_steps;
        for(int r = 0; r < r_steps; r++) {
            float r_val = (float)r / (r_steps - 1); // 半径从0到1
            float x = r_val * cos(theta);
            float y = r_val * sin(theta);
            float z = r_val * r_val;
            // 依次写入X、Y、Z
            fwrite(&x, sizeof(float), 1, stdout);
            fwrite(&y, sizeof(float), 1, stdout);
            fwrite(&z, sizeof(float), 1, stdout);
        }
    }
    return 0;
}

对应的gnuplot命令:

set terminal qt
set pm3d map
# 指定数据结构:每行r_steps个点,共theta_steps行,每个点3个float
splot '-' binary record=(20):(50):(3) format="%f%f%f" with pm3d

管道运行:

./gen_structured_data | gnuplot -p

内容的提问来源于stack exchange,提问作者unknownperson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:27:23