如何在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
相关产品推荐
相关产品推荐

