如何在Matplotlib的图上放置表格?
我在使用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
坐标则通过关键词left
和right
来控制。你可以随意组合这两个方向,比如top left
、center right
和bottom
都是可以的。
所以,最接近你想要的图表可以用以下代码生成:
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()
这样就会得到:
希望这对你有帮助!