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: легенда не отображается должным образом

Ответ 1

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

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

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

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

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

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

Update:

Руководство по легенде рекомендует использовать Прокси-исполнитель в подобных случаях. 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