Одна запись легенды при построении нескольких кривых одним вызовом plot - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю сетку, рисуя несколько кривых, используя один вызов plot как:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.array([[0,1], [0,1], [0,1]])
y = np.array([[0,0], [1,1], [2,2]])

ax.plot([0,1],[0,2], label='foo', color='b')

ax.plot(x.T, y.T, label='bar', color='k')

ax.legend()

plt.show()

В получившейся легенде столько же столбцов, сколько и кривых (см. Ниже).Мне бы хотелось, чтобы в каждом вызове plot была только одна запись легенды (в данном случае только один раз «бар»).

Я хочу, чтобы у меня были другие команды построения (например, те, которые строят кривую 'foo'), кривые которых автоматически включены в легенду, если у них есть метка.Я специально хочу избегать ручного выбора маркеров при построении легенды, но лучше использовать функцию matplotlib, чтобы справиться с этим с помощью да / нет, включая метки при построении.Как мне этого добиться?

enter image description here

Ответы [ 2 ]

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

Вот одно из возможных решений: вы можете использовать тот факт, что подчеркивания не создают записи легенды.Поэтому установка для "_" всех меток, кроме первой, исключает их появление в легенде.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.array([[0,1], [0,1], [0,1]])
y = np.array([[0,0], [1,1], [2,2]])

ax.plot([0,1],[0,2], label='foo', color='b')

lines = ax.plot(x.T, y.T, label='bar', color='k')
plt.setp(lines[1:], label="_")
ax.legend()

plt.show()

enter image description here

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

Ниже приведен один из способов использования уже существующих маркеров и надписей легенды.Сначала вы получаете три handles, labels, а затем просто показываете первый.Таким образом, дополнительно дает вам управление не только в порядке размещения маркеров , но и того, что показывать на графике.

ax.plot(x.T, y.T,  label='bar', color='k')
handles, labels = ax.get_legend_handles_labels()
ax.legend([handles[0]], [labels[0]], loc='best')

enter image description here

Альтернативный подход , где легенды будут только взяты из конкретного сюжета (набора линий) - ax1 в этом случае

ax1 = ax.plot(x.T, y.T,  label='bar', color='k')
plt.legend(handles=[ax1[0]], loc='best')

Расширение проблемы с двумя цифрами

ax1 = ax.plot([0,1],[0,2], label='foo', color='b')
ax2 = ax.plot(x.T, y.T,  label='bar', color='k')
plt.legend(handles=[ax1[0], ax2[1]], loc='best')

Другой вариант использования циклов for, предложенный @ SpghttCd

for i in range(len(x)):
    ax.plot(x[i], y[i], label=('' if i==0 else '_') + 'bar', color='k')

ax.legend()

enter image description here

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