Seaborn JointGrid / plot_joint:多个散点图无法注释Rsquare

时间:2016-09-16 13:59:05

标签: plot seaborn annotate

我遇到了seaborn JointGrid和plot_joint函数的问题。我有多个散点图,我正在进行线性回归,我有一个传说,但是当我尝试用每行的rqsuare值注释图时,它似乎不起作用。相反,它会改变第一个散点图的颜色。

这是我的代码的缩短版本(我正在绘制x和z,并使用x_sections将数据拆分为4个我想要Rsquare的发行版):

import seaborn as sns
import numpy as np
import itertools
import matplotlib.pyplot as plt

palette = itertools.cycle(sns.color_palette())
legend_labels = ['a','b','c','d']
x_sections = np.array([[1,3],[5,6],[10,11],[18,19]])
x = np.arange(1,20,0.1) #e.g. of data
z = np.random.rand(np.size(x))*x #e.g. of data

min_x= np.searchsorted(x,x_sections[0][0])
max_x= np.searchsorted(x,x_sections[0][1])
g = sns.JointGrid(x[min_x:max_x],z[min_x:max_x],xlim=(0,20),ylim=(0,20))
g.plot_joint(plt.scatter,color=next(palette),label=legend_labels[0])
rsquare = lambda a, b: stats.pearsonr(a, b)[0] ** 2
#g.annotate(rsquare, template="{stat}: {val:.2f}",stat="$R^2$", loc="upper left")
g.plot(sns.regplot,sns.distplot)

for i in range(1,len(x_sections)):
    min_x= np.searchsorted(x,x_sections[i][0])
    max_x= np.searchsorted(x,x_sections[i][1])
    g.x = x[min_x:max_x]
    g.y = z[min_x:max_x]
    g.plot_joint(plt.scatter,color=next(palette),label=legend_labels[i])
    g.plot(sns.regplot,sns.distplot)
    #g.annotate(rsquare, template="{stat}: {val:.2f}",stat="$R^2$", loc="upper left")

 plt.legend()

此代码生成四个分布的图(非常难看,但仅仅是出于示例的目的)。当我取消注释g.annotate代码行时,我希望在绘图上注释R ^ 2值,但它会改变散点图分布的颜色。我不确定发生了什么,非常感谢任何帮助!

干杯。

1 个答案:

答案 0 :(得分:0)

这是一个老问题,但解决问题的关键是访问作为JointGrid成员的轴。

替换旧注释:

g.annotate(rsquare, template="{stat}: {val:.2f}",stat="$R^2$", loc="upper left")

使用新的:

g.ax_joint.text(xy=(1.0, 13.0), s="R^2: {:.2f}".format(
    rsquare(x[min_x:max_x],z[min_x:max_x])
))

但这要求您可以为文本指定适当的(x,y)坐标。使用g.ax_joint.annotation(...)也需要xy坐标。更优雅的方法可能是将r ^ 2值附加到循环中的轴标签上。

...
    r_2 = rsquare(x[min_x:max_x], z[min_x:max_x])
    g.plot_joint(plt.scatter, color=next(palette),
        label=legend_labels[i] + " : R^2 = {:.2f}".format(r_2))
...