2

大多数 pyplot 示例都使用线性数据,但如果数据分散怎么办?
x = 3,7,9
y = 1,4,5
z = 20,3,7

更好的轮廓网格网格
xi = np.linspace(min(x)-1, max(x)+1, 9)
yi = np.linspace(min(y)-1, max(y)+1, 9)
X, Y = np.meshgrid(xi, yi)

现在“z”数据必须被插值到网格网格上。
numpy.interp在这里没有什么帮助,而线性nn插值
zi = matplotlib.mlab.griddata(x,y,z,xi,yi,interp="linear") 返回相当奇怪的结果

scipy.interpolate.griddata 下面第二个答案的立方需要其他东西来返回数据而不是 nils

预计自定义级别数据看起来像这样

4

2 回答 2

2

这就是发生的事情: 在此处输入图像描述

虽然contour需要网格数据,但我们可以将分散数据转换为网格,然后使用masked arrays屏蔽掉空白区域。我在下面的代码中对此进行了模拟,方法是创建一个随机数组,然后使用它来屏蔽测试数据集(显示在底部)。大部分代码取自这个 matplotlib 演示页面

import matplotlib
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

from numpy.random import *
import numpy.ma as ma

J = random_sample(X.shape)
mask = J > 0.7
X = ma.masked_array(X, mask=mask)
Y = ma.masked_array(Y, mask=mask)
Z = ma.masked_array(Z, mask=mask)

plt.figure()
CS = plt.contour(X, Y, Z, 20)
plt.clabel(CS, inline=1, fontsize=10)
plt.title('Simplest default with labels')
plt.savefig('cat.png')
plt.show()

在此处输入图像描述

于 2012-05-23T16:12:59.117 回答
2

countourf仅适用于数据网格。如果您的数据是分散的,那么您需要创建一个与您的数据匹配的插值网格,如下所示:(注意您需要 scipy 来执行插值)

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform, seed

# your data
x = [3,7,9]
y = [1,4,5]
z = [20,3,7]

# define grid.
xi = np.linspace(0,10,300)
yi = np.linspace(0,6,300)
# grid the data.
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data, plotting dots at the randomly spaced data points.
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(min(x),max(x))
plt.ylim(min(y),max(y))
plt.title('griddata test (%d points)' % len(x))
plt.show()

有关该代码的来源,请参见此处

于 2012-05-23T16:07:27.450 回答