Condicionalmente cambiar el color de fondo de celdas específicas.

Tengo un DataFrame y puedo guardarlo como un archivo png. Pero ahora quiero cambiar el color de fondo de celdas específicas que cumplen una determinada condición.

Condiciones:

  • Los números que tengan 80 o más deben obtener un fondo verde.
  • Los números por debajo de 80 deben obtener un fondo rojo.
  • Todos los nombres de columnas y celdas de índice necesitan un fondo negro con un color de texto blanco.

Las siguientes publicaciones se acercaron a lo que quería pero no me proporcionaron la respuesta que necesitaba. Publicar 1 Publicar 2

Mi código:

import matplotlib.pyplot as plt from pandas.tools.plotting import table import pandas as pd #My dataframe df = pd.DataFrame({ 'Weeks' : [201605, 201606, 201607, 201608], 'Computer1' : [50, 77, 96, 100], 'Computer2' : [50, 79, 100, 80], 'Laptop1' : [75, 77, 96, 95], 'Laptop2' : [86, 77, 96, 40], 'Phone' : [99, 99, 44, 85], 'Phone2' : [93, 77, 96, 25], 'Phone3' : [94, 91, 96, 33] }) df2 = df.set_index('Weeks') #Makes the column 'Weeks' the index. #Make a png file out of an dataframe. plt.figure(figsize=(9,3)) ax = plt.subplot(211, frame_on=False) # no visible frame ax.xaxis.set_visible(False) # hide the x axis ax.yaxis.set_visible(False) # hide the y axis table(ax, df2, rowLabels=df2.index, colLabels=df2.columns, loc='center', cellColours=None) plt.savefig('mytable.png') #save it as an png. 

Así es como se ve actualmente: introduzca la descripción de la imagen aquí

Así es como quiero que se vea. introduzca la descripción de la imagen aquí

Puedes hacer algo como esto:

 colors = df2.applymap(lambda x: 'green' if x>= 80 else 'red').reset_index().drop(['Weeks'], axis=1) tbl = table(ax, df2, loc='center', cellColours=colors.as_matrix(), colColours=['black']*len(colors.columns), rowColours=['black']*len(colors)) 

Configuración del color del índice:

 [tbl._cells[row, -1]._text.set_color('white') for row in range(1, len(colors)+1)] 

configuración de los colores del encabezado:

 [tbl._cells[0, col]._text.set_color('white') for col in range(len(colors.columns))] plt.show() 

Código (completo):

 import matplotlib.pyplot as plt from pandas.tools.plotting import table import pandas as pd #My dataframe df = pd.DataFrame({ 'Weeks' : [201605, 201606, 201607, 201608], 'Computer1' : [50, 77, 96, 100], 'Computer2' : [50, 79, 100, 80], 'Laptop1' : [75, 77, 96, 95], 'Laptop2' : [86, 77, 96, 40], 'Phone' : [99, 99, 44, 85], 'Phone2' : [93, 77, 96, 25], 'Phone3' : [94, 91, 96, 33] }) df2 = df.set_index('Weeks') #Makes the column 'Weeks' the index. colors = df2.applymap(lambda x: 'green' if x>= 80 else 'red') \ .reset_index().drop(['Weeks'], axis=1) #print(colors) plt.figure(figsize=(10,5)) ax = plt.subplot(2, 1, 1, frame_on=True) # no visible frame #ax.xaxis.set_visible(False) # hide the x axis #ax.yaxis.set_visible(False) # hide the y axis # hide all axises ax.axis('off') # http://matplotlib.org/api/pyplot_api.html?highlight=table#matplotlib.pyplot.table tbl = table(ax, df2, loc='center', cellLoc='center', cellColours=colors.as_matrix(), colColours=['black']*len(colors.columns), rowColours=['black']*len(colors), #fontsize=14 ) # set color for index (X, -1) and headers (0, X) for key, cell in tbl.get_celld().items(): if key[1] == -1 or key[0] == 0: cell._text.set_color('white') # remove grid lines cell.set_linewidth(0) # refresh table plt.show() # save it as an png. plt.savefig('mytable.png') 

introduzca la descripción de la imagen aquí