matplotlib:使用颜色映射为表格单元格背景颜色
问题描述:
我有一个熊猫数据框,并且我想将它绘制为matplotlib表格。到目前为止,我有一部分与下面的代码工作:matplotlib:使用颜色映射为表格单元格背景颜色
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
在本月底我想根据颜色表设置单元格的背景色 - 但我怎么看它在CLM没有索引的数组?
另一个问题:我可以以某种方式传递一个格式字符串到表中,以便它将文本格式化为2个小数位?
任何提示赞赏, 安迪
答
您可以使用plt.normalize()来创建一个正常化的对象一定要规范你的数据,正规化数据传递给颜色映射对象来获得的颜色。
plt.table()有一个cellColours参数,用于设置每个单元格的背景颜色。
因为cm.hot彩图使用黑色作为最小值,所以在创建规范化对象时我增加了数值范围。
下面是代码:
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)))
答
安迪的代码工作:
#!/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()