如何用Gnuplot绘制Matlab风格3D直方图并将零值设为白色
实现Gnuplot 3D直方图零值显示白色(Matlab风格)
刚好我之前也折腾过类似的需求,要让Gnuplot的3D直方图和Matlab一样,把零值柱子显示为白色,非零值用调色板配色。其实核心就是通过自定义调色板+条件颜色映射来实现,下面是具体的步骤和可复用的代码示例:
1. 基础绘图参数设置(贴近Matlab风格)
先把坐标轴、视角、填充样式这些调整成Matlab常用的样子:
# 终端设置(可选,换成你需要的输出格式,比如png/pdf) set terminal qt enhanced font "Arial,10" set title "3D Histogram (Matlab Style)" set xlabel "X Axis" set ylabel "Y Axis" set zlabel "Z Axis" set view 60,30 # 视角接近Matlab默认的3D直方图角度 set style fill solid 1.0 border -1 # 实心填充柱子,隐藏边框 set boxwidth 0.8 relative # 调整柱子宽度,避免过于拥挤 set grid ztics # 显示Z轴网格,和Matlab风格一致
2. 自定义调色板:零值映射为白色
这是最关键的一步,我们要让数值为0(或近似0)的点对应白色,非零值用Matlab常用的调色板(比如Jet或Parula)。
方式一:用set palette defined直接定义(适合固定配色)
如果想模拟Matlab的Jet调色板,代码如下:
# 定义调色板:0值为白色,非零值从Jet配色的蓝色开始映射 set palette defined (0 1 1 1, \ 0.0001 0 0 1, \ # 极小非零值对应Jet的蓝色 0.25 0 1 1, \ 0.5 0 1 0, \ 0.75 1 1 0, \ 1 1 0 0) # 最大值对应Jet的红色 set cbrange [0:*] # 颜色范围自动适配数据的最大值
如果喜欢Parula配色(Matlab新版本默认),可以用这个近似定义:
set palette defined (0 1 1 1, \ 0.0001 0.2081 0.1663 0.5292, \ 0.25 0.0260 0.5683 0.8965, \ 0.5 0.4967 0.8176 0.6207, \ 0.75 0.9763 0.8436 0.1334, \ 1 0.9764 0.4236 0.0539) set cbrange [0:*]
方式二:用rgbfunction动态映射(适合需要灵活调整的场景)
如果你的数据里有近似零值(比如1e-10这种极小值),可以用函数式调色板做更灵活的判断:
# 先获取数据的最大值,用于颜色归一化 stats 'your_data.txt' using 3 name 'data' # 假设数据是三列:x y z max_z = data_max # 自定义函数:小于1e-6的视为零,显示白色;否则按Parula风格映射 set palette rgbfunction(z) \ (z < 1e-6 ? 1 : 0.2 + 0.7*(z/max_z)), \ (z < 1e-6 ? 1 : 0.15 + 0.75*(z/max_z)^0.5), \ (z < 1e-6 ? 1 : 0.5 + 0.5*(1 - z/max_z)) set cbrange [0:max_z]
3. 绘制3D直方图
最后用splot命令绘制,关键是把z值同时作为高度和颜色的变量:
# using 1:2:3:3 分别对应x坐标、y坐标、柱子高度、颜色映射值 splot 'your_data.txt' using 1:2:3:3 with boxes lc palette notitle
关键注意点
- 如果你的零值不是精确的0,记得把调色板里的判断条件改成
z < 阈值(比如1e-6),避免极小值被错误上色 lc palette表示用调色板来控制柱子颜色,一定要加上这个参数- 可以根据自己的需求调整调色板的颜色节点,完全匹配Matlab的配色
内容的提问来源于stack exchange,提问作者armando
相关产品推荐
相关产品推荐

