2017-12-18 261 views
1

我必须在Python中绘制表格图并将此表保存为jpeg/png。然后在邮件中使用这个图像。问题是我在图表的顶部和底部获得了空白区域。代码我用来实现这一目标:顶部和底部的白色空间Python matplotlib图

nrows, ncols = len(df)+1, len(df.columns) 
hcell, wcell = 0.5, 1.5 
hpad, wpad = 0, 0 
fig, ax = plt.subplots(figsize=(ncols*wcell+wpad, nrows*hcell+hpad)) 

ax.axis('off') 
ax.axis('tight') 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 

ax.table(cellText=df.values, colLabels=df.columns, loc='center') 
fig.savefig('table1.png', bbox_inches='tight') 

输出: tabular table 另外,我想给图表的标题到顶部和左侧。 'Some text Here'是标题,黄线显示我想要另一个标题的位置。 所需的输出没有额外的空白在顶部。 Desired

+1

你可能想给我们一个工作示例,所以我们可以复制你的情况,以及它的工作。 – IMCoins

+0

我给了代码。数据可以复制。 –

+0

答案已经给出wtf – IMCoins

回答

2

一个选项是指定表​​格的边框作为保存图形时要使用的边框。

from matplotlib import pyplot as plt 

fig, ax = plt.subplots() 

colums = ['col1', 'col2'] 
rows = ['row1', 'row2'] 
values = [[0, 1], [1, 0]] 
table = ax.table(cellText=values, colLabels=colums, rowLabels=rows, loc='center') 

ax.axis('off') 

fig.canvas.draw() 
bbox = table.get_window_extent(fig.canvas.get_renderer()) 
bbox_inches = bbox.transformed(fig.dpi_scale_trans.inverted()) 

fig.savefig('plop.png', bbox_inches=bbox_inches) 

plt.show() 

enter image description here

在这种情况下,外线croped因为线延伸到其位置的两侧。人们仍然可以在表格周围添加一些填充。例如。有5个像素填充,

bbox = table.get_window_extent(fig.canvas.get_renderer()) 
bbox = bbox.from_extents(bbox.xmin-5, bbox.ymin-5, bbox.xmax+5, bbox.ymax+5) 
bbox_inches = bbox.transformed(fig.dpi_scale_trans.inverted()) 

enter image description here

+0

谢谢,爱你。 – IMCoins

0

我不认为你可以删除表格上方和下方的空格。 Reading the documentation,你已经有最高你将永远实现。

bbox_inches:STR或B-盒,可选

B-盒英寸。只有该图的给定部分被保存。如果“紧”,试图找出数字的紧密bbox。如果没有,使用savefig.bbox

不过,我已经为你设置正确的行和列的工作示例。 下面是图片后面的代码。

from matplotlib import pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 

colums = ['col1', 'col2'] 
rows = ['row1', 'row2'] 
values = [[0, 1], [1, 0]] 
ax.table(cellText=values, colLabels=colums, rowLabels=rows, loc='center') 

ax.axis('off') 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 

fig.savefig('plop.png', bbox_inches='tight') 

Result

我强烈建议您调整轴/图设置后您的情节完全抽出。

+0

当然,你可以摆脱空白,但'bbox_inches ='tight''不会有太大的帮助。只要问题显示[mcve],我很乐意提供一个答案显示如何。 – ImportanceOfBeingErnest

+0

我很想知道你会怎么做。我能找到的唯一方法是使用[Bbox](https://matplotlib.org/api/transformations.html#matplotlib.transforms.Bbox)实例,但我没有时间来封装其功能马上。如果你能够给我一个直接的信息和我应该研究的选项,我会很高兴。 – IMCoins

+0

好吧,我把你的例子用于使用'bbox_inches'的答案。当然还有其他的选择,比如让桌子和桌子一样大。 – ImportanceOfBeingErnest