2012-05-23 148 views
2

大多數pyplot示例使用線性數據,但如果數據是分散的呢?
x = 3,7,9
y = 1,4,5
z = 20,3,7
通過python的matplotlib.pyplot.contourf分散x,y,z

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

更好meshgrid現在, 「Z」 的數據一定要進行插值到meshgrid。
numpy.interp做一點幫助在這裏,而下方的
zi = matplotlib.mlab.griddata(x,y,z,xi,yi,interp="linear") 同時返回線性NN interpolaton比較奇怪的結果

scipy.interpolate.griddata立方米從第二個答案需要別的東西返回的數據,而不是尼爾斯

隨着自定義水平的數據預計看起來like this

+2

什麼是你的問題? –

+0

問題是如何通過contourf(通過自定義級別填充顏色,無輪廓)顯示此數據(網格+數據),並稍後將其應用於mpl_toolkits'具有shapefile的底圖,但這是另一步。 – dd11

+0

你卡在什麼位?正如我在下面描述的那樣,您只需要使用'masked arrays'。如果你想填充輪廓,只需添加'CS2 = plt.contourf(X,Y,Z,20)'。 – fraxel

回答

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的起源該代碼。

+0

讓我們來看看** numpy.interp **,甚至更直的案例** matplotlib.mlab.griddata **可以在這裏做.. – dd11

+0

即使在固定的xi/yi範圍內,zi也是充滿「nan」的,並且輪廓不顯示任何東西 – dd11

+1

在修復陣列的範圍之後適用於我。 'xi = np.linspace(0,10,300); yi = np.linspace(0,6,300)'。 –

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

相關問題