如何使seaborn plot显示并考虑到多个点

问题描述

我从数据框中提取了这两个数据列表。

[5,5,4,2,5] (Col 1)

[5,3,5] (Col 2)

从 scipy 库调用 stats.preasonr 给出 (-0.5062175977346661,0.20052806464412476),表明负相关。然而,最合适的调用线

graph = sns.jointplot(x = 'col1name',y = 'col2name',data = df_name,kind = 'reg')

是积极的。我意识到这是因为我认为最佳拟合线的计算没有考虑到点的多样性。特别是,(5,2)即使出现3次也只考虑一次。那么我该怎么做才能 (a) 有人可以查看这个图并告诉有多少学生用单个数据点表示,以及 (b) 最佳拟合线考虑了点的多样性?

这是情节的图片

enter image description here

解决方法

不会忽略重合点。这是一个添加一些随机噪声以显示所有点的可视化,并为“col1”中的每个值标记“col2”的平均值。此外,在应用随机抖动之前计算 r 值。

from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from scipy.stats import pearsonr

df = pd.DataFrame({'col1': [5,5,4,2,5],'col2': [5,3,5]})
r,p = pearsonr(df['col1'],df['col2'])
xs = np.unique(df['col1'])
ys = [df[df['col1'] == x]['col2'].mean() for x in xs]
df['col1'] += np.random.uniform(-0.1,0.1,len(df))
df['col2'] += np.random.uniform(-0.1,len(df))
g = sns.jointplot(x='col1',y='col2',data=df,kind='reg')
g.ax_joint.scatter(x=xs,y=ys,marker='X',color='crimson') # show the means
g.ax_joint.text(2.5,4.5,f'$r={r:.2f}$',color='navy') # display the r-value
plt.show()

jointplot with scatter and means per column

正如预期的那样,回归线似乎非常接近均值。对于 col1==5,在 5 处有 4 个值,在 4 处有 2 个值,在 2 处有 3 个值,它们的平均值是 3.78。