【问题标题】:How to plot a 3d plot of a normal distribution如何绘制正态分布的 3d 图
【发布时间】:2021-05-15 15:31:19
【问题描述】:

我试图在这个图中绘制类似的东西,但没有成功。

这可能是正态分布的 3d 图。任何人都可以帮助我如何获得这样的情节吗? 这是我正在尝试的代码。

fig=plt.figure(figsize=(10,6))
ax=plt.axes(projection='3d')
x=np.arange(0,251,0.85)
y=np.arange(0,12,0.85)
X,Y=np.meshgrid(x,y)
for i in range(X.shape[0]):
    pos=np.empty(X.shape)
    R=(pos-0.85)/0.029
    Z=(1/0.29*np.sqrt(2*np.pi))*np.exp(-.5*R**2) #normal distribution
    ax.plot_surface(X,Y,Z) 

【问题讨论】:

  • 为什么你认为它是正态分布,而标签表示均匀分布?带宽极低的 kde 图呢?如果我理解正确,您只想要一个情节但甚至没有数据?
  • 数据是我已经给出了矩形的长度和宽度。正如你在绘图上看到的那样,我将得到数据的平均值和标准偏差,我需要像上面提到的图一样绘制。您可以假设任何百分比的网格都被用于绘图。
  • 你也可以考虑正态分布。因为我有正态分布和均匀分布。您可以假设任何平均值和标准值。情节的偏差。
  • 嗯,图像看起来像某个矩形内随机均匀分布的 kde 图。它确实看起来不像均匀分布。矩形的坐标只是一些条件,并不是真正的“数据”

标签: python matplotlib data-visualization


【解决方案1】:

这是一个创建看起来有点相似的情节的想法。从 300 个随机中心开始,以非常小的带宽计算一个kde kernelgaussian_kde 函数将高斯钟形放置在每个随机中心上并将它们相加。

下面的代码有点慢,因为表面是在 200x200 位置上计算和绘制的。为了缩小z轴,借用this post的代码。

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

x = np.linspace(0, 251, 200)
y = np.linspace(0, 12, 200)
centers_x = np.random.uniform(x[0], x[-1], 300)
centers_y = np.random.uniform(y[0], y[-1], 300)
centers = np.vstack([centers_x, centers_y])
kernel = gaussian_kde(centers, bw_method=0.09)

X, Y = np.meshgrid(x, y)
positions = np.vstack([X.ravel(), Y.ravel()])
Z = np.reshape(kernel(positions).T, X.shape)

fig = plt.figure(figsize=(10, 6))
ax = plt.axes(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap="hot", linewidth=0, rcount=200, ccount=200)
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1, 1, 0.1, 1]))
ax.set_zticks([])
plt.show()

【讨论】:

  • 谢谢先生。我想查看 z 标签,但值非常接近,几乎无法读取。我该如何克服呢?
  • 一种方法是删除set_zticks([]) 并添加ax.zaxis.set_major_locator(matplotlib.tickerMaxNLocator(2))。另一种方法是移除缩放 (ax.get_proj = lambda: ....) 并添加 ax.set_zlim(Z.max()*4)(以保持表面平坦)。
  • 模块“matplotlib”没有属性“tickerMaxNLocator”
  • 糟糕。少了一个点。 matplotlib.ticker.MaxNLocator(2)
最近更新 更多