python - traducir - traductor de ingles online
¿Cómo obtener diferentes líneas de colores para diferentes parcelas en una sola figura? (3)
Estoy usando matplotlib
para crear las tramas. Tengo que identificar cada trama con un color diferente que debe ser generado automáticamente por Python.
¿Puedes darme un método para poner diferentes colores para diferentes tramas en la misma figura?
Poniéndolos luego
Si no sabe el número de parcelas que va a trazar, puede cambiar los colores una vez que los haya trazado recuperando el número directamente de la parcela usando .lines
, yo uso esta solución:
Algunos datos aleatorios
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
for i in range(1,15):
ax1.plot(np.array([1,5])*i,label=i)
La pieza de código que necesitas:
colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
j.set_color(colors[i])
ax1.legend(loc=2)
Matplotlib hace esto por defecto.
P.ej:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()
Y, como ya sabrá, puede agregar fácilmente una leyenda:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend([''y = x'', ''y = 2x'', ''y = 3x'', ''y = 4x''], loc=''upper left'')
plt.show()
Si desea controlar los colores que se ciclarán a través de:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.gca().set_color_cycle([''red'', ''green'', ''blue'', ''yellow''])
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend([''y = x'', ''y = 2x'', ''y = 3x'', ''y = 4x''], loc=''upper left'')
plt.show()
¡Espero que esto ayude un poco! Si no está familiarizado con matplotlib, el tutorial es un buen lugar para comenzar .
Editar:
En primer lugar, si tiene muchas (> 5) de las cosas que desea trazar en una figura, ya sea:
- Póngalos en diferentes parcelas (considere usar algunas subtramas en una figura), o
- Use algo que no sea color (es decir, estilos de marcador o grosor de línea) para distinguir entre ellos.
De lo contrario, vas a terminar con una trama muy desordenada! Sé amable con quien alguna vez va a leer lo que sea que estés haciendo y no intentes meter 15 cosas diferentes en una figura.
Más allá de eso, muchas personas son daltónicas en diversos grados, y distinguir entre numerosos colores sutilmente diferentes es difícil para más personas de lo que te puedes imaginar.
Habiendo dicho eso, si realmente quieres poner 20 líneas en un eje con 20 colores relativamente distintos, esta es una forma de hacerlo:
import matplotlib.pyplot as plt
import numpy as np
num_plots = 20
# Have a look at the colormaps here and decide which one you''d like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])
# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
plt.plot(x, i * x + 5 * i)
labels.append(r''$y = %ix + %i$'' % (i, 5*i))
# I''m basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc=''upper center'',
bbox_to_anchor=[0.5, 1.1],
columnspacing=1.0, labelspacing=0.0,
handletextpad=0.0, handlelength=1.5,
fancybox=True, shadow=True)
plt.show()
Me gustaría ofrecer una mejora menor en la respuesta del último ciclo dada en la publicación anterior (esa publicación es correcta y aún debe ser aceptada). La suposición implícita al etiquetar el último ejemplo es que plt.label(LIST)
coloca el número de etiqueta X en LIST
con la línea correspondiente a la X vez plot
se llamó a la plot
tiempo. He tenido problemas con este enfoque antes. La forma recomendada de crear leyendas y personalizar sus etiquetas según la documentación de matplotlibs ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) es tener la sensación de que las etiquetas van junto con las tramas exactas que crees que hacen:
...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
x, = plt.plot(some x vector, some y vector) #need the '','' per ** below
plotHandles.append(x)
labels.append(some label)
plt.legend(plotHandles, labels, ''upper left'',ncol=1)