【问题标题】:matplotlib: using a colormap to color table-cell backgroundmatplotlib:使用颜色图为表格单元格背景着色
【发布时间】:2012-07-22 07:26:33
【问题描述】:

我有一个 Pandas 数据框,我想将其绘制为 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 位?

任何提示表示赞赏, 安迪

【问题讨论】:

    标签: python colors matplotlib


    【解决方案1】:

    您可以使用plt.Normalize() 来规范化您的数据,并将规范化的数据传递给Colormap object,例如plt.cm.hot()

    plt.table() 有一个参数cellColours,用于相应地设置单元格的背景颜色。

    因为cm.hot将黑色映射到最小值,所以我在创建规范化对象时增加了取值范围。

    代码如下:

    from matplotlib import pyplot as plt
    import numpy as np
    randn = np.random.randn
    from pandas import *
    
    idx = Index(np.arange(1,11))
    df = DataFrame(randn(10, 5), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
    vals = np.around(df.values,2)
    norm = plt.Normalize(vals.min()-1, vals.max()+1)
    colours = plt.cm.hot(normal(vals))
    
    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=colours)
    plt.show()
    

    【讨论】:

    • 不应将normal(vals) 替换为norm(vals)
    【解决方案2】:

    安迪的代码工作:

    #!/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()
    

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2015-11-29
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多