我有一个函数,我想做一个等高线图: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)
计算的,我认为它可以自动化?
答案 0 :(得分:2)
在答案中收集我的评论。
您可以通过不同方式致电plt.contourf
。文档明确指出:
X和Y必须都是2-D,形状与Z相同,或者它们必须都是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
进行硬编码。