Увеличьте размеры патчей в качестве легенды внутри matplotlib - PullRequest
0 голосов
/ 19 декабря 2018

Я добавляю патчи в график внутри matplotlib, используя класс from matplotlib.patches import Patch.Пожалуйста, см. Пример кода ниже -

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

n = 5
hatch_1 = 'o'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='Hatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='Hatch 2', hatch=hatch_2, alpha=opacity)

# add legends
plt.legend(handles=[patch_1, patch_2], loc='upper right')

plt.show()

Ниже приведен сгенерированный график - screenshot of the plot

Люки, используемые для легенд, не видны должным образом.Я думаю, если я сделаю патчи больше, они будут видны.

Как сделать патчи больше?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Самый простой способ, предлагаемый matplotlib, на мой взгляд, это определить свойства легенды, используя размер prop для увеличения / уменьшения размера легенды.Вам просто нужно сделать следующее, где вы можете выбрать 'size' в качестве предпочтительного.

plt.legend(handles=[patch_1, patch_2], loc='best', prop={'size': 24})

enter image description here

0 голосов
/ 19 декабря 2018

Вы можете изменить размер патчей легенды несколькими способами.

Во-первых, вы можете увеличить ширину с помощью опции handlelength до plt.legend.

Однако, с помощью kwargs нет возможности увеличить их высоту.Так что нам нужно перебрать патчи после создания легенды.Если мы сохраним ссылку на легенду при ее создании leg = plt.legend(...), то мы можем зациклить патчи, используя for patch in leg.get_patches():.

. Затем вы можете изменить высоту патча, используя patch.set_height().

Тем не менее, все эти переделки означают, что они не будут выровнены совершенно правильно.Поэтому нам также необходимо немного изменить их вертикальное положение (используя patch.set_y()).

Я также обнаружил, что это помогло увеличить вертикальный интервал надписей в легенде, чтобы они подходили по размеру (используйте labelspacingkwarg).

И, наконец, я добавил новую строку в начале надписей легенды, чтобы все это выглядело красиво (label='\nHatch 1').

Полный сценарий приведен ниже.Вы можете поиграть со значениями labelspacing, handlelength, patch.set_height() и patch.set_y() в соответствии с вашими потребностями.

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

n = 5
hatch_1 = 'o'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='\nHatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='\nHatch 2', hatch=hatch_2, alpha=opacity)

# add legends
leg = plt.legend(handles=[patch_1, patch_2], loc='upper right', labelspacing=1.5, handlelength=4)

for patch in leg.get_patches():
    patch.set_height(22)
    patch.set_y(-6)

plt.show()

enter image description here

0 голосов
/ 19 декабря 2018
n = 5
hatch_1 = 'O'
hatch_2 = '.'
opacity = 0.4
bar_width = 0.4

y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

bars = plt.bar(x, y, bar_width, align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_1)

y = np.random.randint(low=0, high=10, size=n)
bars = plt.bar(x + bar_width, y, bar_width,
               align='center',  alpha=opacity, fill=False)
for bar in bars:
    bar.set_hatch(hatch_2)

patch_1 = Patch(fill=False, label='Hatch 1', hatch=hatch_1, alpha=opacity)
patch_2 = Patch(fill=False, label='Hatch 2', hatch=hatch_2, alpha=opacity)
plt.rcParams['figure.figsize'] = (25,15)
# add legends
plt.legend(handles=[patch_1, patch_2], loc='upper right')

plt.show()

Сделайте свой маленький o как O и увеличьте размер фигуры, что будет иметь смысл, я думаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...