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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:48:03