问题描述
我正在尝试以 3D 形式绘制正态分布。我有一段用 MATLAB 编写的代码,但是我用 Python 编写它失败了。
完整的MATLAB代码为:
dsig = 0.25;
dx = 0.5;
mu = 0;
[X,SIGMA] = meshgrid(-10:dx:10,1:dsig:5);
Z = exp(-(X-mu).^2./(2*SIGMA.^2))./sqrt(2*pi*SIGMA.^2);
waterfall(X,SIGMA,Z)
xlabel('x')
ylabel('\sigma')
zlabel('f(x)')
到目前为止,我尝试用 Python 编写的代码是:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
dsig = 0.25
dx = 0.5
mu = 0
X = np.linspace(-10,dx,10)
SIGMA = np.linspace(1,dsig,5)
X,SIGMA = np.meshgrid(X,SIGMA)
Z = 1/(np.sqrt(2*np.pi*SIGMA*SIGMA))*np.exp(-(x-mu)**2/(2*SIGMA*SIGMA))
有人能帮我用 Python 绘制这个 3d 图吗?
解决方法
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator,FormatStrFormatter
import math
import scipy.stats as stats
mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma,mu + 3*sigma,100)
y = np.linspace(mu - 3*sigma,100)
x,y = np.meshgrid(x,y)
r = np.sqrt(x**2 + y**2)
z = stats.norm.pdf(r,mu,sigma)
fig = plt.figure()
ax = fig.gca(projection='3d') # get current axis
surf = ax.plot_surface(x,y,z,cmap=cm.coolwarm,linewidth=0,antialiased=False)
ax.set_zlim(0,0.3)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
plt.show()