2009-09-16 8 views
10

Jestem trochę początkująca i staram się stworzyć wykres rozproszenia z niestandardowymi rozmiarami i kolorami bąbelków. Wykres wyświetla się dobrze, ale jak uzyskać legendę mówiącą, do czego odnoszą się kolory. To ile mam:Legenda Matplotlib do rozpraszania z niestandardowymi kolorami

inc = [] 
out = [] 
bal = [] 
col = [] 

fig=Figure() 
ax=fig.add_subplot(111) 

inc = (30000,20000,70000) 
out = (80000,30000,40000) 
bal = (12000,10000,6000) 
col = (1,2,3) 
leg = ('proj1','proj2','proj3') 

ax.scatter(inc, out, s=bal, c=col) 
ax.axis([0, 100000, 0, 100000]) 

ax.set_xlabel('income', fontsize=20) 
ax.set_ylabel('Expenditure', fontsize=20) 
ax.set_title('Project FInancial Positions %s' % dt) 
ax.grid(True) 
canvas=FigureCanvas(fig) 
response=HttpResponse(content_type='image/png') 
canvas.print_png(response) 

Ten wątek był pomocny, ale nie mogłem go rozwiązać mój problem: Matplotlib: Legend not displayed properly

Odpowiedz

9

Może to example jest pomocne.

Ogólnie rzecz biorąc, elementy w legendzie są powiązane z pewnym obiektem o rozmiarze (). scatter funkcja/metoda traktuje wszystkie koła jest pojedynczy przedmiot, patrz

print type(ax.scatter(...)) 

ten sposób roztwór jest utworzenie wielu obiektów. Dlatego wielokrotnie dzwoniąc pod numer scatter.

Niestety, nowsza wersja matplotlib wydaje się nie używać prostokąta w legendzie. W związku z tym legenda będzie zawierała bardzo duże koła, ponieważ zwiększysz rozmiar swoich obiektów z wykresami rozproszonymi.

Legenda służy jako argument słowa kluczowego markerscale do kontrolowania rozmiaru markerów legendy, ale wydaje się być uszkodzony.

Aktualizacja:

Legend guide zaleca stosowanie Proxy Artist w podobnych przypadkach. Parametr Color API objaśnia ważne wartości fc.

p1 = Rectangle((0, 0), 1, 1, fc="b") 
p2 = Rectangle((0, 0), 1, 1, fc="g") 
p3 = Rectangle((0, 0), 1, 1, fc="r") 
legend((p1, p2, p3), ('proj1','proj2','proj3')) 

Aby uzyskać kolory używane wcześniej w działce, należy powyższy przykład tak:

pl1, = plot(x1, y1, '.', alpha=0.1, label='plot1') 
pl2, = plot(x2, y2, '.', alpha=0.1, label='plot2') 
p1 = Rectangle((0, 0), 1, 1, fc=pl1.get_color()) 
p2 = Rectangle((0, 0), 1, 1, fc=pl2.get_color()) 
legend((p1, p2), (pl1.get_label(), pl2.get_label()), loc='best') 

Ten przykład wykorzysta fabuła jak:

Matplotlib with custom legend

+0

Dobre rozwiązanie, nawet jeśli nie działa z powodu zepsutej skali markerów. – tom10

+0

Ten przykład jest bardzo pomocny. Muszę iść i zrobić odpowiednią pracę przez jakiś czas, ale wrócę do tego wieczorem. – PhoebeB