16

我正在尝试使用 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")

它创建了一个像这样的表(我也不完全确定如何通过某些行来获取线路): 在此处输入图像描述

任何帮助是极大的赞赏!

4

2 回答 2

13

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

  • 图尺寸(编辑):

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

      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")
于 2013-06-21T14:27:33.387 回答
6

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

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()

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

于 2013-07-03T03:54:18.013 回答