2013-09-28 117 views
8

我必須在matplotlib散點圖中表示大約30,000個點。這些點屬於兩個不同的類別,所以我想用不同的顏色來描繪它們。matplotlib中帶有重疊點的散點圖的可視化

我成功地這樣做了,但有一個問題。這些觀點在許多地區重疊,而我最後描述的這個階級將會在另一個階層上被可視化,隱藏它。此外,散點圖不可能顯示每個區域有多少點。 我也試圖用histogram2d和imshow製作2D直方圖,但很難以清晰的方式顯示屬於兩個類的點。

你能否提出一種方法來明確課程的分佈和要點的集中?

編輯:爲了更清楚,這是 link,格式爲我的數據文件「X,Y,類」

+0

爲什麼不使用兩種顏色的直方圖?它看起來不夠好嗎? –

+0

@OfirIsrael我曾嘗試使用histogram2d和與alpha級別imshow有兩個重疊的直方圖,但結果似乎很差 – markusian

+0

您是否嘗試使用輪廓而不是alpha混合顯示直方圖? http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.contour – grep

回答

12

一種方法是繪製數據作爲具有低阿爾法一個散點圖,因此您可以看到各個點以及粗略的密度。 (這樣做的缺點是,該方法具有的重疊它能夠顯示有限的範圍內 - 即,約1 /α-的最大密度。)

下面是一個例子:

enter image description here

作爲你可以想象,因爲可以表達的重疊範圍有限,所以在各個點的可見度和重疊量的表達(以及標記,繪圖等的大小)之間存在權衡。

import numpy as np 
import matplotlib.pyplot as plt 

N = 10000 
mean = [0, 0] 
cov = [[2, 2], [0, 2]] 
x,y = np.random.multivariate_normal(mean, cov, N).T 

plt.scatter(x, y, s=70, alpha=0.03) 
plt.ylim((-5, 5)) 
plt.xlim((-5, 5)) 
plt.show() 

(我假設在這裏你的意思30e3點,不30e6。對於30e6,我覺得有些類型的平均密度的情節將是必要的。)

7

您還可以通過先計算着色點散射分佈的核密度估計,以及使用密度值爲散射的每個點指定顏色。修改代碼在前面的示例:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde as kde 
from matplotlib.colors import Normalize 
from matplotlib import cm 

N = 10000 
mean = [0,0] 
cov = [[2,2],[0,2]] 

samples = np.random.multivariate_normal(mean,cov,N).T 
densObj = kde(samples) 

def makeColours(vals): 
    colours = np.zeros((len(vals),3)) 
    norm = Normalize(vmin=vals.min(), vmax=vals.max()) 

    #Can put any colormap you like here. 
    colours = [cm.ScalarMappable(norm=norm, cmap='jet').to_rgba(val) for val in vals] 

    return colours 

colours = makeColours(densObj.evaluate(samples)) 

plt.scatter(samples[0], samples[1], color=colours) 
plt.show() 

Scatter plot with density information

我前一陣子,得知這一招時,我注意到了散射函數的文檔 -

c : color or sequence of color, optional, default : 'b' 

c能是單一顏色格式字符串或長度爲N的顏色規格序列或要映射到列的一系列N號碼或使用通過kwargs指定的cmapnorm(見下文)。請注意,c不應該是單個數字RGB或RGBA序列,因爲它與要進行彩色映射的值數組難以區分。 c可以是其中行是RGB或RGBA的二維數組,但是,包括單行的情況以指定所有點的相同顏色。