如何在Matplotlib的图上放置表格?

27 投票
2 回答
52652 浏览
提问于 2025-04-17 08:27

我在使用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()

2 个回答

10

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

        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

请注意,边界框的单位是标准化的(不是图表的实际比例)。

51

据我所知,你不能随意地在matplotlib的图表上放置一个表格,只用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()

结果是:

在这里输入图片描述

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

更新:关于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()

这样就会得到:

在这里输入图片描述

希望这对你有帮助!

撰写回答