Установите постоянный matplotlib markersize на постоянную - PullRequest
0 голосов
/ 25 ноября 2018

Я делаю диаграмму, используя matplotlib, и в ней есть plt.Circles и plt.axvlines для представления различных форм.Мне нужна легенда для описания этих фигур, но проблема в том, что маркер легенды (часть изображения) меняет размер в зависимости от ввода, что выглядит ужасно.Как мне установить постоянный размер?

fig = plt.figure(figsize=(6.4, 6), dpi=200, frameon=False)
ax = fig.gca()
# 3 Circles, they produce different sized legend markers
ax.add_patch(plt.Circle((0,0), radius=1, alpha=0.9, zorder=0, label="Circle"))
ax.add_patch(plt.Circle((-1,0), radius=0.05, color="y", label="Point on Circle"))
ax.add_patch(plt.Circle((1, 0), radius=0.05, color="k", label="Opposite Point on Circle"))
# A vertical line which produces a huge legend marker
ax.axvline(0, ymin=0.5-0.313, ymax=0.5+0.313, linewidth=12, zorder=1, c="g", label="Vertical Line")
ax.legend(loc=2)
ax.set_xlim(-2,1.2) # The figsize and limits are meant to preserve the circle's shape
ax.set_ylim(-1.5, 1.5)
fig.show()

Я видел решения, включающие размер legend.legendHandles [0] ._ или различные его варианты, и кажется, что размер не меняется независимоустановленного мной значения

1 Ответ

0 голосов
/ 25 ноября 2018

Маркеры легенды для кругов различаются по размеру, поскольку первый круг не имеет краевого цвета, а два других имеют цвет края, установленный с помощью color.Вместо этого вы можете установить цвет лица круга.Кроме того, вы можете установить ширину линии всех трех кругов равной.

Маркер легенды для линии настолько велик, потому что он просто копирует атрибут из линии на графике.Если вы хотите использовать другую ширину линии, вы можете обновить ее с помощью соответствующего обработчика легенды.

import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D

def update_prop(handle, orig):
    handle.update_from(orig)
    handle.set_linewidth(2)

fig, ax = plt.subplots(figsize=(6.4, 6), dpi=200, frameon=False)

# 3 Circles, set the facecolor instead of edge- and face-color
ax.add_patch(plt.Circle((0,0), radius=1, alpha=0.9, zorder=0, label="Circle"))
ax.add_patch(plt.Circle((-1,0), radius=0.05, facecolor="y", label="Point on Circle"))
ax.add_patch(plt.Circle((1, 0), radius=0.05, facecolor="k", label="Opposite Point on Circle"))

# Line, update the linewidth via 
ax.axvline(0, ymin=0.5-0.313, ymax=0.5+0.313, linewidth=12, zorder=1, c="g", label="Vertical Line")
ax.legend(loc=2, handler_map={plt.Line2D:HandlerLine2D(update_func=update_prop)})


ax.set_xlim(-2,1.2)
ax.set_ylim(-1.5, 1.5)
plt.show()

enter image description here

...