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

如何在Seaborn PairGrid中为热力图设置自定义分箱尺寸?

为PairGrid的对角线与非对角线分布设置自定义分箱

我会定期接收格式一致的数据,需要快速对比各变量的单变量分布及双变量分布。最初使用sns.pairplot,但散点图不符合需求:数据量时有波动,且数据范围不稳定。因此希望基于对变量的认知,为所有直方图设置统一的分箱尺寸。

已借助sns.PairGrid在对角线绘制了自定义分箱的直方图,但非对角线的联合分布遇到问题:传入绘图函数的只有x、y数据,无法获取对应的变量名,无法匹配预设的分箱参数。现有代码如下:

iris = sns.load_dataset("iris", cache=True)
col_list = ['petal_length', 'petal_width', 'sepal_length', 'sepal_width']
cols = iter(col_list)

bins = {'sepal_length' : 10, 'sepal_width' : 5,
    'petal_length' : 35, 'petal_width' : 12}

def myhist(x, **kwargs):
    b = bins[next(cols)]
    plt.hist(x, bins=b, **kwargs)

def pairgrid_heatmap(x, y, **kws):
    # how to retrieve correct bins here, given only x,y?

    cmap = sns.light_palette(kws.pop("color"), as_cmap=True)
    plt.hist2d(x, y, cmap=cmap, cmin=1, **kws)

g = sns.PairGrid(iris, vars=col_list)
g = g.map_diag(myhist)
g = g.map_offdiag(pairgrid_heatmap)
plt.show()

解决方法:通过坐标轴标签获取变量名

PairGrid每个子图的坐标轴标签就是对应的变量名,我们可以在pairgrid_heatmap函数中获取当前子图对象,读取x轴和y轴的标签,以此匹配预设的分箱字典。

修改后的完整代码:

import seaborn as sns
import matplotlib.pyplot as plt

iris = sns.load_dataset("iris", cache=True)
col_list = ['petal_length', 'petal_width', 'sepal_length', 'sepal_width']
cols = iter(col_list)

bins = {'sepal_length' : 10, 'sepal_width' : 5,
    'petal_length' : 35, 'petal_width' : 12}

def myhist(x, **kwargs):
    b = bins[next(cols)]
    plt.hist(x, bins=b, **kwargs)

def pairgrid_heatmap(x, y, **kws):
    # 获取当前子图对象
    ax = plt.gca()
    # 读取x轴和y轴对应的变量名
    x_var = ax.get_xlabel()
    y_var = ax.get_ylabel()
    # 匹配对应的分箱数
    x_bins = bins[x_var]
    y_bins = bins[y_var]
    
    cmap = sns.light_palette(kws.pop("color"), as_cmap=True)
    plt.hist2d(x, y, bins=[x_bins, y_bins], cmap=cmap, cmin=1, **kws)

g = sns.PairGrid(iris, vars=col_list)
g = g.map_diag(myhist)
g = g.map_offdiag(pairgrid_heatmap)
plt.show()

关键说明:

  • 通过plt.gca()获取当前正在绘制的子图对象
  • 利用ax.get_xlabel()和ax.get_ylabel()拿到对应的变量名,直接匹配bins字典中的分箱参数
  • 将分箱参数以[x_bins, y_bins]的形式传给plt.hist2d的bins参数,实现自定义联合分布分箱

内容的提问来源于stack exchange,提问作者user13132640

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:43:19