能否用Gnuplot绘制带x、y坐标点的区域密度热力图?
当然可以!Gnuplot完全能实现你要的特定区域点密度热力图效果,我来给你拆解几种实用的方法,附带可直接运行的示例代码。
方法一:使用
pm3d结合核密度估计(KDE) 这是最常用的方式,通过核密度估计自动计算点的分布密度,生成平滑的热力图效果,适合展示连续的密度变化。
假设你的坐标数据存在points.dat文件中(每行是一个点的x、y值),可以用这段代码:
# 设置输出终端和文件 set terminal pngcairo enhanced font 'Arial,10' size 800,600 set output 'density_heatmap.png' # 图表基础设置 set title 'Point Density Heatmap (KDE)' set xlabel 'X Coordinate' set ylabel 'Y Coordinate' # 开启pm3d伪彩色映射,启用插值让画面更平滑 set pm3d map interpolate 2,2 set palette defined (0 "dark-blue", 1 "blue", 2 "cyan", 3 "green", 4 "yellow", 5 "orange", 6 "red") # 限定你需要的特定区域(替换成你的x、y范围) set xrange [0:10] set yrange [0:10] # 用smooth kdensity计算密度,bandwidth控制平滑程度(值越小越精细) plot 'points.dat' using 1:2:(1) smooth kdensity bandwidth 0.4 with pm3d title 'Density'
bandwidth:控制密度估计的平滑度,数值越小,热力图越能体现局部密集点;数值越大,整体趋势越明显。interpolate 2,2:对生成的密度网格进行插值,让热力图的颜色过渡更自然。
方法二:手动分箱统计密度
如果需要更精确的“格子计数”效果(比如统计每个小方格内的点数量),可以用分箱的方式手动计算密度:
set terminal pngcairo enhanced font 'Arial,10' size 800,600 set output 'binned_density.png' set title 'Binned Point Density Heatmap' set xlabel 'X Coordinate' set ylabel 'Y Coordinate' set pm3d map set palette rgbformulae 33,13,10 # 用内置的蓝-红配色 # 设置分箱的大小(根据你的数据尺度调整) bin_width_x = 0.5 bin_width_y = 0.5 # 限定目标区域 set xrange [0:10] set yrange [0:10] # 分箱统计每个格子的点数,smooth frequency自动累加计数 plot 'points.dat' using \ (bin_width_x * floor($1/bin_width_x) + bin_width_x/2): \ (bin_width_y * floor($2/bin_width_y) + bin_width_y/2): \ (1) smooth frequency with pm3d title 'Points per Bin'
这个方法会把你指定的区域分成一个个小方格,每个方格的颜色深度对应其中的点数量,适合需要量化统计的场景。
额外实用技巧
- 添加颜色刻度条:
set colorbox vertical right outside,让观众能直观对应颜色和密度值。 - 调整坐标轴范围:如果只需要展示特定子区域,直接修改
xrange和yrange即可,Gnuplot会自动忽略范围外的点。 - 自定义配色:除了内置配色,你可以用
set palette defined完全自定义颜色梯度,比如set palette defined (0 "white", 1 "lightyellow", 2 "orange", 3 "darkred")。
内容的提问来源于stack exchange,提问作者Abhishek Mitra
相关产品推荐
相关产品推荐

