2013-09-28 16 views
8

Mam do reprezentowania około 30 000 punktów na wykresie punktowym w matplotlib. Punkty te należą do dwóch różnych klas, więc chcę je przedstawić w różnych kolorach.Wizualizacja wykresów punktowych z nakładającymi się punktami w matplotlib

Udało mi się to zrobić, ale jest problem. Punkty nakładają się w wielu regionach, a klasa, którą przedstawiam jako ostatnia, będzie wizualizowana na drugiej, ukrywając ją. Ponadto, przy wykresie punktowym nie można pokazać, ile punktów leży w każdym regionie. Próbowałem także zrobić histogram 2d z histogram2d i imshow, ale trudno jest pokazać punkty należące do obu klas w jasny sposób.

Czy możesz zaproponować sposób wyjaśnienia podziału klas i koncentracji punktów?

EDIT: Aby być bardziej jasne, to jest link do mojego pliku danych w formacie „x, y, klasy”

+0

Dlaczego nie histogram z dwoma kolorami? Czy to nie wygląda wystarczająco dobrze? –

+0

@OfirIsrael Próbowałem użyć histogram2d i imshow z poziomami alfa, aby mieć dwa nakładające się histogramy, ale wynik wydaje się być bardzo słaby – markusian

+0

Czy próbowałeś wyświetlać histogramy za pomocą konturu zamiast mieszania alfa? http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.contour – grep

Odpowiedz

12

Jednym ze sposobów jest wykreślić dane w postaci wykresu punktowym z niskim alfa, dzięki czemu można zobaczyć poszczególne punkty, a także przybliżoną miarę gęstości. (Wadą tego rozwiązania jest to, że rozwiązanie ma ograniczony zakres nakładania może wykazać - tj maksymalną gęstość około 1/alfa).

Oto przykład:

enter image description here

Jak możesz sobie wyobrazić, ze względu na ograniczony zakres nakładania się, które można wyrazić, istnieje kompromis między widocznością poszczególnych punktów a wyrażeniem ilości nakładania się (i wielkości znacznika, wykresu, itp.).

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

(Zakładam, że tutaj chodziło o punkty 30e3, nie 30e6. Dla 30e6, myślę, że jakiś rodzaj działki uśrednionej gęstości byłoby konieczne.)

7

Można również pokolorować punkty pierwszej informatyki oszacowanie gęstości jądra rozkładu rozproszenia i użycie wartości gęstości do określenia koloru dla każdego punktu rozproszenia. Aby zmodyfikować kod w poprzednim przykładzie:

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

dowiedziałem ten trick jakiś czas temu, kiedy zauważyłem dokumentację funkcji rozpraszania -

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

c puszka być ciągiem o pojedynczym kolorze lub sekwencją specyfikacji kolorów o długości N lub sekwencją liczb N, które mają być zamapowane na kol. lub za pomocą cmap i norm określonych przez kwargs (patrz poniżej). Zauważ, że c nie może być pojedynczą numeryczną sekwencją RGB lub RGBA, ponieważ nie można jej odróżnić od tablicy wartości, która ma być mapowana. c może to być tablica 2-D, w której wiersze to RGB lub RGBA, jednak w tym przypadku pojedynczy wiersz, aby określić ten sam kolor dla wszystkich punktów.

Powiązane problemy