Как создать два объекта легенды для одного экземпляра сюжета? - PullRequest
0 голосов
/ 27 августа 2018

Я использую следующий пример кода для генерации гистограммы.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 5, 5)
y = np.exp(x)
w = x[1] - x[0]

colors = ['blue' if idx % 2 == 0 else 'red' for idx in range(len(x))]

fig, ax = plt.subplots()
ax.bar(x, y, width=w, color=colors, label='sample plot')
ax.legend()
plt.show()
plt.close(fig)

Bar plot

Я бы хотел показать красный и синий цвета в объекте легенды. Я могу думать о 2 визуально привлекательных идеях. Первая идея состоит в том, чтобы создать два прямоугольных объекта (один красный, другой синий), которые будут центрированы вертикально относительно метки легенды. Вторая идея - наложить половину прямоугольника (красным цветом) на объект легенды (синим цветом). Но я не знаю, как этого достичь. Я посмотрел на документы Matplotlib, я просто запутался. Как я могу сделать это?

1 Ответ

0 голосов
/ 27 августа 2018

Я полагаю, что простой вариант - использовать matplotlib.legend_handler.HandlerTuple и поставить кортеж из красного и синего прямоугольников в маркеры легенды.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.legend_handler

x = np.linspace(0, 5, 5)
y = np.exp(x)
w = x[1] - x[0]

colors = ['blue' if idx % 2 == 0 else 'red' for idx in range(len(x))]

fig, ax = plt.subplots()
bars = ax.bar(x, y, width=w, color=colors, label='sample plot')

ax.legend(handles = [tuple(bars[:2])], labels=['sample plot'], loc='upper left', 
          handler_map = {tuple: matplotlib.legend_handler.HandlerTuple(None)})

plt.show()

enter image description here

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

...