2012-12-11 5 views
10

Su determinati monitor LCD, il colore delle linee orizzontali nella legenda è difficile da distinguere. (Vedi l'immagine allegata). Quindi, invece di tracciare una linea nella legenda, è possibile semplicemente codificare il codice del testo stesso? così un altro parole, hanno "y = 0 x" in blu, "y = 1x" in verde, ecc ...Matricola: testo con codice colore nella legenda invece di una riga

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i * x, label='$y = %ix$' % i) 

ax.legend() 

plt.show() 

enter image description here

PS. se la linea potesse essere resa più spessa solo nella legenda, ma non nella trama, funzionerebbe anche questa.

risposta

7

Basta impostare il linewidth della leggenda maniglie:

In [55]: fig, ax = plt.subplots() 

In [56]: x = np.arange(10) 

In [57]: for i in xrange(5):      
    ....:  ax.plot(x, i * x, label='$y = %ix$' % i) 
    ....:  

In [58]: leg = ax.legend(loc='best') 

In [59]: for l in leg.legendHandles:    
    ....:  l.set_linewidth(10) 
    ....:  

legend_linewidth.png

15

mi chiedevo la stessa cosa. Ecco cosa mi è venuto in mente per cambiare il colore del carattere nella legenda. Io non sono del tutto soddisfatto di questo metodo, dal momento che sembra un po 'goffo, ma sembra ottenere il lavoro fatto [Edit: vedi sotto per un modo migliore]:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

colors = [] 
for i in xrange(5): 
    line, = ax.plot(x, i * x, label='$y = %ix$' % i) 
    colors.append(plt.getp(line,'color')) 

leg = ax.legend() 

for color,text in zip(colors,leg.get_texts()): 
    text.set_color(color) 

plt.show() 

the colorful results

2016 Edit:

In realtà, c'è un modo migliore. Puoi semplicemente scorrere le righe nella legenda, evitando di dover tenere traccia dei colori quando vengono tracciate le linee. Molto meno goffo. Ora, cambiare i colori della linea è fondamentalmente un one-liner (okay, in realtà è un doppio rivestimento). Ecco l'esempio completo:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i*x, label='$y = %ix$'%i) 

leg = ax.legend() 

# change the font colors to match the line colors: 
for line,text in zip(leg.get_lines(), leg.get_texts()): 
    text.set_color(line.get_color()) 

plt.show() 

2017 Edit: Infine, se davvero si desidera che il colore di testo invece di una linea (come suggerisce il titolo), allora si può sopprimere le righe della legenda utilizzando

leg = ax.legend(handlelength=0) 
6

Questa operazione può essere eseguita in modo pulito dopo tutto tracciamento viene effettuata tramite il testo leggenda getter/setter e linea d'asse getter/setter. Impostare i colori del testo della legenda in modo che siano identici ai colori della linea in un ciclo for prima del plottaggio.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i * x, label='$y = %ix$' % i) 

leg = ax.legend() 

def color_legend_texts(leg): 
    """Color legend texts based on color of corresponding lines""" 
    for line, txt in zip(leg.get_lines(), leg.get_texts()): 
     txt.set_color(line.get_color()) 

color_legend_texts(leg)  

plt.show() 

La differenza principale da notare in questa risposta è che la formattazione della trama può essere completamente disaccoppiato dal operazione di tracciatura.