Как вы просто показываете текстовую метку в легенде сюжета? (например, удалить строку метки в легенде)

Я хочу показать текст для метки строки в легенде, но не строку (как показано на рисунке ниже):

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

Я попытался свести к минимуму строку легенды и метку, а также перезаписать только новую метку (как в коде ниже). Однако легенда возвращает обоих.

    legend = ax.legend(loc=0, shadow=False) 
    for label in legend.get_lines(): 
        label.set_linewidth(0.0) 
    for label in legend.get_texts(): 
        label.set_fontsize(0) 

    ax.legend(loc=0, title='New Title')

person Java.beginner    schedule 04.08.2014    source источник
comment
Вы можете установить legend.handlelength на 0 - см., например. здесь.   -  person jonrsharpe    schedule 04.08.2014
comment
Спасибо @jonrsharpe. Я попробовал код, минимизировав строку и метку и перезаписав только метку, но легенда возвращает и то, и другое: legend = ax.legend(loc=0, shadow=False) для метки в legend.get_lines(): label.set_linewidth (0.0) для метки в legend.get_texts(): label.set_fontsize(0) ax.legend(loc=0, title='Новый заголовок')   -  person Java.beginner    schedule 04.08.2014
comment
@ Java.beginner Вы должны отредактировать свой вопрос, чтобы включить этот код. В комментарии не читается.   -  person tacaswell    schedule 05.08.2014
comment
Привет, @tcaswell, спасибо, я принял ответ (вторая часть из «Джо Кингтона»). Тем не менее вы хотите, чтобы я отредактировал вопрос. Спасибо   -  person Java.beginner    schedule 05.08.2014
comment
Да, чтобы будущие пользователи могли понять, о чем вы спрашивали, чтобы они могли сказать, является ли это проблемой, с которой они столкнулись.   -  person tacaswell    schedule 05.08.2014


Ответы (4)


В этот момент, возможно, проще просто использовать annotate.

Например:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(0, 1, 1000).cumsum()

fig, ax = plt.subplots()
ax.plot(data)
ax.annotate('Label', xy=(-12, -12), xycoords='axes points',
            size=14, ha='right', va='top',
            bbox=dict(boxstyle='round', fc='w'))
plt.show()

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

Однако, если вы хотите использовать legend, вот как вы это сделаете. Вам нужно будет явно скрыть маркеры легенды в дополнение к установке их размера на 0 и удалению их заполнения.

import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(0, 1, 1000).cumsum()

fig, ax = plt.subplots()
ax.plot(data, label='Label')

leg = ax.legend(handlelength=0, handletextpad=0, fancybox=True)
for item in leg.legendHandles:
    item.set_visible(False)
plt.show()

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

person Joe Kington    schedule 04.08.2014
comment
Спасибо @Joe Kington, использовали вашу вторую часть решения. Поскольку я использовал фреймворк данных, я не мог принудительно указать имя метки в желаемое по умолчанию, он принимает имя столбца, поэтому изменил имя столбца в соответствии с желаемым, а размер шрифта слишком велик, когда я пытался уменьшить размер -> легенда = ax.legend(loc=0, shadow=False) для метки в legend.get_texts(): label.set_fontsize(10) -> это возвращает старую легенду, можно ли это как-то исправить, спасибо за ваше время. - person Java.beginner; 04.08.2014
comment
@ Java.beginner - Это потому, что вы создаете новую легенду, когда вызываете legend = ax.legend(...) во второй раз. Если вы хотите получить доступ к первой легенде, используйте ax.get_legend(). - person Joe Kington; 05.08.2014
comment
Мне на самом деле нравится этот метод. Спасибо! - person Connor; 11.03.2021

Вы можете просто установить handletextpad и handlelength в легенде с помощью legend_handler, как показано ниже:

import matplotlib.pyplot as plt
import numpy as np
# Plot up a generic set of lines
x = np.arange( 3 )
for i in x:
    plt.plot( i*x, x, label='label'+str(i), lw=5 )
# Add a legend 
# (with a negative gap between line and text, and set "handle" (line) length to 0)
legend = plt.legend(handletextpad=-2.0, handlelength=0)

Подробная информация о handletextpad и handlelength содержится в документации (ссылка здесь и скопирована ниже):

handletextpad : float или None

Прокладка между дескриптором легенды и текстом. Измеряется в единицах размера шрифта. По умолчанию установлено значение None, которое принимает значение из rcParams["legend.handletextpad"].

handlelength : float или None

Длина ручек легенды. Измеряется в единицах размера шрифта. По умолчанию установлено значение None, которое принимает значение из rcParams["legend.handlelength"].

С приведенным выше кодом:

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

С несколькими дополнительными строками метки могут иметь тот же цвет, что и их линия. просто используйте .set_color() через legend.get_texts().

# Now color the legend labels the same as the lines
color_l = ['blue', 'orange', 'green']
for n, text in enumerate( legend.texts ):
    print( n, text)
    text.set_color( color_l[n] )

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

Просто вызов plt.legend() дает:

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

person tsherwen    schedule 06.04.2018
comment
Это не работает при экспорте в pdf. Остается маленькая точка. - person hanno; 04.04.2020

Я нашел другое гораздо более простое решение — просто установить масштаб маркера равным нулю в свойствах легенды:

plt.legend(markerscale=0)

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

person tsando    schedule 19.07.2016
comment
@therwen Извините, но я не думаю, что этот вопрос касался линейного сюжета. Заголовок «Как скрыть/удалить строку легенды и сохранить метку» не указывает, что это предназначено для линейного графика. Кроме того, теоретически линейный график может быть создан с помощью точечной диаграммы. Пожалуйста, рассмотрите возможность удаления отрицательной маркировки, спасибо. - person tsando; 06.04.2018
comment
По-прежнему показывает легенду для линии наименьших квадратов на точечной диаграмме, но скрывает легенду для точек. - person Anonymous; 22.05.2021

Предлагая лучший ответ: handlelength=0, например: ax.legend(handlelength=0).

person Ji Ma    schedule 20.02.2020
comment
Это просто ломает схему. - person Anonymous; 22.05.2021