Matplotlib表:单个列宽

时间:2012-09-19 07:56:15

标签: matplotlib

有没有办法在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确实是单元格宽度...所以我做错了什么?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:12)

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

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

您只需点击左上角的单元格即可。现在循环遍历行或列将非常容易。

有点迟到的答案,但希望其他人可能会得到帮助。

答案 1 :(得分:3)

刚刚完成。列标题以(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()))

答案 2 :(得分: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的问题:尝试cells[0].set_width(0.5)

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

    text = cell.get_text().get_text() # yup, looks weird
    if text == "ID":