2013-01-15 133 views
0

我有一些3D數據,例如d=[x, y, z, f] 其中z是Z中的一列數字,用作顏色信息。Matplotlib:具有imshow的特定顏色

f是一個標誌,它是

  1. 0如果xy有一些特定的值(難看^^)
  2. 1如果xy都OK

因此對於良好數據d[ d[:,3] == 1 ]我想生成配置文件

plt.imshow(resampled.T, extent=extent, vmin=MIN, vmax=MAX, origin='lower') 

和醜陋的數據d[ d[:,3] == 0 ]我想只使用特定的顏色,例如黑色

有沒有辦法實現這一點?

編輯:結合@eumiro和@Rutger Kassies的意見,我現在得到以下結果 enter image description here

這是滿足,我認爲有。 爲了完整起見(也許有一些優化,我不知道^^的),這裏是代碼和data

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


def plotprofile(x, y, z0, name='dummy', save=1): 
    #plt.figure() 
    N = 50j 
    z = z0[:,0] 
    extent = (min(x), max(x), min(y), max(y)) 
    xs,ys = np.mgrid[extent[0]:extent[1]:N, extent[2]:extent[3]:N] 
    resampled = griddata(x, y, z, xs, ys) 

    cmap = plt.get_cmap() 
    cmap.set_bad(color = 'k', alpha = 1.) 
    #plt.imshow(resampled.T, cmap='Greys', extent=extent, origin='lower', interpolation='spline36') 
    plt.imshow(resampled.T, cmap=cmap, extent=extent, origin='lower', vmin=min(z), vmax=-min(z),interpolation='spline36') 

cbar=plt.colorbar() 
s=20 
plt.ylabel(r"$y$", size=s) 
plt.xlabel(r"$x", size=s) 
plt.xlim([x.min(),x.max()]) 
plt.ylim([y.min(),y.max()]) 

if save: 
    for end in ["pdf", "png", "eps"]: 
     print "save %s.%s"%(name,end) 
     plt.savefig("%s.%s"%(name,end)) 
else: 
    plt.show() 
plt.clf() 


if __name__ == '__main__': 
    filename = 'data.txt' 
    data = np.loadtxt(filename) 
    x = data[:,0] 
    y = data[:,1] 
    z = data[:,3:] 
    plotprofile(x, y, z, 'dummy', 0) 
+0

表面如何替換所有的「醜陋的數據「用'np.nan'? – eumiro

+0

的確是eumeriro。蒙面陣列將非常方便。然後可以使用cmap.set_bad()屬性來控制可視化。 @Tengis,你應該提供一個工作的例子。例如,x,y,z數據是否是格子化的,還是散點? –

回答

0

你不能用Z中創建只是一個正常的colourmap用f來掩飾z?

dd = d[:, :3] 
dd[:,2] = dd[:,2] * d[:,3] 

然後轉換爲圖像像這樣:

M = dd.max(0) 
m = dd.min(0) 

x = np.arange(m[0], M[0] + 1) 
y = np.arange(m[1], M[1] + 1) 
[X, Y] = np.meshgrid(x, y) 

Z = np.zeros_like(X) 

for num in range(0,size(dd, 0)): 
    Z[dd[num, 0], dd[num, 1]] = dd[num, 2] 

現在,你應該能夠繪製Z像一個正常的圖像或反對[X, Y]

+0

你的代碼中的c是什麼?我喜歡你的想法,但看起來這個標誌是不必要的。我沒有意識到np.nan的想法。 – Tengis

+0

oops c一定是d或dd(甚至是dd [:, 2])的拼寫錯誤,這個想法是找出繪製圖像所需的網格範圍,以確定它是否是規則網格。雖然這段代碼確實假設x和y只能保持整數,但這很容易改變 – Dan

相關問題