表格图片格式问题

1 投票
3 回答
2235 浏览
提问于 2025-04-18 10:37

我现在遇到的主要问题是想把表格完全涂成('#EEECE1')这种颜色,并且格式化它,让周围没有白色的空隙。这样的话,我就可以很方便地把它插入到PPT文档中,而不会因为边框和多余的空间看起来不协调。

我有以下这段代码:

def tables():
    data=[[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5]]
    fig= plt.figure()
    ax = fig.add_subplot(111)
    ax.axis('off')
    rows=['AB','BC','SK','MB']
    cols=["Gas", "Wk/Wk", "Yr/Yr","Oil", "Wk/Wk", "Yr/Yr","Bit", "Wk/Wk", "Yr/Yr","Total", "Wk/Wk", "Yr/Yr","Hor", "Wk/Wk", "Yr/Yr","Vert/Dir", "Wk/Wk", "Yr/Yr"]
    table = ax.table(cellText=data, colLabels=cols,rowLabels=rows, loc='upper center',cellLoc='center')
    table.auto_set_font_size(True)
    table.scale(1.5,1.5)
    plt.savefig(filenameTemplate2, format='png',bbox_inches='tight')

运行后得到的效果是这样的:

在这里输入图片描述

有什么建议吗?

3 个回答

0

你可以试试这个:.set_backgroundcolor('#EEECE1'),你可能需要把它设置在表格、坐标轴或者图形上。

2

这里有几个问题:

第一个问题是,虽然你用了 ax.axes('off'),这只是关闭了坐标轴上线条和标签的绘制,并没有真正去掉坐标轴,这就导致了表格下面有很多空白。要解决这个问题,我不知道怎么完全关闭坐标轴的绘制,但一个简单的方法是把坐标轴的比例调小于表格的比例,然后把表格按相同的比例放大(下面有个例子)。

关于颜色,需要记住几点:1)坐标轴的颜色和图形的颜色是不同的(比如,在通常的图形界面中,图形的颜色是灰色,而坐标轴是白色);2)保存的图形颜色和显示的图形颜色是不同的,这个需要在 savefig 中直接设置。

最后,你可能想在这里使用透明度,而不是你特别要求的颜色(比如,在 savefig 中设置关键字 transparent=True),但这有点取决于你之后对图形的处理,以及透明度是否被支持,所以我就按照你问的颜色问题来回答。

这是图形和代码:

在这里输入图片描述

data=[[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5]]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis('off')
ax.set_aspect(.1)
rows=['AB','BC','SK','MB']
cols=["Gas", "Wk/Wk", "Yr/Yr","Oil", "Wk/Wk", "Yr/Yr","Bit", "Wk/Wk", "Yr/Yr","Total", "Wk/Wk", "Yr/Yr","Hor", "Wk/Wk", "Yr/Yr","Vert/Dir", "Wk/Wk", "Yr/Yr"]
table = ax.table(cellText=data, colLabels=cols,rowLabels=rows, loc='upper center',cellLoc='center')
table.auto_set_font_size(True)
table.scale(1.5,15.)
plt.savefig("test.png", format='png',bbox_inches='tight', facecolor='#EEECE1', transparent=True)
2

你的问题似乎出在坐标轴上。你的表格周围有一大片白色的坐标轴区域,而生成的png图像是坐标轴周围有紧密的边框,而不是表格。去掉坐标轴的背景颜色会稍微改善一下:

ax.set_axisbgcolor((0,0,0,0))

这样可以得到透明的图表区域。透明背景的好处是,在PPT中也应该保持透明。另一种指定透明度的方法是在创建子图时:

add_subplot(111, axisbg='none')

然后你还需要调整坐标轴相对于图形的位置,例如:

ax.set_position([0, 0, 1, 1])

这样可以填满整个图形。

在创建表格时可以设置单元格的颜色,但这似乎有点麻烦:

tbl=plt.table(cellText=data, cellColours=[["#EEECE1"] * len(data[0])]*len(data))

注意:至少我的matplotlib在这里有点问题,见答案的最后部分。


所以,可以按照这样的方式:

data=[[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5]]
fig = plt.figure(figsize=(6,2))
ax = fig.add_subplot(111, axisbg='none')
ax.axis('off')
ax.set_position([0, 0, 1, 1])
rows=['AB','BC','SK','MB']
cols=["Gas", "Wk/Wk", "Yr/Yr","Oil", "Wk/Wk", "Yr/Yr","Bit", "Wk/Wk", "Yr/Yr","Total", "Wk/Wk", "Yr/Yr","Hor", "Wk/Wk", "Yr/Yr","Vert/Dir", "Wk/Wk", "Yr/Yr"]
table = ax.table(cellText=data, colLabels=cols, rowLabels=rows, rowColours=['none']*len(data), colColours=['none']*len(data[0]), loc='upper center',cellLoc='center', cellColours=[["none"] * len(data[0])] * len(data))
table.auto_set_font_size(True)
table.scale(1.5, 1.5)
plt.savefig("test.png", format='png',bbox_inches='tight')

这样应该能生成一个背景完全透明的表格。如果你想给单元格设置背景颜色,可以把cellColours中的"none"改掉。参数rowColourscolColours决定了列和行标签后面的颜色。如果你想为整个图像设置背景,可以在add_subplotaxisbg参数中更改。

另外要注意:不同版本的matplotlib在缩放方面可能会有些不同。

更新:在table.py的工厂函数table中可能有个bug……似乎如果同时定义了colColorscolLabels,单元格的偏移量会变成0,导致行跳到错误的位置。

解决方法虽然有点笨,但:

table = ax.table(cellText=data, colLabels=cols, rowLabels=rows, loc='upper center',cellLoc='center')
for cidx in table._cells:
    table._cells[cidx].set_facecolor('none')

这样就可以了。table._cells是一个单元格的字典(这些单元格是基于Rectangle类构建的)。同样的技巧可以让你为单元格的面或边缘做各种花哨的着色,字典的键是单元格的坐标。

撰写回答