2016-02-03 12 views
1

一個數據源(可能不是正則化)我有看起來像一個熊貓數據幀:函數繪製在格式的x,y,使用值蟒matplotlib

X,Y,VAL 
3,1,1221.231 
3,3,121.2 
3,4,4354.2 
3,...,... 
3,1200,12.1 
... 
5,1,756.3 
5,2,12.01 
5,...,... 
...,...,... 
123,110,23.1 
123,1119,65.9 

注意,X,Y的值是在第一和第二列,不同於pyplot imshow期望的(多維數組)。

我們在第一個n行中將所有Y值都分配給第一個X座標,並在第二個X值和與該行相關的所有Y值之後繼續下去,直到它遇到最後一行。這裏的小點表示數據以更多行繼續存在。

第三列上的值將變爲地圖上的測量值。

我試圖遍歷或使用方法「獨特的」從熊貓庫建立的座標建立一個網格,但源的非規律性轉身事情複雜

有能夠處理這個任何功能imshow中的「可繪圖」或將其轉換爲另一種表/矩陣?

使用建議的解決方案之一是不可行的,因爲着色不能插值。我的源網格不是很稀疏,但不幸的是,我不能保證這是經常性的。 (但它可能在某些情況下)。

但是讓我們假設我有一個像

x   y  value 

    64  4  2743 
    64  8  3531 
    64  16  4543 
    64  32  5222 
    64  64  5730 
    128  4  2778 
    128  8  3500 
    128  16  4657 

一些數據有什麼功能能夠將此錶轉換爲imshow兼容嗎? (基於x/y值的行/列)還是我需要迭代它?

嘗試建議的解決方案後,我遇到了優化問題,並且我無法在嘗試使用pcolormesh時創建v_mesh。在這裏可以看到Optimizing non regularized data reading to image是另一個問題。

+0

對於圖像(imshow),你必須在X和Y –

+0

@SeverinPappadeux等距步讓通過hypotesis創建2個場景: 1.我的實際情況,是否有任何功能可以繪製基於此的圖像? 2.我可以提取數據,根據最小值/最大值構建一個新表格,並將其填入未找到數據的NaN。有沒有任何函數可以用來將這種格式轉換爲另一種可以通過matplotlib輕鬆解析的格式? 事實上,我試圖避免任何形式的迭代這個數據源。 任何提示是值得歡迎的。 – Lin

+1

http://stackoverflow.com/questions/27004422/contour-imshow-plot-for-irregular-x-y-z-data – M4rtini

回答

1

但是讓我們假設我有一個像

好了,第二個數據集的一些數據可以很容易地融入圖像陣列。基本上,如果您使用log2(x)log2(y)而不是xy,它很容易適合圖像。所以用數據填充圖像並使用日誌比例。

沿線的東西(未測試的代碼!)

x = ... 
y = ... 
v = ... 

xmin = x[0] 
xmax = x[-1] 
ymin = y[0] 
ymax = y[-1] 

nx = len(x.unique()) 
ny = len(y.unique()) 

img = np.zero((nx, ny)) 
for ix in range(0, nx): 
    for iy in range(0, ny): 
     v_idx = ix*ny + iy 
     img[ix, iy] = v[v_idx] 

plt.imshow(img, extent=[xmin, xmax, ymin, ymax], cmap=plt.cm.Reds, interpolation='none') 
plt.xscale('log') 
plt.yscale('log') 

plt.show() 

UPDATE

BTW,使用imshow()硬性要求?你可能想看看pcolormesh()

UPDATE II

When to use imshow over pcolormesh?

+0

沒有imshow並不難,但看起來這是正確的做法,我真的在尋找方向,從那裏我可以走,我只是不想編寫很多東西,並發現有一個python函數可以做所有事情我做了(以及更好):-) – Lin

+0

@林嗯,我會嘗試我建議的代碼,然後看'pcolor'或'pcolormesh'('pcolormesh'更好,恕我直言)。據我所知,除非你願意去3D,否則三個提到的功能,或許是'contourf()'是城裏唯一的遊戲。 –

+0

查看pcolormesh()後,看起來是正確的方式。 不,不,3d。 – Lin

-1

enter image description here

from __future__ import division 
from mpl_toolkits.mplot3d.axes3d import Axes3D 
from pylab import * 

buf = '''64 4 2743 
64 8 3531 
64 16 4543 
64 32 5222 
64 64 5730 
128 4 2778 
128 8 3500 
128 16 4657''' 
data = np.array([map(int, l.split('\t')) for l in buf.splitlines()]) 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 


clf() 
ax = subplot(projection='3d') 
c = (z/z.max()*256) 
# ex1 
ax.scatter(x,y,z,c=cm.jet(c), marker='s') 
ax.view_init(0,0) 
draw() 

Axes3D需要(X,Y,Z)輸入,所以你可以逃脫,沒有插,沒有迭代。這是否過分矯枉過正?其實只是正常的2D與顏色分散也應該是足夠的...如果你使用方形標記'並且做axis('off'),它變得更類似於imshow