2012-01-09 44 views
2

我的數據文件包含隨機分散的數據在x,y平面上。我想要的是用純色填充分散的區域。我的數據沒有排序。我試圖在matplotlib中使用scatterplot,但是我的數據文件中的點數很大,因此將它們分散繪製會使得結果大小相當大。分散的數據形成x,y平面上的小島。如何在matplotlib中填充零散區域?

+0

你能使用的等高線圖?例如,請參閱['matplotlib.pyplot.contourf'](http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.contourf)。 – Chris 2012-01-09 19:35:09

回答

3

可以計算出x的直方圖(2D)之間進行填充。然後,繪製對所有非零分箱都爲真的數組,對所有零分箱設置爲false。您可以使用參數bins來控制直方圖的分辨率。此方法返回3個數組的元組:2D直方圖和兩個1D數組,分別對應每個「邊」(x然後y)的倉步驟。您可以使用range參數控制步驟值。

例如:

import matplotlib.pyplot as plt 
import numpy as np 
np.random.seed(101) 
x = np.random.normal(0,1,10000) 
y = np.random.normal(0,1,10000) 

hist,xedge,yedge= np.histogram2d(x,y,bins=100,range=[[-4,4],[-4,4]]) 

plt.imshow(hist==0, 
      origin='lower', 
      cmap=plt.gray(), 
      extent=[xedge[0],xedge[-1],yedge[0],yedge[-1]]) 

plt.savefig('hist2d.png') 
plt.show() 

這導致:

enter image description here

黑點顯示,你有任何的數據,白點是不存在的數據。直方圖使用imshow方法顯示,該方法用於繪製圖像或矩陣。默認情況下,它將原點設置爲左上角,因此您要麼想要更改參數origin='lower',要麼需要適當調整extent參數,該參數控制範圍值:[intial x,final x,initial y,final y ]。您可以通過調整color map來控制配色方案。

由於@joaquin提到的意見,你也可以簡單地繪製imshow(hist)看到全方位的值(熱圖),而不是0或1

+1

+1你可以通過一個熱圖來執行'plt.imshow(hist)'。也許OP更喜歡它,因爲它在每個點都給出了密度的感覺,不僅是/否(更好) – joaquin 2012-01-09 20:48:09

+1

+1作爲一個方面說明,儘管'histogram2d'對於大量點是無效的。如果您使用它的數量超過幾萬個點,則會遇到內存問題。迭代或欺騙'scipy.sparse.coo_matrix'爲你做這件事變得快得多。 – 2012-01-09 21:06:19

+0

Woops,部分劃傷了我以前的評論,如果你的箱子數量很少,即使有很多點數,它也相當快。當您同時擁有大量垃圾箱和大量點時,它的效率會比其他解決方案低。另外,我對它效率低下的記憶是基於更早的版本。即使在最近的numpy版本的情況下,它仍然是非常有效的。 – 2012-01-09 21:14:13