how font change python colors matplotlib

font - subplot python



Cambiando elegantemente el color de un marco de parcela en matplotlib (3)

Este es un tipo de pregunta de seguimiento para this publicación, donde se discutió la coloración de los ejes, las marcas y las etiquetas. Espero que esté bien abrir una nueva pregunta extendida para esto.

Cambiar el color de un cuadro completo (marcas y ejes) alrededor de un trazado doble (a través de add_subplot ) con ejes [ax1, ax2] da como resultado una gran cantidad de código. Este fragmento de código cambia el color del marco de la gráfica superior :

ax1.spines[''bottom''].set_color(''green'') ax1.spines[''top''].set_color(''green'') ax1.spines[''left''].set_color(''green'') ax1.spines[''right''].set_color(''green'') for t in ax1.xaxis.get_ticklines(): t.set_color(''green'') for t in ax1.yaxis.get_ticklines(): t.set_color(''green'') for t in ax2.xaxis.get_ticklines(): t.set_color(''green'') for t in ax2.yaxis.get_ticklines(): t.set_color(''green'')

Así que para cambiar el color del marco de dos gráficos con dos ejes y cada uno, necesitaría 16 (!) Líneas de código ... Así es como se ve:

Otros métodos que desenterré hasta ahora:

  • matplotlib.rc: discutido here ; Cambia globalmente, no localmente. Quiero tener algunas otras parcelas en diferentes colores. Por favor, no hay discusiones sobre demasiados colores en las parcelas ... :-)

    matplotlib.rc(''axes'',edgecolor=''green'')

  • excavar las espinas del eje, luego cambiarlo: también se discute here ; No es realmente elegante, creo.

    for child in ax.get_children(): if isinstance(child, matplotlib.spines.Spine): child.set_color(''#dddddd'')

¿Hay una forma elegante de condensar el bloque anterior, algo más "pitónico"?

Estoy usando python 2.6.5 con matplotlib 0.99.1.1 en ubuntu.


Refactorizando tu código de arriba:

import matplotlib.pyplot as plt for ax, color in zip([ax1, ax2, ax3, ax4], [''green'', ''green'', ''blue'', ''blue'']): plt.setp(ax.spines.values(), color=color) plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)


Suponiendo que está utilizando una versión razonablemente actualizada de matplotlib (> = 1.0), tal vez intente algo como esto:

import matplotlib.pyplot as plt # Make the plot... fig, axes = plt.subplots(nrows=2) axes[0].plot(range(10), ''r-'') axes[1].plot(range(10), ''bo-'') # Set the borders to a given color... for ax in axes: ax.tick_params(color=''green'', labelcolor=''green'') for spine in ax.spines.values(): spine.set_edgecolor(''green'') plt.show()


Tal vez sea un poco grosero responder a mi propia pregunta, pero me gustaría compartir lo que pude encontrar hasta ahora. Esta versión puede colorear dos subparcelas con ejes [ax1, ax2] y [ax3, ax4] en dos colores diferentes. Es mucho más corto que las 16 líneas que indiqué en mi pregunta anterior. Está inspirado en la respuesta de Joe Kington aquí y en el color de la etiqueta de marca de matanza del mellizo .

import matplotlib.pyplot as plt import numpy as np # Generate some data num = 200 x = np.linspace(501, 1200, num) yellow_data, green_data , blue_data= np.random.random((3,num)) green_data += np.linspace(0, 3, yellow_data.size)/2 blue_data += np.linspace(0, 3, yellow_data.size)/2 fig = plt.figure() plt.subplot(211) # Upper Plot ax1 = fig.add_subplot(211) ax1.fill_between(x, 0, yellow_data, color=''yellow'') ax2 = ax1.twinx() ax2.plot(x, green_data, ''green'') plt.setp(plt.gca(), xticklabels=[]) plt.subplot(212) # Lower Plot ax3 = fig.add_subplot(212) ax3.fill_between(x, 0, yellow_data, color=''yellow'') ax4 = ax3.twinx() ax4.plot(x, blue_data, ''blue'') # Start coloring for ax, color in zip([ax1, ax2, ax3, ax4], [''green'', ''green'', ''blue'', ''blue'']): for ticks in ax.xaxis.get_ticklines() + ax.yaxis.get_ticklines(): ticks.set_color(color) for pos in [''top'', ''bottom'', ''right'', ''left'']: ax.spines[pos].set_edgecolor(color) # End coloring plt.show()

Marqué esto como aceptado ya que es la solución más compacta que he podido encontrar hasta ahora. Sin embargo, estoy abierto a otras formas, tal vez más elegantes, de resolverlo.