Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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 使用matplotlib拟合回归曲面的3D绘图_Python_Numpy_Matplotlib - Fatal编程技术网

Python 使用matplotlib拟合回归曲面的3D绘图

Python 使用matplotlib拟合回归曲面的3D绘图,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在尝试制作一个3D图形来绘制拟合的回归曲面。我看到了下面的例子 但是,第一个非常过时,不再工作,第二个是相关的,但是我在生成Z的值时遇到了一些麻烦。 我能找到的所有示例都是过时的或低级模拟数据示例。可能存在比Z更多的问题。 请看下面的代码 将numpy导入为np 导入seaborn作为sns 将statsmodels.formula.api作为smf导入 将matplotlib.pyplot作为plt导入 从mpl_工具包导入mplot3d df=sns.load_数据集('mpg')

我正在尝试制作一个3D图形来绘制拟合的回归曲面。我看到了下面的例子

但是,第一个非常过时,不再工作,第二个是相关的,但是我在生成
Z
的值时遇到了一些麻烦。 我能找到的所有示例都是过时的或低级模拟数据示例。可能存在比
Z
更多的问题。 请看下面的代码

将numpy导入为np
导入seaborn作为sns
将statsmodels.formula.api作为smf导入
将matplotlib.pyplot作为plt导入
从mpl_工具包导入mplot3d
df=sns.load_数据集('mpg')
df.dropna(就地=真)
模型=smf.ols(公式='mpg~马力+加速度',数据=df)
结果=model.fit()
x、 y=型号。exog_名称[1:]
x_range=np.arange(df[x].min(),df[x].max())
y_range=np.arange(df[y].min(),df[y].max())
十、 Y=np.meshgrid(X_范围,Y_范围)
#Z=results.fittedvalues.values.reformate()
图=零件图(图尺寸=零件图尺寸(1)*3)
ax=plt.轴(投影='3d')
ax.绘图曲面(X,Y,Z,rstride=1,cstride=1,alpha=0.2)
更新:

我将
Z
更改为以下是正确的

Z = results.params[0] + X*results.params[1] + Y*results.params[2]
并附加

ax.scatter(df[x], df[y], df[model.endog_names], s=50)
ax.view_init(20, 120)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
我得到了下面的情节,但我不确定它是否正确


如果可能,我还想为绘制的曲面添加投影。

在您链接的答案中,关键步骤是通过提供“外源”数据将模型应用于整个网格。在这种情况下,您可以通过创建一个新的数据帧来轻松实现这一点,该数据帧包含已分解的网格网格,并将其作为
exog
传递给。使用您的示例对此进行演示:

将numpy导入为np
导入seaborn作为sns
将statsmodels.formula.api作为smf导入
将matplotlib.pyplot作为plt导入
从mpl_工具包导入mplot3d
df=sns.load_数据集('mpg')
df.dropna(就地=真)
模型=smf.ols(公式='mpg~马力+加速度',数据=df)
结果=model.fit()
x、 y=型号。exog_名称[1:]
x_range=np.arange(df[x].min(),df[x].max())
y_range=np.arange(df[y].min(),df[y].max())
十、 Y=np.meshgrid(X_范围,Y_范围)
exog=pd.DataFrame({x:x.ravel(),y:y.ravel()})
Z=结果。预测(exog=exog)。值。重塑(X.shape)
图=零件图(图尺寸=零件图尺寸(1)*2)
ax=plt.轴(投影='3d')
ax.scatter(df[x]。值,df[y]。值,结果。fittedvalues.values,
标记='',label=“适合”)
cond=df[model.endog_name].values>results.fittedvalues.values
ax.scatter(df[x][cond]。值,df[y][cond]。值,df[model.endog_name]
[cond]。值,label=“Raw”)
ax.绘图曲面(X,Y,Z,rstride=1,cstride=1,alpha=0.4)
ax.scatter(df[x][cond==False]。值,df[y][cond==False]。值,
df[model.endog_names][cond==False].values)
ax.图例()
plt.show()
这会给你

除了数据点之外,我还将各个拟合点包括在散点图中,以表明该方法正确生成了相应的曲面。我还将数据过滤为两组:应在曲面前面绘制的数据和应在曲面后面绘制的数据。这是为了适应matplotlib在3D渲染中对艺术家的分层。已将查看几何图形从默认更改为最大化三维特性的清晰度


编辑 将回归曲面的投影添加到其中一个轴平面上相当简单-只需将一维设置为轴限制即可绘制数据,即

ax.plot_曲面(X,Y,np.full_like(X,ax.get_zlim()[0]),alpha=0.2)
这就给了你


结果、拟合值、值的形状是什么?在进行任何显式重塑之前,它是一维的,但Z必须是二维的或其他的……它是一维的,但我所说的形状是指
results.fittedvalues.values.shape
return?它返回(392,)关于
df[x].values.shape
df[y].values.shape
我想为绘制的曲面添加一个投影(就像你把它压碎了一样)。有什么简单的方法吗?如果有,我可以更新我的PO。我想这和我尝试过的一样,
偏移量
似乎很奇怪,我找不到文档。@steven很容易将它投影到与任何轴对平行的平面上(即xy平面、xz平面或yz平面)-投影到任意平面稍微困难一些。你想做什么?简单的一个只是每个平面的一个轴。xy,xz,yz…我试过了,但我不知道如何指定偏移。你能为所有三个轴都这样做吗?我不太明白这是如何工作的。@steven如果你想为不同的轴平面指定偏移量,你可以执行以下命令:
ax.plot_surface(np.full_like(X,ax.get_xlim()[0]),Y,Z)
将在
yz
平面上打印,
ax.plot_surface(X,np.full_like(X,ax.get_ylim()[0]),Z)
将在
xz
平面上打印。