如何用gnuplot从二进制文件绘制极坐标2D热图?
方案1:用gnuplot插值将散乱点转为网格(支持管道输入)
利用gnuplot的dgrid3d命令对散乱点进行插值,生成结构化网格后再绘制pm3d热图,完全支持管道传入二进制数据。
步骤:
- 编写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
- 管道传入数据(假设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
相关产品推荐
相关产品推荐

