2014-10-06 7 views
5

Jest to podobne do Matlab: Combine the legends of shaded error and solid line mean, z wyjątkiem Matplotlib. Przykładowy kod:Połączony wpis legendy dla wykresu i wypełnienia_01 pomiędzy

import numpy as np 
import matplotlib.pyplot as plt 

x = np.array([0,1]) 
y = x + 1 
f,a = plt.subplots() 
a.fill_between(x,y+0.5,y-0.5,alpha=0.5,color='b') 
a.plot(x,y,color='b',label='Stuff',linewidth=3) 
a.legend() 

plt.show() 

Powyższy kod tworzy legendę, która wygląda tak:

enter image description here

Jak mogę utworzyć wpis legendy, która łączy cieniowanie od fill_between oraz linię od plot, więc że wygląda to mniej więcej tak (makieta wykonana w Gimp):

enter image description here

Odpowiedz

7

MPL obsługuje wejścia krotek do legendy, aby można było tworzyć wpisy legendy złożonej (patrz ostatnia ilustracja na stronie this). Jednak od teraz PolyCollections - które fill_between tworzy/zwraca - nie są obsługiwane przez legendę, więc po prostu podanie PolyCollection jako wpisu w krotce do legendy nie zadziała (a fix is anticipated for mpl 1.5.x).

Do czasu dostarczenia poprawki, polecam używanie proxy artist w połączeniu z funkcją wprowadzania "legendy krotki". Możesz użyć interfejsu mpl.patches.Patch (jak pokazano na stronie wykonawcy proxy) lub możesz po prostu użyć wypełnienia. np .:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.array([0, 1]) 
y = x + 1 
f, a = plt.subplots() 
a.fill_between(x, y + 0.5, y - 0.5, alpha=0.5, color='b') 
p1 = a.plot(x, y, color='b', linewidth=3) 
p2 = a.fill(np.NaN, np.NaN, 'b', alpha=0.5) 
a.legend([(p2[0], p1[0]), ], ['Stuff']) 

plt.show() 

Compound legend with fill_between

+0

Dzięki! Dodanie 'linewidth = 0' do' fill' sprawia, że ​​jest to wystarczająco dobre, aby usunąć "ramkę" z wpisu legendy. Jeśli wiesz, jak sprawić, by klawisze legendy miały taką samą długość, więc linia z "plot" rozciąga się na lewą/prawą krawędź prostokąta 'fill' w legendzie, to byłoby jeszcze lepiej. –

+0

Fantastyczna sztuczka! – Thriveth