Color matplotlib gráfico de barras basado en el valor

¿Hay alguna forma de colorear las barras de un gráfico de barras según el valor de la barra? Por ejemplo:

- values below -0.5: red - values between -0.5 to 0: green - values between 0 to 08: blue - etc 

He encontrado algunos ejemplos básicos de coloración de barras, pero nada que pueda satisfacer los rangos de valores, como los ejemplos anteriores.

ACTUALIZAR:

Gracias kikocorreoso por tu sugerencia. Esto funciona muy bien cuando ambos ejes son números según su ejemplo. Sin embargo, en mi caso, mi estructura de datos original es un dataframe de pandas. Luego uso df.stack () y grafico el resultado. Esto significa que las filas / columnas de los marcos de datos se convierten en el eje x de la gráfica y las celdas del dataframe son el eje Y (barras).

He intentado enmascarar según su ejemplo, pero no parece funcionar cuando el eje Y son números y el eje X son nombres. p.ej:

  col1 col2 col3 col4 row1 1 2 3 4 row2 5 6 7 8 row3 9 10 11 12 row4 13 14 15 16 

El dataframe anterior debe trazarse como un gráfico de barras con las combinaciones de fila / columna que forman el eje x. Cada valor de celda será una barra. Y en última instancia, colorear las barras según la pregunta original. Gracias

Podrías usar máscaras para tus conjuntos de datos. Un ejemplo básico podría ser el siguiente:

 import numpy as np import matplotlib.pyplot as plt x = np.arange(10) y = np.arange(10) * 0.1 mask1 = y < 0.5 mask2 = y >= 0.5 plt.bar(x[mask1], y[mask1], color = 'red') plt.bar(x[mask2], y[mask2], color = 'blue') plt.show() 

El resultado debe ser: introduzca la descripción de la imagen aquí

ACTUALIZAR:

A medida que actualizas tu pregunta actualizo el código. Para su caso simple, y si lo entendiera correctamente, podría hacer el siguiente hack (feo):

 import pandas as pd df = pd.DataFrame({'col1':[1,2,3], 'col2':[4,5,6]}, index = ['row1','row2','row3']) dfstacked = df.stack() mask = dfstacked <= 3 colors = np.array(['b']*len(dfstacked)) colors[mask.values] = 'r' dfstacked.plot(kind = 'bar', rot = 45, color = colors) plt.show() 

O use una solución más OO .

El código explicado brevemente:

  • Creo una máscara para mis columnas rojas.
  • Creo una variedad de colores.
  • Cambie la matriz de colores para usar otro color para mis valores enmascarados
  • Como el dfstacked dataframe tiene un MultiIndex los tics no están bien impresos, así que uso la palabra clave rot para rotarlos. Si desea automatizarlo para obtener una buena gráfica, puede usar plt.tight_layout() antes de plt.show() .

Espero que ayude.