Добавить ось к легенде - PullRequest
       5

Добавить ось к легенде

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

Я создаю линейный участок из кадра данных с seaborn и хочу добавить горизонтальную линию к графику.Это работает нормально, но у меня возникают проблемы с добавлением горизонтальной линии к легенде.

Вот минимальный проверяемый пример:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

x = np.array([2, 2, 4, 4])
y = np.array([5, 10, 10, 15])
isBool = np.array([True, False, True, False])

data = pd.DataFrame(np.column_stack((x, y, isBool)), columns=["x", "y", "someBoolean"])
print(data)

ax = sns.lineplot(x="x", y="y", hue="someBoolean", data=data)

plt.axhline(y=7, c='red', linestyle='dashed', label="horizontal")

plt.legend(("some name", "some other name", "horizontal"))

plt.show()

Это приводит к следующему графику:

incorrect plot

Легенды для «какого-то имени» и «другого имени» отображаются правильно, но «горизонтальная» легенда просто пуста.Я попытался просто использовать plt.legend(), но тогда легенда состоит из, казалось бы, случайных значений из набора данных.

Есть идеи?

1 Ответ

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

Простое использование plt.legend() сообщает вам, какие данные выводятся на график:

enter image description here

Вы используете someBoolean в качестве оттенка.Таким образом, вы по сути создаете две строки, применяя логическую маску к вашим данным.Одна строка для значений, которые являются ложными (показано как 0 в легенде выше), другая для значений, которые являются истинными (показаны как 1 в легенде выше).

Чтобы получить легенду, которую вы хотите, вынужно установить ручки и метки.Вы можете получить их список, используя ax.get_legend_handles_labels().Затем обязательно опустите первую ручку, у которой, как показано выше, нет артиста:

ax = sns.lineplot(x="x", y="y", hue="someBoolean", data=data)

plt.axhline(y=7, c='red', linestyle='dashed', label="horizontal")

labels = ["some name", "some other name", "horizontal"]
handles, _ = ax.get_legend_handles_labels()

# Slice list to remove first handle
plt.legend(handles = handles[1:], labels = labels)

Это дает:

enter image description here

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