[英]Matplotlib: How to make a contour plot?
我有一个要绘制轮廓图的函数: mixed_model_pdf([[x,y]])
。
它只接受[x,y]
,而不是X,Y作为输入。 也就是说, mixed_model_pdf([[-5,-5]])
或mixed_model_pdf([[-5,-5],[-5,-4]])
但是要执行plt.contourf(X, Y, Z)
,应该按特定顺序放置Z
值,我该怎么做?
现在,我可以解决这个问题:
X = Y = np.arange(-30, 31, 1)
N, M = len(X), len(Y)
Z = np.zeros((N, M))
for i, (x,y) in enumerate(product(X,Y)):
Z[np.unravel_index(i, (N,M))] = mixed_model_pdf([[x,y]])
Z = Z.T
X, Y = np.meshgrid(X, Y)
# Plot 2d prob density
fig, ax = plt.subplots(figsize=(8, 8), dpi=80)
ax.set_aspect('equal')
plt.contourf(X, Y, Z, 10, alpha=.75, cmap='jet')
但这看起来确实很丑陋,它transpose
了Z
,并且仍然需要X, Y = np.meshgrid(X, Y)
。
有什么更好的方法呢?
更新:
现在,我可以使代码更加清晰:
X = Y = np.arange(-30, 31, 1)
XX,YY=np.meshgrid(x,y)
coords=np.array((XX.ravel(), YY.ravel())).T
Z = mixed_model_pdf(coords).reshape(61,61)
fig, ax = plt.subplots(figsize=(8, 8), dpi=80)
ax.set_aspect('equal')
plt.contourf(X, Y, Z, 10, alpha=.75, cmap='jet')
但是,如何缩短.reshape()
呢? 它是根据Y = np.arange(-30, 31, 1)
,我认为它可能是自动化的?
收集我的评论答案。
您可以plt.contourf
不同的方式调用plt.contourf
。 文档明确指出了这一点:
X和Y必须都是与Z形状相同的2-D,或者它们都必须是1-D,以使len(X)是Z中的列数,而len(Y)是Z中的行数。
您可以从交互式Python提示符中获取文档:
>>> help(plt.contourf)
或者,如果您使用IPython(Notebook),则应该这样做;):
In [1]: plt.contourf?
您可以使用:
Z = mixed_model_pdf(coords).reshape(Y.size, Y.size)
避免对61
进行硬编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.