Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在同一图形中绘制多元线性回归_Python_Pandas_Matplotlib_Plot_Seaborn - Fatal编程技术网

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
参数,可能需要更改我作为示例输入的值

  • 用于抑制命令的输出(我在可见的地方使用ipython笔记本)
  • .map()
    方法进行一些解释。本质上,它就是这样做的,用数据映射打印命令。但是,它将使用“低级”绘图命令,如
    regplot
    ,而不是
    lmlplot
    ,后者实际上是在幕后调用regplot
  • 通常,
    plt.scatter
    会使用参数:
    c='none'
    edgecolor='r'
    来制作非填充标记。但是seaborn干扰了这一过程,并对标记施加了颜色,因此我看不到一种简单/直接的方法来解决这一问题,而是在seaborn生成绘图后操纵
    ax
    元素,这最好作为另一个问题的一部分来解决
选项1:
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