通过python的matplotlib.pyplot.contourf分散x,y,z

时间:2012-05-23 15:41:20

标签: python matplotlib

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

更好的meshgrid for contourf
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 cubic 需要其他东西才能返回数据而不是nils

预计自定义级别的数据会显示like this

2 个答案:

答案 0 :(得分: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()

请参阅here了解该代码的来源。

答案 1 :(得分:2)

这是发生的事情: enter image description here

虽然contour需要网格数据,但我们可以将分散数据关联到网格,然后使用masked arrays掩盖空白区域。我在下面的代码中模拟了这一点,通过创建一个随机数组,然后用它来掩盖一个测试数据集(如下图所示)。大部分代码来自this matplotlib demo page

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()

enter image description here