在散点图上叠加线函数 - seaborn
Overlay a line function on a scatter plot - seaborn
我的挑战是将自定义线函数图覆盖在我已有的散点图上,代码如下所示:
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()
结果相同,但没有线条:
您只需调用 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 图,前提是您有构成该线的点(在下面,我称它们为 x_pred
和 y_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)
然后,将它们全部绘制在同一个轴上。
- 现在推荐使用像
seaborn.relplot
or seaborn.regplot
instead of directly using seaborn.FacetGrid
这样的图级函数
- 测试于
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
、seaborn 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
or .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.scatterplot
与 sns.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'})
我的挑战是将自定义线函数图覆盖在我已有的散点图上,代码如下所示:
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()
结果相同,但没有线条:
您只需调用 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 图,前提是您有构成该线的点(在下面,我称它们为 x_pred
和 y_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)
然后,将它们全部绘制在同一个轴上。
- 现在推荐使用像
seaborn.relplot
orseaborn.regplot
instead of directly usingseaborn.FacetGrid
这样的图级函数
- 测试于
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
、seaborn 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
or .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.scatterplot
与 sns.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'})