Удалить заголовок легенды морского графика

Я хотел бы удалить заголовок из легенды моего морского графика. Я попытался использовать этот ответ безрезультатно:

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
fmri = sns.load_dataset("fmri")
fig, ax = plt.subplots()
g = sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri, ax=ax)
ax.legend().set_title('')

Линейный график Seaborn все еще с заголовком

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

ax.legend().set_title('Something else')

Линейный график Seaborn все еще с заголовком

Похоже, что seaborn рассматривает заголовок как скрытую запись в легенде. Как я могу это решить?


person Daniel    schedule 29.07.2018    source источник
comment
Теперь решение, вероятно, просто использует ax.get_legend().set_title().   -  person musically_ut    schedule 25.05.2019


Ответы (3)


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

Действительно, Seaborn неправильно использует метку легенды в качестве заголовка (подгруппы). Следовательно, идея может заключаться в том, чтобы либо удалить эту метку, либо заменить ее настраиваемым текстом.

Замена произвольным текстом:

legend = ax.legend()
legend.texts[0].set_text("Whatever else")

введите описание изображения здесь

Удаление ярлыка:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[1:], labels=labels[1:])

введите описание изображения здесь

После удаления метки вы, конечно, можете установить другой (настоящий) заголовок:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[1:], labels=labels[1:], title="Whatever else")

введите описание изображения здесь

person ImportanceOfBeingErnest    schedule 29.07.2018
comment
Во всех перечисленных случаях индексация больше не нужна. legend.texts[0].set_text("Whatever else") - ›legend.texts.set_text("Whatever else") ax.legend(handles=handles[1:], labels=labels[1:], ... -› ax.legend(handles=handles, labels=labels, ... - person Atif; 17.02.2020
comment
@AtifRaza Это неверно. Первое предложение привело бы к ошибке. Второе предложение не удаляет заголовок. - person ImportanceOfBeingErnest; 17.02.2020
comment
Мне также нужно было изменить заголовок легенды, но ваши предложения касались удаления заголовка легенды, а также первой записи легенды. Только что проверил ax.legend(handles=handles, labels=labels, title="Split") снова после вашего комментария, и для Seaborn 0.9.0 я уверен, что индексация из [1:] неверна. Возможно, вы можете проверить на своей стороне, есть ли у нас несоответствие версий. - person Atif; 17.02.2020
comment
ответ от @badluck также обращается к тому же самому. - person Atif; 17.02.2020
comment
@AtifRaza Этот ответ протестирован с seaborn 0.8, 0.9 и 0.10. Он правильно работает с каждым из них. - person ImportanceOfBeingErnest; 17.02.2020
comment
В заголовке вопроса даже написано lineplot! (Решение для других сюжетов уже под вопросом.) - person ImportanceOfBeingErnest; 17.02.2020

Расширение ответа ImportanceOfBeingErnest:

У меня была та же проблема, но в примере «Удаление метки» из реальной легенды были удалены заголовок и первый элемент.

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[1:], labels=labels[1:])

Таким образом, удаляется только заголовок легенды:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles, labels=labels)
person badluck    schedule 07.07.2019
comment
Индекс среза ([0:]) не нужен, так как он не действует. Я думаю, ваше решение просто воссоздает легенду без указания заголовка. Это предполагает, что у вас изначально был заголовок легенды, который seaborn не использует. Вам нужно было это решение специально для исправления seaborn сюжета? - person Gabriel; 14.10.2019

person    schedule
comment
Вместо прямого доступа к экземпляру легенды через legend_, вы также можете использовать соответствующие функции получения: g.get_legend().set_title(None) или g.legend().set_title(None) - person tschmelz; 06.11.2020