我该如何在Matplotlib中绘制一个表格?

26

我在使用matplotlib的表格命令时遇到了困难。这是我想要做的事情的一个示例:

有人能帮助构建表格代码吗?

import pylab as plt

plt.figure()
ax=plt.gca()
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1]
plt.plot([10,10,14,14,10],[2,4,4,2,2],'r')
col_labels=['col1','col2','col3']
row_labels=['row1','row2','row3']
table_vals=[11,12,13,21,22,23,31,32,33]
# the rectangle is where I want to place the table
plt.text(11,4.1,'Table Title',size=8)
plt.plot(y)
plt.show()

3
你尝试查看了这个例子吗? 链接 或许你可以做一些类似的事情,但是不要使用注释,而是使用一个表格。 - cosmosis
是的,我看到了那个例子。当我尝试使用代码时,我无法分配行颜色和位置。我也找不到任何关于调用语法或类型的文档帮助。至于注释,我认为可以通过指定第二个轴来控制在其中绘制表格。 - user1032355
2个回答

51
据我所知,仅使用原生的 matplotlib 功能无法任意地将表格放置在图表上。你可以利用LaTeX文本渲染的可能性来实现这一点。但是,在此之前,您需要在系统中安装可用的LaTeX环境。如果您已经安装了一个,则应该能够生成如下所示的图形:
import pylab as plt
import matplotlib as mpl

mpl.rc('text', usetex=True)
plt.figure()
ax=plt.gca()
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1]
#plt.plot([10,10,14,14,10],[2,4,4,2,2],'r')
col_labels=['col1','col2','col3']
row_labels=['row1','row2','row3']
table_vals=[11,12,13,21,22,23,31,32,33]
table = r'''\begin{tabular}{ c | c | c | c } & col1 & col2 & col3 \\\hline row1 & 11 & 12 & 13 \\\hline row2 & 21 & 22 & 23 \\\hline  row3 & 31 & 32 & 33 \end{tabular}'''
plt.text(9,3.4,table,size=12)
plt.plot(y)
plt.show()

结果如下:

enter image description here

请注意,这只是一个快速且简单的示例;您应该可以通过调整文本坐标来正确放置表格。如果需要更改字体等,请参阅文档

更新:有关pyplot.table 的更多信息

根据文档plt.table 可将表格添加到当前轴。从源代码中可以看出,表格在图表上的位置是相对于轴确定的。Y 坐标可以使用关键字 top(在图表上方)、upper(在上半部分)、center(在中心)、lower(在下半部分)和 bottom(在图表下方)进行控制。X 坐标可以使用关键字 leftright 进行控制。两者的任意组合都可以使用,例如top leftcenter rightbottom 等均可使用。

因此,最接近您想要的图表可以采用以下方式制作:

import matplotlib.pylab as plt

plt.figure()
ax=plt.gca()
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1]
#plt.plot([10,10,14,14,10],[2,4,4,2,2],'r')
col_labels=['col1','col2','col3']
row_labels=['row1','row2','row3']
table_vals=[[11,12,13],[21,22,23],[31,32,33]]
# the rectangle is where I want to place the table
the_table = plt.table(cellText=table_vals,
                  colWidths = [0.1]*3,
                  rowLabels=row_labels,
                  colLabels=col_labels,
                  loc='center right')
plt.text(12,3.4,'Table Title',size=8)

plt.plot(y)
plt.show()

这样做会给你以下结果:

在此输入图片描述

希望能对你有所帮助!


谢谢Andrey,这确实提供了一个可行的解决方案来解决问题。然而,我找不到任何关于matplotlib中pyplot.table或matplotlib.Table.table功能的讨论/文档。我希望看到有人明确回答Table问题。 - user1032355
如果您想了解更多关于pyplot.table的内容,请查看更新。 - Andrey Sobolev
谢谢Andrey!你不仅清晰完整地回答了我的问题,而且我完全错过了matplotlib.pyplot.table的文档。感谢你明确的答案和指导。 - user1032355
嗨,安德烈,我想知道是否可以将表格拖出轴? - Evans Y.
嗨@EvansY.,如果我没记错的话,loc关键字中的top将表格放置在坐标轴上方,而bottom则将其放置在坐标轴下方。只需尝试使用这些关键字并查看结果即可。 - Andrey Sobolev
1
谢谢!所有可用的loc值都不能满足我的需求,但我找到了一个解决方法:添加一个子图并将表格绘制到该图中,然后将子图设置为不可见。由于我可以重新定位子图,这意味着我可以将表格放置在任何位置。 - Evans Y.

10

我不确定之前的回答是否能够满足你的问题,我也在寻找一种添加表格到绘图的方法,并发现了克服“loc”限制的可能性。 你可以使用边界框来控制表格的精确位置(以下代码仅包含表格创建部分,但应该足够):

        tbl = ax1.table(
            cellText=[["a"], ["b"]],
            colWidths=[0.25, 0.25],
            rowLabels=[u"DATA", u"WERSJA"],
            loc="bottom", bbox=[0.25, -0.5, 0.5, 0.3])

        self.ui.main_plot.figure.subplots_adjust(bottom=0.4)

结果如下(我没有足够的声望来发布图片,所以这里是一个链接):http://www.viresco.pl/media/test.png

请注意,bbox单位是标准化的(不是在绘图比例中)。


写作时链接已经失效。 - Herpes Free Engineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接