Matplotlib:如何制作等高线图?

时间:2015-12-11 06:43:31

标签: python matplotlib

我有一个函数,我想做一个等高线图: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)计算的,我认为它可以自动化?

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进行硬编码。