Python 在matplotlib中创建表

Python 在matplotlib中创建表,python,matplotlib,Python,Matplotlib,我正试图使用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=

我正试图使用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")
这样就创建了一个这样的表(我也不完全确定如何通过某些行使用这些行):


非常感谢您的帮助

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

  • 图形大小(编辑):

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

  • 这两行中的线是轴脊椎

    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    
    只需隐藏轴标签和记号,而不是轴脊椎。 你必须把它们藏起来或涂成白色

请参阅下面的完整解决方案


在任何情况下:在我看来,你正在做大量无用的操作。 从您的代码来看,
clust\u数据
似乎已经是一个具有正确形状的列表列表,并且填充后的
cellText
将与
clust\u数据
相同
此外,尽量不要混合使用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")

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

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

您将在绘图的左上角看到一个beatifull表格。现在,编写一个函数将数据转换为字符串(如前一个latex表)几乎是直截了当的事情

[这不是答案]您正在同一个列表上进行双循环(
clust\u data
),而外部循环只不过是创建和保存
len(clust\u data)
:第一个循环是打字错误吗?感谢您的广泛帮助!这解决了spines的问题,但仍然不包括我的整个数据集,应该有高于和低于表编辑限制的行,而且clust_数据只是一个列表,每个项目包含3个值(x,y,z)@FrancescoMontesano-你不需要跳过这么多环来隐藏东西。示例代码的一半可以替换为
ax.axis('off')
。您可以省略所有的
set\u visible(False)
set\u color('w')
set\u zorder(…)
。因此,表格上下都有大量空白,我必须放大以找出任何空白details@Jsg91-尝试使用
fig.savefig('table.png',bbox_inches='tight',bbox_extra_artists=[table])
删除空白。(这也将从图形中裁剪出。如果表格超出图形边界,则整个表格将显示在保存的图像中,而不仅仅是如果执行
plt.show()
)所看到的内容)@FrancescoMontesano-谢谢!正如您所知,代码的简单方式中有一个输入错误:
len(colLables)
应该是
len(colLabels)
最细微的诡辩——我认为您需要添加行import matplotlib作为mpl;rc('text',usetex=True),以确保latex渲染。不过,这是一个很好的解决方案!是的,没错。尽管我鼓励修改matplotlibrc文件中的这些行,但不幸的是,我经常发现自己处于这样的情况:我将单个代码文件发送给需要它们在运行时“正常工作”的用户。(所以在我的代码中,如果他们的机器没有乳胶,也可以切换到完全不使用乳胶)。我想这就是生活。。。
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()