2015-02-28 13 views
11

Devo tracciare più linee e marker con matplotlib creando un loop e ho già impostato il ciclo del colore degli assi nel file param matolibrc. In ogni ciclo del ciclo viene creato un insieme di marcatori e linee (le linee sono create da un comando separato). Ma il marcatore e i colori delle linee sono diversi secondo il ciclo del colore degli assi. Voglio ogni volta che il ciclo esegue il marker e le linee devono avere lo stesso colore di quel ciclo.Come impostare lo stesso colore per marcatori e linee in un ciclo di trama matplotlib?

Ho incluso il codice riproducibili:

import numpy as np 
import itertools 
import matplotlib.pyplot as plt 
m = 5 
n = 5 
x = np.zeros(shape=(m, n)) 
plt.figure(figsize=(5.15, 5.15)) 
plt.clf() 
plt.subplot(111) 
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p')) 
for i in range(1, n): 
    x = np.dot(i, [1, 1.1, 1.2, 1.3]) 
    y = x ** 2 
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next()) 
    plt.plot(x, y, linestyle='-') 
plt.ylabel(r'\textit{y}', labelpad=6) 
plt.xlabel(r'\textit{x}', labelpad=6) 
plt.show() 

Utilizzando questo codice l'uscita che ottengo è:

enter image description here

Ho bisogno i marcatori e le linee tracciate nella loro gamma di essere della stesso colore. Come può essere fatto in matplotlib?

risposta

14

Vi presento due modi. Il primo è probabilmente più pulito: scorre una volta, e all'interno di ciascun ciclo, ottiene il colore successivo, quindi esegue due comandi di tracciamento con quel colore. Nel secondo, scorre in loop e fa tutti i marker e poi reimposta i colori e lo ricomincia e fa le linee.

primo metodo

Direttamente accedere al ciclo di colore utilizzando color=next(ax._get_lines.prop_cycler)['color']:

import numpy as np 
import itertools 
import matplotlib.pyplot as plt 
m = 5 
n = 5 
x = np.zeros(shape=(m, n)) 
plt.figure(figsize=(5.15, 5.15)) 
plt.clf() 
plt.subplot(111) 
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p')) 

ax = plt.gca() 
for i in range(1, n): 
    x = np.dot(i, [1, 1.1, 1.2, 1.3]) 
    y = x ** 2 
    # 
    #for matplotlib before 1.5, use 
    #color = next(ax._get_lines.color_cycle) 
    #instead of next line (thanks to Jon Loveday for the update) 
    # 
    color = next(ax._get_lines.prop_cycler)['color'] 
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next(), color=color) 
    plt.plot(x, y, linestyle='-', color = color) 
plt.ylabel(r'$y$', labelpad=6) 
plt.xlabel(r'$x$', labelpad=6) 
plt.savefig('test2.png') 

Inoltre, notato ho cambiato il tuo \textit{y} a $y$. Di solito, in realtà, si desiderano i font matematici piuttosto che il corsivo.

enter image description here

secondo metodo

Se non si desidera inviare un colore come argomento, è possibile reimpostare il ciclo di colore e passare attraverso il circuito due volte. Qui lo reimpostato prima del primo ciclo e poi di nuovo prima del secondo ciclo solo per assicurarmi che stia iniziando dallo stesso punto.

import numpy as np 
import itertools 
import matplotlib.pyplot as plt 
m = 5 
n = 5 
x = np.zeros(shape=(m, n)) 
plt.figure(figsize=(5.15, 5.15)) 
plt.clf() 
plt.subplot(111) 
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p')) 

plt.gca().set_color_cycle(None) 
for i in range(1, n): 
    x = np.dot(i, [1, 1.1, 1.2, 1.3]) 
    y = x ** 2 
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next()) 
plt.gca().set_color_cycle(None) 
for i in range(1, n): 
    x = np.dot(i, [1, 1.1, 1.2, 1.3]) 
    y = x ** 2 
    plt.plot(x, y, linestyle='-') 
plt.ylabel(r'$y$', labelpad=6) 
plt.xlabel(r'$x$', labelpad=6) 
plt.savefig('test.png') 

enter image description here

2

noti che in matplotlib 1.5 in poi, color_cycle è stato sostituito da prop_cycler. La seconda opzione richiede:

color = next(ax._get_lines.prop_cycler)['color'] 
Problemi correlati