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



我有麻烦与seaborn JointGrid和plot_joint函数。我有多个散点图,我正在对它们进行线性回归,我有一个图例,但是当我试图用每条线的平方值注释该图时,它似乎不起作用。相反,它改变了第一个散点图的颜色。

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

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.a notate代码行时,我希望在图上注释R^2值,但它改变了散点图分布的颜色。我不知道发生了什么事,任何帮助都会非常感激!

欢呼。

这是一个老问题,但解决这个问题的关键是访问轴,它们是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))
...

相关内容

  • 没有找到相关文章

最新更新