在散点图上叠加线函数 - seaborn

Posted

技术标签:

【中文标题】在散点图上叠加线函数 - seaborn【英文标题】:Overlay a line function on a scatter plot - seaborn 【发布时间】:2018-03-17 19:48:20 【问题描述】:

我的挑战是将自定义线函数图覆盖在我已经拥有的散点图上,代码如下所示:

base_beta = results.params
X_plot = np.linspace(0,1,400)

g = sns.FacetGrid(data, size = 6)
g = g.map(plt.scatter, "usable_area", "price", edgecolor="w")

其中base_beta 只是一个常数,然后是一个系数。基本上,我想覆盖一个绘制一条线的函数y = constant + coefficient * x

我尝试使用它覆盖一条线,但它不起作用。

g = g.map_dataframe(plt.plot, X_plot, X_plot*base_beta[1]+base_beta[0], 'r-')
plt.show()

当前散点图如下所示:

谁能帮我解决这个问题?

--尝试1

base_beta = results.params
X_plot = np.linspace(0,1,400)
Y_plot = base_beta [0] + base_beta[1]*X_plot

g = sns.FacetGrid(data, size = 6)
g = g.map(plt.scatter, "usable_area", "price", edgecolor="w")
plt.plot(X_plot, Y_plot, color='r')
plt.show()

导致相同的图表但没有线:

【问题讨论】:

【参考方案1】: 现在建议使用seaborn.relplotseaborn.regplot等图形级函数,而不是直接使用seaborn.FacetGrid python 3.8.12pandas 1.3.3matplotlib 3.4.3seaborn 0.11.2中测试

样本数据和导入

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# create a dataframe with sample x and y
np.random.seed(365)
x = 5*np.random.random(200)
df = pd.DataFrame('x': x, 'y': 10*x+10*np.random.random(200))

# add custom line to the dataframe
base_beta = [10, 5]
df['y_line'] = base_beta[0] + base_beta[1]*df.x

display(df.head())
          x          y     y_line
0  4.707279  50.634968  33.536394
1  3.208014  33.890507  26.040068
2  3.423052  37.853276  27.115262
3  2.942810  29.899257  24.714052
4  2.719436  36.932170  23.597180

向散点图添加自定义线

sns.relplot.map.map_dataframe

将轴级绘图功能(例如sns.lineplot)应用于图形级绘图的每个方面。 seaborn: Building structured multi-plot grids
p1 = sns.relplot(kind='scatter', x='x', y='y', data=df, height=3.5, aspect=1.5)
p1.map_dataframe(sns.lineplot, 'x', 'y_line', color='g')

sns.scatterplotsns.lineplot

将两个轴级图绘制到同一个图上
fig, ax = plt.subplots(figsize=(6, 4))
p1 = sns.scatterplot(data=df, x='x', y='y', ax=ax)
p2 = sns.lineplot(data=df, x='x', y='y_line', color='g', ax=ax)


回归线到散点图

对于回归线 使用seaborn.lmplot 绘制图形级回归图 将seaborn.regplot 用于坐标轴级回归图。

sns.lmplot

p1 = sns.lmplot(data=df, x='x', y='y', line_kws='color': 'g', height=3.5, aspect=1.5)

sns.regplot

p2 = sns.regplot(data=df, x='x', y='y', line_kws='color': 'g')

【讨论】:

【参考方案2】:

你也可以在数据上叠加一个 Seaborn 图,假设你有构成那条线的点(下面,我称它们为 x_predy_pred):

fig, ax = plt.subplots(figsize=(11, 8.5))
sns.scatterplot(x='M2NS_PC1', y='FII5', data=ir_ms, ax=ax)
ax.axhline(y=0, color='k', linewidth=1)  # added because i want the origin
ax.axvline(x=0, color='k', linewidth=1)

fitted = sm.ols(formula='FII5 ~ M2NS_PC1', data=ir_ms).fit(cov_type='HC3')

x = ir_ms['M2NS_PC1']
x_pred = np.linspace(x.min() - 1, x.max() + 1, 50)
y_pred = fitted.predict(exog=dict(M2NS_PC1=x_pred))

sns.lineplot(x=x_pred, y=y_pred, ax=ax)

然后,将其全部绘制在同一轴上。

【讨论】:

【参考方案3】:

您只需调用plt.plot 在数据上绘制一条线。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame()
data['usable_area'] = 5*np.random.random(200)
data['price'] =  10*data['usable_area']+10*np.random.random(200)

X_plot = np.linspace(0, 7, 100)
Y_plot = 10*X_plot+5

g = sns.FacetGrid(data, size = 6)
g = g.map(plt.scatter, "usable_area", "price", edgecolor="w")
plt.plot(X_plot, Y_plot, color='r')
plt.show()

生产:

【讨论】:

以上是关于在散点图上叠加线函数 - seaborn的主要内容,如果未能解决你的问题,请参考以下文章

如何在散点图上添加贯穿原点的线(从正到负) - 高图

在散点图上绘制隐式函数(逻辑回归中的决策边界)

R语言可视化散点图(scatter plot)并在散点图中叠加回归曲线叠加lowess拟合曲线(linear and lowess fit lines)使用plotlineabline函数

如何在散点图上拖放

根据 Seaborn 中的散点图绘制热图

如何将数据椭圆叠加在 ggplot2 散点图上?