如何使用Seaborn绘制以第三维度平均值着色的2D分布图?
Seaborn实现2D分箱Z均值热力图方案
你需要的是基于X/Y维度分箱、每个分箱颜色对应箱内Z值均值的2D方格图,可通过以下两种方式实现:
方法1:直接用histplot快速实现(代码最简)
该方法直接利用seaborn histplot的权重参数和均值统计能力,输出和示例效果完全一致的连续坐标方格图:
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设data为n行3列的三维数据矩阵,三列分别对应X、Y、Z维度取值 df = pd.DataFrame(data, columns=['x', 'y', 'z']) sns.set_theme() ax = sns.histplot( data=df, x='x', y='y', weights='z', stat='mean', # 统计指标设为分箱内Z的平均值 bins=20, # 可自定义分箱数量,也支持传入二元列表分别设置X、Y的分箱数 cmap='viridis' # 自定义颜色映射方案 ) # 增加颜色条标注 plt.colorbar(ax.collections[0], label='Z维度平均值') plt.xlabel('X维度') plt.ylabel('Y维度') plt.show()
方法2:手动聚合后用heatmap绘制(自定义程度高)
如果需要自定义分箱逻辑、聚合规则,可先手动完成分箱和均值计算,再用heatmap绘制:
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame(data, columns=['x', 'y', 'z']) # 1. 对X、Y维度做分箱,分箱数可自定义调整 x_bins = pd.cut(df['x'], bins=20) y_bins = pd.cut(df['y'], bins=20) # 2. 分组计算每个分箱内的Z值平均值 z_mean_df = df.groupby([x_bins, y_bins])['z'].mean().reset_index() # 可选:空分箱填充默认值,例如填充0:z_mean_df['z'] = z_mean_df['z'].fillna(0) # 3. 转换为透视表适配heatmap输入格式 z_pivot = z_mean_df.pivot(index='y', columns='x', values='z') # 4. 绘制热力图 sns.set_theme() ax = sns.heatmap( z_pivot, cmap='viridis', cbar_kws={'label': 'Z维度平均值'}, xticklabels=2, # 调整标签密度避免重叠 yticklabels=2 ) # 优化轴标签为分箱区间左值,增强可读性 ax.set_xticklabels([f'{float(item.left):.1f}' for item in z_pivot.columns]) ax.set_yticklabels([f'{float(item.left):.1f}' for item in z_pivot.index]) plt.gca().invert_yaxis() # 反转Y轴匹配常规坐标系方向 plt.xlabel('X维度') plt.ylabel('Y维度') plt.show()
注意事项
- 可通过调整
bins参数控制方格的数量,数值越大方格越密,反之越疏 - 颜色映射
cmap可根据需求替换为seaborn支持的任意配色方案,比如RdBu_r、coolwarm等
内容的提问来源于stack exchange,提问作者bluesummers
相关产品推荐
相关产品推荐

