2012-07-24 14 views
5

Tengo un marco de datos de Pandas, y quiero trazarlo como una tabla matplotlib. Hasta ahora he esa parte se trabaja con código siguiente:matplotlib: usando un mapa de color para colorear el fondo de la tabla-celda

import numpy as np 
randn = np.random.randn 
from pandas import * 

idx = Index(arange(1,11)) 
df = DataFrame(randn(10, 5), index=idx, columns=['A', 'B', 'C', 'D', 'E']) 
vals = np.around(df.values,2) 

fig = plt.figure(figsize=(15,8)) 
ax = fig.add_subplot(111, frameon=True, xticks=[], yticks=[]) 

the_table=plt.table(cellText=vals, rowLabels=df.index, colLabels=df.columns, 
        colWidths = [0.03]*vals.shape[1], loc='center') 

table_props = the_table.properties() 
table_cells = table_props['child_artists'] 

clm = cm.hot(vals) 

for cell in table_cells: 
    cell.set_height(0.04) 
    # now i would like to set the backgroundcolor of the cell 

Al final de este me gustaría establecer el color de fondo de la celda de acuerdo con el mapa de colores - pero ¿cómo puedo mirar hacia arriba en el CLM matriz sin un índice?

Otra pregunta: ¿puedo de alguna manera pasar una cadena de formato a la tabla, de modo que formatee el texto con 2 decimales?

Alguna pista apreciados, Andy

Respuesta

9

Puede utilizar plt.normalize() para crear un objeto Normalizar para normalizar los datos, y pasar los datos al objeto de normalizar mapa de colores para obtener los colores.

plt.table() tiene un argumento cellColours que establece el color de fondo de cada celda.

Como el mapa de colores cm.hot usa el color negro para un valor mínimo, aumenté el rango de valores cuando creo el objeto normalizar.

Aquí está el código:

from matplotlib import pyplot as plt 
import numpy as np 
randn = np.random.randn 
from pandas import * 

idx = Index(arange(1,11)) 
df = DataFrame(randn(10, 5), index=idx, columns=['A', 'B', 'C', 'D', 'E']) 
vals = np.around(df.values,2) 
normal = plt.normalize(vals.min()-1, vals.max()+1) 

fig = plt.figure(figsize=(15,8)) 
ax = fig.add_subplot(111, frameon=True, xticks=[], yticks=[]) 

the_table=plt.table(cellText=vals, rowLabels=df.index, colLabels=df.columns, 
        colWidths = [0.03]*vals.shape[1], loc='center', 
        cellColours=plt.cm.hot(normal(vals))) 

enter image description here

0

código de trabajo de la Andy:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

# sudo apt-get install python-pandas 
# sudo apt-get install python-matplotlib 
# 
# python teste.py 

from matplotlib import pyplot 
from matplotlib import cm 

import numpy 

from pandas import * 

idx = Index(numpy.arange(1, 11)) 

df = DataFrame(
     numpy.random.randn(10, 5), 
     index=idx, 
     columns=['A', 'B', 'C', 'D', 'E'] 
    ) 

vals = numpy.around(df.values, 2) 

normal = pyplot.normalize(vals.min()-1, vals.max()+1) 

fig = pyplot.figure(figsize=(15, 8)) 

ax = fig.add_subplot(111, frameon=True, xticks=[], yticks=[]) 

the_table = pyplot.table(
       cellText=vals, 
       rowLabels=df.index, 
       colLabels=df.columns, 
       colWidths = [0.03]*vals.shape[1], 
       loc='center', 
       cellColours=pyplot.cm.hot(normal(vals)) 
      ) 

pyplot.show() 
Cuestiones relacionadas