将回归线和椭圆添加到 Python 中的 3D 散点图
Add regression line and ellipse to a 3D scatter plot in Python
我有一个显示名为 data
的数据框的 3D 散点图。
它通常会生成适合单线或椭圆的形状。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas as pd
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['x'], data['y'], data['z'], c=data['c'])
plt.show()
典型示例(抱歉我不能分享我的数据...):
所以,现在我想计算适合这个点云的多元回归。
有很多文章解释如何用平面来拟合它,但我想用线来拟合它。
作为奖励,我还想用椭圆来拟合这些点。因此,它将反映标准差并且更加直观。
我找到了第一个问题的答案,即找到一条最适合点云的线。我在 Python
中改编了 this post
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
data = pd.DataFrame([[-1, 15, 2], [2, 6, 8], [5, 4, 20], [1, 5, 20], [3, 9, 12]],
columns=['x', 'y', 'z'])
ax.scatter(data['x'], data['y'], data['z'], c='blue')
# Linear regression
X = data[['x', 'y', 'z']].values
Xlen = X.shape[0]
avgPointCloud = 1 / Xlen * np.array([np.sum(X[:, 0]), np.sum(X[:, 1]), np.sum(X[:, 2])])
Xmean = X - avgPointCloud
cov = 1 / Xlen * X.T.dot(Xmean)
t = np.arange(-5, 5, 1)
linearReg = avgPointCloud + cov[:, 0] * np.vstack(t)
ax.plot(linearReg[:, 0], linearReg[:, 1], linearReg[:, 2], 'r', label='Linear Regression')
ax.legend()
plt.show()
我有一个显示名为 data
的数据框的 3D 散点图。
它通常会生成适合单线或椭圆的形状。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas as pd
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['x'], data['y'], data['z'], c=data['c'])
plt.show()
典型示例(抱歉我不能分享我的数据...):
所以,现在我想计算适合这个点云的多元回归。 有很多文章解释如何用平面来拟合它,但我想用线来拟合它。
作为奖励,我还想用椭圆来拟合这些点。因此,它将反映标准差并且更加直观。
我找到了第一个问题的答案,即找到一条最适合点云的线。我在 Python
中改编了 this postfrom mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
data = pd.DataFrame([[-1, 15, 2], [2, 6, 8], [5, 4, 20], [1, 5, 20], [3, 9, 12]],
columns=['x', 'y', 'z'])
ax.scatter(data['x'], data['y'], data['z'], c='blue')
# Linear regression
X = data[['x', 'y', 'z']].values
Xlen = X.shape[0]
avgPointCloud = 1 / Xlen * np.array([np.sum(X[:, 0]), np.sum(X[:, 1]), np.sum(X[:, 2])])
Xmean = X - avgPointCloud
cov = 1 / Xlen * X.T.dot(Xmean)
t = np.arange(-5, 5, 1)
linearReg = avgPointCloud + cov[:, 0] * np.vstack(t)
ax.plot(linearReg[:, 0], linearReg[:, 1], linearReg[:, 2], 'r', label='Linear Regression')
ax.legend()
plt.show()