4

有没有办法指定 matplotlib 表中各个列的宽度?

我表中的第一列只包含 2-3 位数字 ID,我希望这一列比其他列小,但我似乎无法让它工作。

假设我有一张这样的桌子:

import matplotlib.pyplot as plt

fig = plt.figure()
table_ax = fig.add_subplot(1,1,1)

table_content = [["1", "Daisy", "ill"],
                 ["2", "Topsy", "healthy"]]
table_header = ('ID', 'Name','Status')

the_table = table_ax.table(cellText=table_content, loc='center', colLabels=table_header, cellLoc='left')

fig.show()

(别介意奇怪的裁剪,它不会发生在我的真实桌子上。)

我试过的是这样的:

prop = the_table.properties()
cells = prop['child_artists']

for cell in cells:
    text = cell.get_text()
    if text == "ID":
        cell.set_width(0.1)
    else:
        try:
            int(text)
            cell.set_width(0.1)
        except TypeError:
            pass

上面的代码似乎效果为零——列的宽度仍然相同。(cell.get_width()返回0.3333333333,所以我认为这width确实是单元格宽度......那我做错了什么?

任何帮助,将不胜感激!

4

3 回答 3

12

我一直在网上一遍又一遍地寻找类似的问题解决方案。我找到了一些答案并使用了它们,但我并没有很直接地找到它们。偶然我只是在尝试不同的表方法时发现了表方法 get_celld 。通过使用它,您可以获得一个字典,其中的键是对应于单元格位置的表坐标的元组。所以通过写

cellDict=the_table.get_celld()
cellDict[(0,0)].set_width(0.1)

您只需处理左上角的单元格。现在循环遍历行或列将相当容易。

答案有点晚,但希望其他人可以得到帮助。

于 2013-11-29T09:24:47.543 回答
5

只为完成。列标题以 (0,0) ... (0, n-1) 开头。行标题以 (1,-1) ... (n,-1) 开头。

                  ---------------------------------------------
                  | ColumnHeader (0,0)  | ColumnHeader (0,1)  |
                  ---------------------------------------------
rowHeader (1,-1)  | Value  (1,0)        | Value  (1,1)        |
                   --------------------------------------------
rowHeader (2,-1)  | Value  (2,0)        | Value  (2,1)        |
                   --------------------------------------------

编码:

for key, cell in the_table.get_celld().items():
    print (str(key[0])+", "+ str(key[1])+"\t"+str(cell.get_text()))
于 2017-03-17T08:05:49.237 回答
1

条件text=="ID"总是False,因为cell.get_text()返回一个Text对象而不是一个字符串:

for cell in cells:
    text = cell.get_text()
    print text, text=="ID"  # <==== here
    if text == "ID":
        cell.set_width(0.1)
    else:
        try:
            int(text)
            cell.set_width(0.1)
        except TypeError:
            pass

另一方面,cells直接解决问题:try cells[0].set_width(0.5).

编辑:Text对象get_text()本身有一个属性,所以可以像这样进入一个单元格的字符串:

    text = cell.get_text().get_text() # yup, looks weird
    if text == "ID":
于 2012-09-19T09:42:08.460 回答