【问题标题】:Creating tables in matplotlib在 matplotlib 中创建表格
【发布时间】:2013-06-18 10:24:51
【问题描述】:

我正在尝试使用 matplotlib 制作一个表格,并且我已经成功地获取了我的数据,但我正在为最终的格式设置而苦苦挣扎。我需要编辑图形的大小以包含我的所有数据,因为有些数据被砍掉了。这是我当前的代码:

for struct, energy, density in clust_data:
    fig=plt.figure()
    ax = plt.gca()
    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    colLabels=("Structure", "Energy", "Density")
    rows=len(clust_data)
    cellText=[]
    for row in clust_data:
        cellText.append(row)
    the_table = ax.table(cellText=cellText,
              colLabels=colLabels,
              loc='center')
    plt.savefig("table.png")

它会创建一个像这样的表(我也不完全确定如何通过某些行来获取线路):

非常感谢任何帮助!

【问题讨论】:

  • [This is not an answer] 您正在对同一个列表 (clust_data) 进行双循环,而外部循环只不过是创建和保存 len(clust_data): 是第一个循环一个错字?

标签: python matplotlib


【解决方案1】:

您应该能够通过以下方式解决您的问题:

  • 图形大小(编辑):

    • 测量单元格的高度和宽度(例如hcell=0.3wcell=1
    • 获取/了解行数和列数(在您的情况下为 len(clust_data)+1 和 3)
    • 创建具有正确大小的图形(您可能需要一些额外的填充)

      fig = plt.figure(figsize=(3*wcell+wpad, nrows*hcell+hpad))
      
  • 两行内的线是轴脊。

    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    

    只隐藏轴标签和刻度,而不是轴刺。 您必须隐藏它们或将它们涂成白色

查看下面的完整解决方案


无论如何:在我看来,您正在做很多无用的操作。 从您的代码来看,在我看来clust_data 已经是一个具有正确形状的列表列表,并且cellText 在被填充后将与clust_data 相同。
此外,尽量不要将matplotlib的OO和pyplot接口混用。

下面的代码应该和你的一样

fig=plt.figure()
ax = fig.add_subplot(111)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
colLabels=("Structure", "Energy", "Density")
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
plt.savefig("table.png")

编辑:完整解决方案

复杂的方式

您必须隐藏轴刺(例如,将其颜色设置为白色)并将其设置为较低的zorder,然后添加较高的表zorder

colLabels=("Structure", "Energy", "Density")
nrows, ncols = len(clust_data)+1, len(colLabels)
hcell, wcell = 0.3, 1.
hpad, wpad = 0, 0    

fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad))
ax = fig.add_subplot(111)
#remove axis ticks and labels
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
#hide the spines
for sp in ax.spines.itervalues():
    sp.set_color('w')
    sp.set_zorder(0)
#do the table
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
#put the table in front of the axes spines 
#for some reason zorder is not a keyword in ax.table
the_table.set_zorder(10)
plt.savefig("table.png")

简单的方法(信用@JoeKington)

只需关闭轴

colLabels=("Structure", "Energy", "Density")
nrows, ncols = len(clust_data)+1, len(colLabels)
hcell, wcell = 0.3, 1.
hpad, wpad = 0, 0    
fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad))
ax = fig.add_subplot(111)
ax.axis('off')
#do the table
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
plt.savefig("table.png")

【讨论】:

  • 感谢您的广泛帮助!这解决了刺的问题,但仍然不包括我的整个数据集,应该在表的限制之上和之下都有行编辑此外,clust_data 只是一个列表,其中每个项目包含 3 个值(x,y,z )
  • @FrancescoMontesano - 你不需要跳过这么多圈来隐藏东西。您的示例代码的一半可以替换为ax.axis('off')。您可以省略所有 set_visible(False)set_color('w')set_zorder(...)
  • 所以表格上方和下方有很多空白,我必须放大才能看到任何细节
  • @Jsg91 - 尝试使用fig.savefig('table.png', bbox_inches='tight', bbox_extra_artists=[table]) 删除空格。 (这也会从图形中裁剪出来。如果表格超出图形边界,则整个表格将显示在保存的图像中,而不是您在plt.show() 看到的内容。)跨度>
  • @FrancescoMontesano - 谢谢!请注意,Simple Way 代码中有一个错字:len(colLables) 应该是 len(colLabels)
【解决方案2】:

这只是一种好奇心。你可以用乳胶打印你的桌子。如果你试试这个代码,

import matplotlib.pyplot as plt
import numpy as np

table = r'\begin{table} \begin{tabular}{|l|l|l|}  \hline  $\alpha$      & $\beta$        & $\gamma$      \\ \hline   32     & $\alpha$ & 123    \\ \hline   200 & 321    & 50 \\  \hline  \end{tabular} \end{table}'
plt.plot(np.arange(100))
plt.text(10,80,table, size=50)
plt.show()

您将在图的左上角看到一张漂亮的桌子。现在,几乎可以直接编写一个函数来将数据转换为字符串,就像之前的乳胶表一样。

【讨论】:

  • 最小的狡辩——我认为你需要添加行 import matplotlib as mpl; mpl.rc('text', usetex=True) 以确保乳胶呈现。但是很好的解决方案!
  • 是的,没错。虽然我鼓励在 matplotlibrc 文件中修改这些行。
  • 不幸的是,我经常发现自己将单个代码文件发送给需要它们在运行时“正常工作”的用户。 (所以在我的代码中,如果他们的机器没有乳胶,也可以切换到完全不使用乳胶)。我想这就是生活......
猜你喜欢
  • 2018-05-26
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2017-02-19
  • 2015-05-27
相关资源
最近更新 更多