2013-09-04 27 views
8

Vorrei tracciare un set di dati 2D con matplotlib in modo che il colore dell'indicatore per ciascun punto di dati sia diverso. Ho trovato l'esempio su linee multicolore (http://matplotlib.org/examples/pylab_examples/multicolored_line.html). Tuttavia, questo non sembra funzionare quando si traccia una linea con marcatori.matplotlib - cambia il colore dell'indicatore lungo la linea di trama

La soluzione mi è venuta singolarmente trame ogni punto:

import matplotlib.cm as cm 
import matplotlib.pyplot as plt 
import numpy as np 

# The data 
x = np.linspace(0, 10, 1000) 
y = np.sin(2 * np.pi * x) 

# The colormap 
cmap = cm.jet 

# Create figure and axes 
fig = plt.figure(1) 
fig.clf() 
ax = fig.add_subplot(1, 1, 1) 

# Plot every single point with different color 
for i in range(len(x)): 
    c = cmap(int(np.rint(x[i]/x.max() * 255))) 
    ax.plot(x[i], y[i], 'o', mfc=c, mec=c) 
    ax.set_xlim([x[0], x[-1]]) 
    ax.set_ylim([-1.1, 1.1]) 
    ax.set_xlabel('x') 
    ax.set_ylabel('y') 

plt.draw() 
plt.show() 

# Save the figure 
fig.savefig('changing_marker_color.png', dpi=80) 

Il grafico risultante sembra come dovrebbe, ma il tracciato diventa veramente lento e ho bisogno abbastanza velocemente. C'è un trucco intelligente per accelerare la trama?

risposta

15

io credo che si possa raggiungere questo obiettivo con ax.scatter:

# The data 
x = np.linspace(0, 10, 1000) 
y = np.sin(2 * np.pi * x) 

# The colormap 
cmap = cm.jet 

# Create figure and axes 
fig = plt.figure(1) 
fig.clf() 
ax = fig.add_subplot(1, 1, 1) 

c = np.linspace(0, 10, 1000) 
ax.scatter(x, y, c=c, cmap=cmap) 

Scatter accetta c come una sequenza di carri allegorici, che verrà mappata colori utilizzando la cmap.

enter image description here

Utilizzando timeit ottengo un 10 diminuzione volte nel tempo (circa 1,25 secondi per il metodo originale e 76.8 ms qui)

Problemi correlati