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

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

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

    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')

5 ответов

Решение

На этом этапе, возможно, проще использовать 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()

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

plt.legend(markerscale=0)

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

Вы можете просто установить 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" ].

длина ручки: поплавок или нет

Длина легенды обрабатывает. Измеряется в единицах измерения размера шрифта. По умолчанию 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() дает:

Suggesting the best answer: handlelength=0, for example: ax.legend(handlelength=0).

Для пользовательских легенд также добавьте lw=0.

      p5 = mpatches.Patch(color="green",  label="r={}".format(cor_rh), lw=0)
p6 = mpatches.Patch(color=p1.get_color(), label="t={}".format(rh_trend), lw=0)
p7 = mpatches.Patch(color=p3.get_color(), label="t={}".format(hx_trend), lw=0)


ln1 = [p5,p6,p7]
host.legend(handles=ln1, loc=1,  labelcolor='linecolor, handlelength=0)
Другие вопросы по тегам