使用matplotlib绘制表格,并去除空白区域

最近在使用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像素的区域,保留下侧。裁剪结果如下:

<think>我们有一个需求:将使用matplotlib和pandas渲染的表格保存为图片文件。根据引用[1][2][3]可知,Matplotlib是一个绘图库,我们可以使用它来绘制表格保存为图片。在Matplotlib中,我们可以使用`plt.savefig()`函数来保存当前的图形。步骤:1.在绘制表格后(即调用`plt.table`之后),我们可以使用`plt.savefig('filename.png')`来保存图片。2.注意:在保存之前,可能需要调整图形的大小和布局,以确保表格完整显示。3.通常,在显示图形之前保存,因为`plt.show()`会阻塞程序,所以保存应在`plt.show()`之前。假设我们有一段现有的代码,它使用matplotlib和pandas来渲染一个表格,但没有保存功能。我们将修改代码,在适当的位置添加保存图片的代码。示例代码(修改前):import pandasas pdimport matplotlib.pyplot asplt#创建数据data= {'Name':['Tom', 'Nick','John', 'Tom'],'Age':[20,21,19,20]}df =pd.DataFrame(data)#创建表格fig, ax= plt.subplots()ax.axis('off')#隐藏坐标轴table =ax.table(cellText=df.values, colLabels=df.columns, loc='center')table.auto_set_font_size(False)table.set_fontsize(10)table.scale(1,1.5)#调整表格大小plt.show()修改后(添加保存功能):...(前面的代码不变)plt.savefig('table.png',dpi=300, bbox_inches='tight')#保存为图片,bbox_inches='tight'可以确保图片边缘空白较小plt.show()注意:`bbox_inches='tight'`参数用于去除图片周围的空白区域,使保存的图片更紧凑。因此,我们只需要在调用`plt.show()`之前添加`plt.savefig()`即可。另外,根据引用[3]和[4],我们还需要确保已经正确安装了matplotlib和pandas库。如果未安装,可以使用pip安装:pip installmatplotlib pandas但是,用户已经使用了这些库,所以安装问题可能不存在。所以,修改代码的关键点就是添加一行保存图片的代码,注意保存的位置和参数。如果用户需要调整图片的格式,可以更改文件扩展名,例如:'table.jpg','table.pdf','table.svg'等。如果用户需要调整分辨率,可以设置dpi参数(每英寸点数),例如dpi=300。如果用户需要调整图片大小,可以在创建figure时指定figsize,例如:fig,ax =plt.subplots(figsize=(10,8))完整修改后的代码示例:importpandas aspdimportmatplotlib.pyplotas pltdata ={'Name':['Tom','Nick', 'John','Tom'], 'Age':[20,21,19,20]}df= pd.DataFrame(data)fig,ax =plt.subplots(figsize=(8,4))#设置图形大小ax.axis('off')table= ax.table(cellText=df.values,colLabels=df.columns,loc='center')table.auto_set_font_size(False)table.set_fontsize(10)table.scale(1,1.5)#保存图片plt.savefig('my_table.png', dpi=300,bbox_inches='tight')plt.show()这样,程序会在运行后生成一个名为'my_table.png'的图片文件。注意事项:-保存路径:默认保存在当前工作目录。如果需要指定路径,可以给出完整路径,例如:'C:/images/table.png'(注意使用正斜杠或双反斜杠)。-如果表格很大,可能需要调整图形大小(figsize)和表格缩放(table.scale)来确保所有内容都能显示在图片中。因此,用户只需在现有代码中添加一行保存图片的代码,调整参数以满足需求。如果用户使用的是Jupyter Notebook,同样可以在代码中添加`plt.savefig`,但注意在Notebook中,`plt.show()`通常不是必须的,因为图形会自动显示。但保存图片的代码仍然需要放在绘制图形之后。如果用户希望在显示之前保存,那么保存操作应该在`plt.show()`之前,因为`plt.show()`会清空当前图形。总结:添加`plt.savefig('filename.png')`在`plt.show()`之前。现在,我们生成相关问题:</think>要修改现有代码以将Matplotlib表格保存为图片文件,只需在绘制表格后添加`plt.savefig()`函数即可。以下是具体实现步骤: ### 修改后的代码示例 ```python import pandas as pd import matplotlib.pyplot as plt # 示例数据 data = {'Name': ['Tom', 'Nick', 'John'], 'Age': [20, 21, 19]} df = pd.DataFrame(data) # 创建表格 fig, ax = plt.subplots(figsize=(8, 4)) # 设置图片尺寸 ax.axis('off') # 隐藏坐标轴 table = plt.table( cellText=df.values, colLabels=df.columns, loc='center', cellLoc='center' ) table.auto_set_font_size(False) table.set_fontsize(12) table.scale(1, 1.5) # 调整表格缩放比例 # 新增保存功能(关键代码) plt.savefig('output_table.png', # 文件名 dpi=300, # 分辨率(默认100) bbox_inches='tight', # 自动裁剪空白 transparent=True # 透明背景(可选) ) plt.show() # 显示表格(可选) ``` ### 关键参数说明 1. **保存路径** - 默认保存在当前工作目录,可使用绝对路径:`plt.savefig('/path/to/output_table.png')` 2. **图片格式** 支持多种格式,通过扩展名指定: ```python plt.savefig('output.jpg') # JPEG格式 plt.savefig('output.pdf') # PDF格式 plt.savefig('output.svg') # 矢量图 ``` 3. **高级参数** - `dpi`:分辨率(每英寸点数),建议300以上用于印刷 - `bbox_inches='tight'`:自动裁剪多余空白区域[^1] - `facecolor`/`edgecolor`:设置背景/边框颜色 - `transparent=True`:透明背景(适合网页使用) ### 注意事项 1. **保存位置** 必须在`plt.show()`**之前**调用`savefig()`,否则会保存空白图片,因为`show()`会释放图形资源[^2] 2. **表格优化** - 调整`figsize=(宽度,高度)`控制图片尺寸 - 使用`table.scale(x_scale, y_scale)`缩放表格内容 - 通过`set_fontsize()`调整字体大小 3. **依赖库** 确保已安装最新版Matplotlib: ```bash pip install --upgrade matplotlib pandas ``` > **提示**:对于大型表格,建议使用PDF或SVG格式保存以获得清晰的矢量图效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值