我有一个用例,我会定期接收相同格式的数据,并希望快速比较每个变量的单独分布以及成对/双变量分布。我最初使用 sns.pairplot 开箱即用,但我意识到散点图不太适合我的应用程序:有时我有不同数量的数据,并且数据的边界总是不同的。因此,我想创建所有直方图,并根据我对变量的了解选择一致的箱大小。
我找到了一个很好的答案,它帮助我使用 sns.pairgird 沿着对角线和我想要的垃圾箱执行自定义直方图函数(https://stackoverflow.com/a/56387759)。现在我想对较低的联合分布执行相同的操作,但我不确定如何执行此操作,因为单个函数在不知道它对应于哪个变量的情况下获取数据。下面是基于上面链接的答案的示例代码。
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()
作为自定义函数的参数给出的
x
和 y
是 pandas Series,类似于数据框的一列。获取 x.name
将给出列名称。您可以使用该名称在 bins
字典中建立索引。
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris", cache=True)
col_list = ['petal_length', 'petal_width', 'sepal_length', 'sepal_width']
bins = {'sepal_length': 10, 'sepal_width': 5, 'petal_length': 35, 'petal_width': 12}
def myhist(x, **kwargs):
plt.hist(x, bins=bins[x.name], **kwargs)
def pairgrid_heatmap(x, y, **kws):
cmap = sns.light_palette(kws.pop("color"), as_cmap=True)
# retrieving the bins, given names of the x and y series
plt.hist2d(x, y, cmap=cmap, cmin=1, bins=[bins[x.name], bins[y.name]], **kws)
g = sns.PairGrid(iris, vars=col_list)
g = g.map_diag(myhist)
g = g.map_offdiag(pairgrid_heatmap)
plt.show()