matplotlib – cambia el color del marcador a lo largo de la línea de trazado

Me gustaría trazar un conjunto de datos 2D con matplotlib de manera que el color del marcador para cada punto de datos sea diferente. Encontré el ejemplo en líneas multicolores ( http://matplotlib.org/examples/pylab_examples/multicolored_line.html ). Sin embargo, esto no parece funcionar al trazar una línea con marcadores.

La solución que se me ocurrió individualmente traza cada 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) 

La ttwig resultante se ve como debería, pero la ttwig se vuelve muy lenta y la necesito bastante rápido. ¿Hay un truco inteligente para acelerar el trazado?

Creo que puedes lograr esto 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) 

La dispersión acepta c como una secuencia de flotadores que se asignarán a los colores usando el cmap.

introduzca la descripción de la imagen aquí

Al usar el timeit obtengo una disminución de 10 veces en el tiempo (aproximadamente 1.25 segundos para el método original y 76.8 ms aquí)