我找到了一个计算相关系数的函数,然后将它添加到一对图(如下所示)。我的问题是当我运行带有色调的对图(分类变量)时,两组的相关系数显示在彼此之上。
这是我的图表代码(显示气候变化态度与峰值之间的相关系数,作为"海冰方向"相互叠加)的函数:
`g = sns.PairGrid(df, vars = ['OverallClimateChangeAttitude', 'Peak'],
hue="IV_SeaIceChangeDirection")
g.map_upper(plt.scatter, s=10)
g.map_diag(sns.distplot, kde=False)
g.map_lower(sns.kdeplot, cmap="Blues_d")
g.map_lower(corrfunc)`
以下是相关函数:
`def corrfunc(x, y, **kws):
r, _ = stats.pearsonr(x, y)
ax = plt.gca()
ax.annotate("r = {:.2f}".format(r),
xy=(.1, .9), xycoords=ax.transAxes)`
非常感谢任何帮助!
答案 0 :(得分:0)
问题在于,您的相关函数指定了应该放置注释的确切位置,并且此位置为(.1, .9)
- 两种色调都相同。您需要以某种方式为不同类别的数据选择不同的位置。我想到了两种方法:
hue
值的位置,并使用kws['label']
选择要采用的位置。有关这两个选项,请参阅下面的corrfunc
代码。我用其余的代码和一个示例数据集绘制了一个图。我还在注释中添加了标签文本,因为否则我无法确定哪个相关系数是哪个。
from scipy import stats
import seaborn as sns
import matplotlib
def corrfunc(x, y, **kws):
r, _ = stats.pearsonr(x, y)
ax = plt.gca()
# count how many annotations are already present
n = len([c for c in ax.get_children() if
isinstance(c, matplotlib.text.Annotation)])
pos = (.1, .9 - .1*n)
# or make positions for every label by hand
pos = (.1, .9) if kws['label'] == 'Yes' else (.1,.8)
ax.annotate("{}: r = {:.2f}".format(kws['label'],r),
xy=pos, xycoords=ax.transAxes)
tips = sns.load_dataset("tips")
g = sns.PairGrid(data = tips, vars = ['tip', 'total_bill'], hue="smoker", size=4)
g.map_upper(plt.scatter, s=10)
g.map_diag(sns.distplot, kde=False)
g.map_lower(sns.kdeplot, cmap="Blues_d")
g.map_lower(corrfunc)
g.add_legend()
结果: