2013-05-17 2 views
4

Я рисую группы кругов, используя коллекции, и я не могу сгенерировать легенду о трех категориях. Я хочу:Легенда, использующая PathCollections в matplotlib

  • Cat 1: красные круги
  • Cat 2: синие круги
  • Cat 3: желтые круги
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.collections import PatchCollection 
from matplotlib.patches import Circle 
import numpy as np 

# (modified from one of the matplotlib gallery examples) 
resolution = 50 # the number of vertices 
N = 50 
Na = 25 
Nb = 10 
x  = np.random.random(N) 
y  = np.random.random(N) 
radii = 0.1*np.random.random(30) 

xa  = np.random.random(Na) 
ya  = np.random.random(Na) 
radiia = 0.1*np.random.random(50) 


xb  = np.random.random(Nb) 
yb  = np.random.random(Nb) 
radiib = 0.1*np.random.random(60) 

patches = [] 
patchesa = [] 
patchesb = [] 
for x1,y1,r in zip(x, y, radii): 
    circle = Circle((x1,y1), r) 
    patches.append(circle) 

for x1,y1,r in zip(xa, ya, radiia): 
    circle = Circle((x1,y1), r) 
    patchesa.append(circle) 

for x1,y1,r in zip(xb, yb, radiib): 
    circle = Circle((x1,y1), r) 
    patchesb.append(circle) 


fig = plt.figure() 
ax = fig.add_subplot(111) 

colors = 100*np.random.random(N) 
p = PatchCollection(patches, cmap=matplotlib.cm.jet, alpha=0.4, label= "Cat 1", facecolor="red") 
pa = PatchCollection(patchesa, cmap=matplotlib.cm.jet, alpha=0.3, label= "Cat 2", facecolor="blue") 
pb = PatchCollection(patchesb, cmap=matplotlib.cm.jet, alpha=0.4, label= "Cat 3", facecolor="yellow") 
#p.set_array(colors) 
ax.add_collection(p) 
ax.add_collection(pa) 
ax.add_collection(pb) 
ax.legend(loc = 2) 
plt.colorbar(p) 

print p.get_label() 

plt.show() 

PathCollection s не являются Iterable объекты, поэтому пытаются генерировать легенда следующим образом;

legend([p, pa, pb], ["cat 1", "2 cat", "cat 3"]) 

не работает.

Как заголовок может появиться?

Моя система запуска на Python 2.7 и Matplotlib 1.2.0_1

Заметим, что команда print p.get_label() показывает, что объект имеет соответствующий ярлык, но Matplotlib не в состоянии установить легенду.

+0

http://matplotlib.org/users /legend_guide.html#using-proxy-artist – tacaswell

ответ

6

Одним из возможных решений является добавление Line2D объектов для использования в легенде, также известных как использование прокси-художников. Для достижения этой цели необходимо добавить from matplotlib.lines import Line2D в сценарий, а затем вы можете заменить этот код:

ax.legend(loc = 2) 
plt.colorbar(p) 

print p.get_label() 

с этим:

circ1 = Line2D([0], [0], linestyle="none", marker="o", alpha=0.4, markersize=10, markerfacecolor="red") 
circ2 = Line2D([0], [0], linestyle="none", marker="o", alpha=0.3, markersize=10, markerfacecolor="blue") 
circ3 = Line2D([0], [0], linestyle="none", marker="o", alpha=0.4, markersize=10, markerfacecolor="yellow") 

plt.legend((circ1, circ2, circ3), ("Cat 1", "Cat 2", "Cat 3"), numpoints=1, loc="best") 

enter image description here

+0

Great.I больше заботился о том, чтобы найти способ включить легенду, используя patchcollections, не считающийся простым способом решить эту проблему. – Daeron

+0

@Daeron Если это решило вашу проблему, пожалуйста [примите ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235), поэтому ваш вопрос отмеченные как _solved_ для дальнейшего использования, а также предоставление нам обеих репутации! – hooy

Смежные вопросы