Python Matplotlib网格轮廓打印错误

Python Matplotlib网格轮廓打印错误,python,numpy,matplotlib,plot,Python,Numpy,Matplotlib,Plot,我将python3与numpy、scipy和matplotlib一起使用,希望在绘图网格不等距的地方绘制一个简单的轮廓图。不幸的是,mlab.girddata似乎只适用于一维输入,但这不是我所需要的。我有以下坐标网格-(数组): 虽然第一个坐标数组是统一的,但正如您所看到的,第二个坐标数组不是统一的。而且,因为即使列也不相同,我不能使用mlab.griddata:/ 最后,应根据显示的坐标绘制以下数据数组: 我怎样才能正确地绘制这个?如果没有统一的网格,matplotlib不幸只能绘制一幅无

我将python3与numpy、scipy和matplotlib一起使用,希望在绘图网格不等距的地方绘制一个简单的轮廓图。不幸的是,mlab.girddata似乎只适用于一维输入,但这不是我所需要的。我有以下坐标网格-(数组):

虽然第一个坐标数组是统一的,但正如您所看到的,第二个坐标数组不是统一的。而且,因为即使列也不相同,我不能使用mlab.griddata:/

最后,应根据显示的坐标绘制以下数据数组:

我怎样才能正确地绘制这个?如果没有统一的网格,matplotlib不幸只能绘制一幅无用的图片:

代码如下:

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

如果您的数据是分散的,您可以使用一些三角测量(例如,或在规则网格上插值数据(也由@armatita建议)。我将向您展示后者

但首先:请仔细阅读@armatita之前提到的评论。这是给子孙后代的:


Matplotlib的行为对我来说似乎是正确的。这是假设你给了一个 将逻辑排序顺序添加到数据中,使单元格2显示在单元格后面 1.如果没有,它仍然会打印,但会使用您施加的变形。您需要取X和Y,展平它们(也是Z),并使用它们来 例如,插入到一个规则的网格中。这样你就可以绘制你的 结果。考虑提供数据以获得实际的工作示例。

首先,这是答案的基本思想。其次,明确要求你提供一些样本数据。这对想帮助你的回答者有很大帮助,这也有助于帮助提问者。我很无聊,所以我花时间复制了你的一部分数据的近似值来给出一个示例。然而,这很乏味,而且大多数回答者不会为你做这件事(在不久的将来我也不会为任何人做这件事)。请理解,通过提供一个最小的、完整的例子(也称为an),你可以让你的问题完全可以回答。每个人都赢了

现在开始。如果没有实际数据,我无法判断结果是否有意义。方法是创建一个规则网格,然后使用
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()

如果您的数据是分散的,您可以使用一些三角测量(例如,或在规则网格上插值您的数据(如@armatita所建议的)。我将向您展示后者

但首先:请仔细阅读@armatita之前提到的评论。这是给子孙后代的:


Matplotlib的行为对我来说似乎是正确的。这是假设你给了一个 将逻辑排序顺序添加到数据中,使单元格2显示在单元格后面 1.如果没有,它仍然会打印,但会使用您施加的变形。您需要取X和Y,展平它们(也是Z),并使用它们来 例如,插入到一个规则的网格中。这样你就可以绘制你的 结果。考虑提供数据以获得实际的工作示例。

首先,这是答案的基本思想。其次,明确要求你提供一些样本数据。这对想帮助你的回答者有很大帮助,这也有助于帮助提问者。我很无聊,所以我花时间复制了你的一部分数据的近似值来给出一个示例。然而,这很乏味,而且大多数回答者不会为你做这件事(在不久的将来我也不会为任何人做这件事)。请理解,通过提供一个最小的、完整的例子(也称为an),你可以让你的问题完全可以回答。每个人都赢了

现在开始。如果没有实际数据,我无法判断结果是否有意义。方法是创建一个规则网格,然后使用
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()

Matplotlib的行为在我看来似乎是正确的。它假设您为数据提供了一个逻辑排序序列,因此单元格2将显示在单元格1之后。如果不是,它仍会打印,但会随您施加的变形一起打印。您需要取X和Y,将其展平(也是Z)例如,你可以把它们插入到一个规则的网格中,而不是你可以绘制你的结果。考虑提供你的数据来获得一个实际的工作例子。.Matplotlib的行为在我看来似乎是正确的。它假设您为数据提供了一个逻辑排序序列,因此单元格2将显示在单元格1之后。如果不是,它仍会打印,但会随您施加的变形一起打印。您需要取X和Y,将其展平(也是Z)例如,你可以把它们插入到一个规则的网格中,而不是你可以绘制你的结果。考虑提供你的数据来得到一个实际的工作例子。我会从其他X列中的顺序开始(通过翻转它和Z中的相应行)。