Python 如何在同一图形中绘制多元线性回归
鉴于以下情况:Python 如何在同一图形中绘制多元线性回归,python,pandas,matplotlib,plot,seaborn,Python,Pandas,Matplotlib,Plot,Seaborn,鉴于以下情况: import numpy as np import pandas as pd import seaborn as sns np.random.seed(365) x1 = np.random.randn(50) y1 = np.random.randn(50) * 100 x2 = np.random.randn(50) y2 = np.random.randn(50) * 100 df1 = pd.DataFrame({'x1':x1, 'y1': y1}) df2 = p
import numpy as np
import pandas as pd
import seaborn as sns
np.random.seed(365)
x1 = np.random.randn(50)
y1 = np.random.randn(50) * 100
x2 = np.random.randn(50)
y2 = np.random.randn(50) * 100
df1 = pd.DataFrame({'x1':x1, 'y1': y1})
df2 = pd.DataFrame({'x2':x2, 'y2': y2})
sns.lmplot('x1', 'y1', df1, fit_reg=True, ci = None)
sns.lmplot('x2', 'y2', df2, fit_reg=True, ci = None)
这将创建两个单独的绘图。如何将来自df2的数据添加到同一个图形上?我在网上找到的所有seaborn示例似乎都关注于如何创建相邻图形(例如,通过“色调”和“颜色包裹”选项)。另外,我不喜欢使用可能存在额外列的数据集示例,因为这在我正在处理的项目中没有自然意义
如果要实现这一点需要matplotlib/seaborn函数的混合,如果有人能帮助说明,我将不胜感激。您可以使用
seaborn
的类来获得所需的结果。
您需要将打印调用替换为以下行:
# sns.lmplot('x1', 'y1', df1, fit_reg=True, ci = None)
# sns.lmplot('x2', 'y2', df2, fit_reg=True, ci = None)
df = pd.concat([df1.rename(columns={'x1':'x','y1':'y'})
.join(pd.Series(['df1']*len(df1), name='df')),
df2.rename(columns={'x2':'x','y2':'y'})
.join(pd.Series(['df2']*len(df2), name='df'))],
ignore_index=True)
pal = dict(df1="red", df2="blue")
g = sns.FacetGrid(df, hue='df', palette=pal, size=5);
g.map(plt.scatter, "x", "y", s=50, alpha=.7, linewidth=.5, edgecolor="white")
g.map(sns.regplot, "x", "y", ci=None, robust=1)
g.add_legend();
这将产生此图:
如果我理解正确,这就是你需要的
请注意,您需要注意.regplot
参数,可能需要更改我作为示例输入的值
行尾的code>用于抑制命令的输出(我在可见的地方使用ipython笔记本)
- 对
方法进行一些解释。本质上,它就是这样做的,用数据映射打印命令。但是,它将使用“低级”绘图命令,如.map()
,而不是regplot
,后者实际上是在幕后调用regplotlmlplot
- 通常,
会使用参数:plt.scatter
,c='none'
来制作非填充标记。但是seaborn干扰了这一过程,并对标记施加了颜色,因此我看不到一种简单/直接的方法来解决这一问题,而是在seaborn生成绘图后操纵edgecolor='r'
元素,这最好作为另一个问题的一部分来解决ax
sns.regplot
- 在这种情况下,最容易实现的解决方案是使用轴级功能,因为这不需要组合
和df1
df2
将熊猫作为pd导入
进口海运
将matplotlib.pyplot作为plt导入
#创建图形和轴
图,ax=plt.子批次(图尺寸=(6,6))
#为每个数据帧添加绘图
sns.regplot(x='x1',y='y1',data=df1,fit_reg=True,ci=None,ax=ax,label='df1')
sns.regplot(x='x2',y='y2',data=df2,fit_reg=True,ci=None,ax=ax,label='df2')
ax.set(ylabel='y',xlabel='x')
ax.图例()
plt.show()
选项2:
sns.lmplot
- 根据,使用图形级函数比直接使用
更好FacetGrid
- 将
和df1
组合成长格式,然后与df2
参数一起使用hue
- 使用
时,数据的长格式几乎总是必需的。seaborn
- 通常使用或将数据帧从宽转换为长
- 因此,
和df1
必须重命名列,并具有附加的标识列。这允许它们在df2
(默认长格式)上连接,而不是在轴=0
(宽格式)上连接轴=1
- 有多种方法可以组合数据帧:
- 如果组合几个数据帧,则from中的组合方法很好
- 但是,如下所示的函数更适合组合多个数据帧
def fix_df(数据:pd.DataFrame,名称:str)->pd.DataFrame:
“”“重命名列并添加列”“”
#将列重命名为公共名称
data.columns=['x','y']
#添加要与色调一起使用的标识值
数据['df']=名称
返回数据
#创建数据帧的列表
df_列表=[df1,df2]
#通过在列表中调用函数来更新数据帧
df_update_list=[fix_df(v,f'df{i}')表示枚举中的i,v(df_list,1)]
#合并数据帧
df=pd.concat(df\u更新列表)。重置索引(drop=True)
#绘制数据帧
sns.lmplot(数据=df,x='x',y='y',hue='df',ci=None)
笔记
- 用于此答案的软件包版本:
- 熊猫1.2.4版
seaborn v0.11.1
matplotlib v3.3.4