Python Matplotlib网格中的contourplot错误

时间:2016-05-07 14:53:29

标签: python numpy matplotlib plot

我正在使用python3和numpy,scipy和matplotlib,并希望绘制一个简单的contourf-plot,其中绘图网格不是等距的。不幸的是,mlab.girddata似乎只能用于一维输入,但这不是我需要的。我有以下坐标的网格 - (数组):

enter image description here enter image description here 虽然第一个坐标数组是统一的,但你可以看到第二个坐标数组不是。因为即使列不相同,我也不能使用mlab.griddata:/

最终,应该绘制以下数据数组与显示的坐标: enter image description here

如何正确绘制?没有统一的网格matplotlib不幸地只绘制了一张无用的图片:

enter image description here

这里是代码:

coordsForPlot = np.transpose(np.tile(self.CoordsVert_HW12[1:], (15, 1)));
figHandler = plt.figure();

cont_HW_u12_mean = plt.contourf(self.CoordsHor, coordsForPlot, self.velHW_Raw_u12_mean, 40, linestyle=None);

谢谢,

itpdg

1 个答案:

答案 0 :(得分:0)

如果您的数据分散,您可以使用一些三角测量(例如matplotlib.pyplot.tricontourf),也可以在常规网格上插入数据(@armatita almost a month ago也建议).I'我会告诉你后者。

但首先:请非常好地阅读@ armatita先前提到的评论。对于后人来说,这就是:

  

Matplotlib的行为对我来说似乎是正确的。它假设你给了一个   对数据进行逻辑排序的序列,因此单元格2将出现在单元格之后   如果没有,它仍然是情节,但你施加的变形。你需要把你的X和Y弄平它们(也是Z),然后用它们来   例如,插入到常规网格中。比你可以策划你的   结果。考虑提供您的数据以获得实际的工作示例。

首先,答案的基本思路是什么。其次,明确要求您提供一些示例数据。对于想要帮助你的回答者来说,这有很大的帮助,这也可以通过帮助askers来帮助。我很无聊所以我花了很多时间并复制了一些数据的近似值来得到一个例子。然而,这是乏味的,大多数回答者都不会为你做这件事(我不会在不久的将来为其他人做这件事)。请通过提供最小的完整示例(也称为mcve)来理解,您可以使问题完全回答。每个人都赢了。

所以这里。如果没有您的实际数据,我无法判断结果是否合理。我们的想法是创建一个常规网格,然后使用scipy.interpolate.griddata获取一个插值数据集,以后可以将其输入contourf

import numpy as np
import scipy.interpolate as interp
import matplotlib.pyplot as plt


# create weird dummy data
xmat = np.tile(np.arange(90,640,90)[:,None],[1,4])
ymat = np.array([[-70.,80,-70,60,-50,50,-50],
                 [-49,64,-49,48,-34,41,-34],
                 [-30,49,-30,38,-20,32,-20],
                 [-13,36,-13,28,-7,25,-7]]).T
zmat = np.tile(np.array([7.5,9,11,12,13,14,14])[:,None],[1,4])

# input data for griddata
points_in = np.array([xmat.ravel(),ymat.ravel()]).T
values = zmat.ravel()

# output mesh at which to interpolate
Ngrid = 50
xvals = np.linspace(xmat.min(),xmat.max(),Ngrid)
yvals = np.linspace(ymat.min(),ymat.max(),Ngrid)
xplot,yplot = np.meshgrid(xvals,yvals)

# interpolate
zplot = interp.griddata(points_in,values,(xplot,yplot),method='linear')

# plot
plt.figure()
plt.contourf(xplot,yplot,zplot,N=50)
plt.show()