Mostrar solo ciertos elementos en la leyenda

4 minutos de lectura

Avatar de usuario de Funsaized
Funsaizado

Actualmente estoy trazando un gráfico de barras apiladas de una gran cantidad de datos taxonómicos, y solo deseo mostrar especies significativas en la leyenda (de ~ 500, deseo mostrar ~ 25). ¿Hay una manera simple de hacer esto? A continuación se muestra el código que tengo:

labels=['0','20','40','60','80','100','120']
ax1=subj1df.plot(kind='barh', stacked=True,legend=True,cmap='Paired', grid=False)
legend(ncol=2,loc=2, bbox_to_anchor=(1.05, 1), borderaxespad=0.)
label1=['Baseline','8h','24h','48h','96h','120h']
ax1.set_yticklabels(label1, fontdict=None, minor=False)
plt.title('Subject 1 Phyla',fontweight="bold")
plt.savefig('Subject1Phyla.eps', format="eps", dpi=1000)
ax1.set_xticklabels(labels)

Editar: intenté agregar esto para mostrar solo una entrada de leyenda, sin embargo, solo devuelve una leyenda vacía:

h, l = ax1.get_legend_handles_labels()
legend(l[4],h[4],ncol=2,loc=2, bbox_to_anchor=(1.05, 1), borderaxespad=0.)

avatar de usuario de jlansey
jlansey

Esto funciona:

plt.plot(x, y, label="_nolegend_")

fuente

  • Mmm. Mala suerte para el pobre bastardo que quiere que su etiqueta diga _nolegend_.

    – Jason S.

    6 de enero de 2019 a las 16:26

  • ¿Hay alguna razón por la que los desarrolladores eligieron esto sobre label=None ?

    – Rovyko

    16 abr 2019 a las 22:44

  • Todo lo que comienza con _ se salta de la leyenda.

    – StSav012

    15 mayo 2019 a las 17:21


  • ¿Cómo puedo etiquetar mi parcela como _nolegend_ ? :PAG

    – Jack negro 21

    19 de junio de 2020 a las 10:46

  • como se muestra, agregando el parámetro: label='_nolegend_'

    – jlansey

    24 de junio de 2020 a las 13:04


A menudo inserto una etiqueta vacía para las leyendas que no quiero mostrar. Hice un ejemplo extremadamente simple que espero te ayude. Deberá ajustar esto a sus propios datos, pero los elementos que necesita deben estar allí.

import matplotlib.pyplot as plt 
import numpy as np

myY=np.random.randint(20, size=10)
myX=np.arange(0,len(myY))

selected=[5,10,15]

fig = plt.figure()
for X,Y in zip(myX,myY):
    if Y in selected:
        mylabel="label = %s"%(Y); mycolor="blue"
    else:
        mylabel=None; mycolor="red"
    plt.scatter(X,Y,50, color=mycolor, label=mylabel)
plt.legend()
plt.show()

Esto crea la siguiente trama:
ingrese la descripción de la imagen aquí

  • legend también toma una lista de artistas y una lista de etiquetas para controlar con precisión lo que entra en su leyenda

    – tacoswell

    11 de julio de 2014 a las 4:46

  • Esto podría funcionar, pero ¿hay alguna forma de que la selección sea una lista de cadenas de las entradas de la leyenda que quiero? mi gráfico es un gráfico de barras apiladas de muchas entradas.

    – Funsaizado

    11 de julio de 2014 a las 14:10

  • Seguro. Para cada una de sus entradas (identificadas por X, Y y nombre), verifique si su entrada actual está en una lista de etiquetas seleccionadas para las que desea mostrar la leyenda. Es difícil mostrarle cómo hacer esto a menos que muestre más información sobre cómo se ven sus datos.

    –Trond Kristiansen

    11/07/2014 a las 15:50

  • Pruebe la solución indicada con label=’sin leyenda

    – Philipp Schwarz

    7 oct 2016 a las 23:13

  • Philipp significa label='_nolegend_' (tenga en cuenta los guiones bajos), vea la respuesta de jlansey.

    – Checanología

    23 de agosto de 2018 a las 19:23


Avatar de usuario de Andrey Selivanov
andréi selivanov

Por alguna razón, ambas respuestas no funcionaron para mi situación. Lo que funcionó, y en realidad se indicó anteriormente:

legend también toma una lista de artistas y una lista de sellos para controlar con precisión lo que incluye tu leyenda – tacaswell 11 jul.

import pandas as pd
import matplotlib.pyplot as plt
import pylab

pd.Series(range(10)).plot(color="grey")
x = list(range(10))
y = [i + 1 for i in x]  
scat1 = plt.scatter(x, y)

pylab.legend([scat1],['moved points'], loc="upper left")

plt.show()

El resultado del código:
El resultado del código:

  • Solución limpia que se escala correctamente, gracias por compartir

    – jlandercy

    19 de abril de 2020 a las 5:09

También puede usar una variable de cadena vacía:

    plt.plot(xData, yData, ..., label=str())

Al pasar un objeto str() vacío, no escribe nada.

Referencia de la API de Matplotlib

Sé que esta publicación se publicará hace una década, pero estaba buscando una manera de hacer algo similar y esta publicación estaba en la parte superior de los resultados de Google. Estaba trabajando con el seguimiento de datos del uso del montón de un proceso y los procesos que generaba. La mayoría de los procesos consumían una cantidad insignificante de memoria y mostrar la leyenda completa habría sido difícil de manejar. Terminé con la siguiente solución:

label_names = heap_df.columns.values.tolist()
max_per_proc = heap_df.max()
max_heap_overall = max(max_per_proc)

fig, ax = plt.subplots()
plt.stackplot(heap_df.index, heap_df.values.T, labels=label_names)
lines, labels = ax.get_legend_handles_labels()
lbl_idx = []
for idx in range(len(labels)):
    if max_per_proc[labels[idx]] / max_heap_overall > 0.01:
        lbl_idx.append(idx)
ax.legend([lines[i] for i in lbl_idx], [labels[i] for i in lbl_idx])
        
plt.show()

¿Ha sido útil esta solución?