python 散点图上的线性回归线

Linear regression line on a scatter plot in python

我正在尝试将线性回归线添加到我的散点图中,但我的数据存储方式 and/or 结构化让这项任务对我来说非常棘手。我设法使用“sns.scatterplot”用我的数据创建了一个散点图,但无法用“sns.regplot”复制它。

通过使用以下代码,我能够生成下图:

sns.set_theme(color_codes=True)

sns.scatterplot(x=100, y=dict_all_mv['dict_100'])
sns.scatterplot(x=90, y=dict_all_mv['dict_90'])
sns.scatterplot(x=80, y=dict_all_mv['dict_80'])
sns.scatterplot(x=60, y=dict_all_mv['dict_60'])
sns.scatterplot(x=40, y=dict_all_mv['dict_40'])
sns.scatterplot(x=20, y=dict_all_mv['dict_20'])

plt.show()

y轴显示的数据存储在嵌套字典中。其中一本词典的类型和印刷品显示如下:

print(type(dict_all_mv['dict_100']))
print(dict_all_mv['dict_100'])
<class 'dict'>
{'P1S1': 0.2825781935483871, 'P2S1': 0.1566529827586207, 'P3S1': 0.16534197660818717, 'P4S1': 0.2463573039215686, 'P5S1': 0.21233809917355378, 'P6S1': 0.2780758316831682, 'P7S1': 0.261270830357143, 'P8S1': 0.25920007258064504, 'P9S1': 0.17294190131578946, 'P10S1': 0.18588214503816788, 'P1S2': 0.1870260291970803, 'P2S2': 0.2059823125, 'P3S2': 0.17782266216216217, 'P4S2': 0.1835217697841726, 'P5S2': 0.21022608870967743, 'P6S2': 0.2695895306122449, 'P7S2': 0.2393472735042735, 'P8S2': 0.18402302247191013, 'P9S2': 0.17260260273972605, 'P10S2': 0.20730387826086952}

我想在 y 轴上绘制每个字典中存储的所有值,而 x 轴值对于 'dict_100' 的每个值等于 100,对于 'dict_90' 的每个值等于 90 , 80 for 'dict_80', 等等。我尝试了一些选项来使用 sns.regplot 和 lmplot 绘制线性回归线,但没有成功。这是我失败的尝试之一:

sns.regplot(x=100,y=dict_all_mv['dict_100'])
sns.regplot(x=90,y=dict_all_mv['dict_90'])
sns.regplot(x=80,y=dict_all_mv['dict_80'])

plt.show()

我收到此错误消息:

AttributeError: 'int' 对象没有属性 'shape'

我的目标是获得这样的图表:

Plot with a discrete x variable showing means a linear regression line

我很确定解决方案是根据 seaborn.pydata.org 中的描述使用 regplot 或 lmplot,但我不知道如何构建代码以获得我想要的结果。

欢迎任何帮助! :)

要在 "long form" 中包含 y-values,您可以连接字典中的值:

ys = [yi for di in dict_all_mv.keys() for yi in dict_all_mv[di].values()]

对应的x-values同样可以得到,只不过不是从字典中取值,而是加上key末尾的数值:

xs = [int(di[5:]) for di in dict_all_mv.keys() for yi in dict_all_mv[di].values()]

有了这两个列表你可以调用sns.regplot:

sns.regplot(x=xs, y=ys)