¿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:
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:
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.