最近在使用matplotlib画表格时,发现输出的图片始终有大片空白区域,且在保存图片时使用 bbox_inches='tight' 也没用,找了一圈都没有很好的办法,最后还是通过pillow进行图片裁剪才解决。
1. 导入数据
使用pandas读取示例数据,如下:
import pandas as pd
df = pd.DataFrame(data)
df = df[['duration', 'lat', 'lon', 'maxWind', 'minPressure', 'direction', 'moveSpeed', 'distance']]
df['distance'] = df['distance'].round(1) # 保留一位小数
df['direction'] = df['direction'].round(1)
2. 绘制表格
fig = plt.figure(figsize=[8, 6], dpi=600)
ax = fig.add_subplot()
# 构造表格各单元格的颜色列表
cellcolor = []
for row in range(len(df)):
# 奇数行和偶数行分别设置为两种颜色
if row%2 == 0:
rowcolor = ['w' for c in range(len(df.columns))]
else:
rowcolor = ['#a8dcea' for c in range(len(df.columns))]
cellcolor.append(rowcolor)
tb = ax.table(cellText=df.values, cellColours=cellcolor, colLabels=df.columns, colColours=['#4d91d6' for c in range(len(df.columns))])
tb.auto_set_font_size(False) # 关闭自动设置字号
tb.set_fontsize(8) # 设置字号
# 设置表格每行的高度
for i in range(len(df.columns)):
cell = tb[0, i]
cell.set_height(0.1) # 设置表头所在行的高度
for j in np.arange(1, len(df)+1, 1):
tb[j, i].set_height(0.06) # 设置其他行的高度
plt.axis('off') # 不显示图形坐标轴
plt.savefig('x.png', bbox_inches='tight') # 保存图片
一般到这一步就结束了,但是让我们看看输出的图片:
在表格上方出现的大片空白,这是因为上方其实有一张图片,即使我们通过plt.axis('off')隐藏了坐标轴,但是这片绘图区域却依然保留了下来。如果我们注释掉plt.axis('off'),就能直观看到:
3. 裁剪空白区域
直接通过matplotlib库无法去除这片空白,因此需要先输出图片,再使用pillow进行二次裁剪:
from PIL import Image
# 裁去图片中的空白区域
image = Image.open('x.png') #读取刚刚保存的图片
bbox = (0, 2700, image.getbbox()[2], image.getbbox()[3]) # 设置裁剪范围
cropped_image = image.crop(bbox) # 裁剪掉空白区域
cropped_image.save('x.png') # 重新保存
这里的image.getbbox()可以获取到图片的尺寸,其返回值为(0, 0, width, height),我这里设置的bbox表示裁去图片上侧高度为2700像素的区域,保留下侧。裁剪结果如下: