python 在三维中可视化多元正态分布

sc4hvdpw  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(135)

我试图用matplotlib可视化一个多元正态分布。我想制作这样的东西:

我使用以下代码:

from mpl_toolkits import mplot3d
x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
Z = np.random.multivariate_normal(mean = [1, 2], cov = np.array([[0.5, 0.25],[0.25, 0.50]]), size = 100000)
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='viridis', edgecolor='none')
ax.set_title('surface');

但我得到以下错误消息:

...
      7 ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
----> 8                 cmap='viridis', edgecolor='none')
...
ValueError: shape mismatch: objects cannot be broadcast to a single shape

发生错误的原因是什么?如何纠正我的代码?

n3h0vuf2

n3h0vuf21#

我已经用scipy.stats.multivariate_normal完成了这个操作,使用pdf方法生成z值。正如@Piinthesky所指出的,numpy实现返回给定分布的x和y值。使用scipy版本的一个例子是在Python中添加围绕点的半径中的高斯噪声[关闭]:

python 3.11.2scipy 1.10.1matplotlib 3.7.1numpy 1.24.3中测试

import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
import numpy as np

x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
mu = np.array([1, 2])
cov = np.array([[.5, .25],[.25, .5]])
rv = multivariate_normal(mu, cov)
Z = rv.pdf(pos)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
fig.show()

相关问题