2009-09-16 2 views
10

Я немного новичок в этом и пытаюсь создать диаграмму рассеяния с пользовательскими размерами и цветами пузырьков. Диаграмма отображается хорошо, но как мне получить легенду, говорящую о цветах. Это, насколько я получил:Matplotlib Legend for Scatter с пользовательскими цветами

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) 

Эта нить была полезной, но не мог заставить его решить мою проблему: Matplotlib: Legend not displayed properly

ответ

9

Возможно, это полезно example.

В общем, элементы в легенде связаны с каким-то объектом, нанесенным на график. scatter функция/метод рассматривает все круги как единый объект, см:

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

Таким образом, решение заключается в создании нескольких объектов. Следовательно, вызывая scatter несколько раз.

К сожалению, более новая версия matplotlib, похоже, не использует прямоугольник в легенде. Таким образом, легенда будет содержать очень большие круги, так как вы увеличили размер ваших объектов разброса.

Функция легенды как аргумент ключевого слова markerscale для управления размером легендарных маркеров, но кажется, что она сломана.

Update:

Legend guide рекомендует использовать Proxy Artist в подобных случаях. В Color API указаны действительные значения 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')) 

Чтобы получить цвета, используемые ранее в сюжете, использовать приведенный выше пример, как:

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

Этот пример сделает сюжет, как:

Matplotlib with custom legend

+0

Хорошее решение, даже если оно не работает из-за сломанной метки. – tom10

+0

Этот пример очень полезен. Должны идти и делать правильную работу некоторое время, но вернемся к ней сегодня вечером. – PhoebeB

-3

Посмотрите в это:

http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.legend

Надеюсь, что это поможет. Если не просто попросить больше :)

+0

Это отлично подходит для линий но не знаете, как применить его к разбросу, где каждая отдельная точка отличается от цвета? – PhoebeB