如何使用Matplotlib将图表保存为指定尺寸?(普通图与子图场景的问题求助)
如何使用Matplotlib将图表保存为指定尺寸?(普通图与子图场景的问题求助)
我来帮你梳理一下问题的根源,然后给出对应的修复方案:
一、普通单图场景的问题修复
你最初的代码出现空白保存的核心原因是操作顺序完全颠倒了:
- 你先调用
plt.xlabel、plt.ylabel,这些操作是作用在Matplotlib默认创建的空白figure上的 - 之后你才调用
plt.figure(figsize=(8, 6)),这会新建一个完全空白的、指定尺寸的figure - 最后保存的是这个新建的空白figure,自然没有内容
正确的操作顺序应该是先创建指定尺寸的figure,再执行所有绘图相关操作:
# 1. 先创建指定尺寸的figure plt.figure(figsize=(8, 6)) # 2. 执行绘图操作(这里需要补充你的plot代码,比如plt.plot(x, y)) plt.plot(x, y) # 替换为你的实际数据 # 3. 设置标签 plt.xlabel('2θ-ω (°)') plt.ylabel('Log intensity') # 4. 最后保存 plt.savefig('new_graph.svg', format='svg')
二、子图场景的问题修复
你后来的子图代码错误在于重复创建了figure/axes对象:
- 第一次
fig, ax = plt.subplots()创建了一个默认尺寸的figure和对应的axes,你在这个ax上绘图、设置标签,得到了正确的图 - 之后你又调用
ax = plt.subplots(figsize=(8, 6)),这行代码会新建一个指定尺寸的空白figure和axes,而且错误地把返回的元组赋值给了之前的ax变量 - 最后保存的是这个新建的空白figure,所以得到了无数据的svg
正确的做法是在第一次创建子图时就指定figsize,全程使用同一个fig和ax对象:
# 一步到位:创建指定尺寸的figure和对应的axes fig, ax = plt.subplots(figsize=(8, 6)) # 在这个ax上绘制数据 ax.plot(x1, z1, label="one of my lines", color='thistle') # 设置坐标轴标签 ax.set_xlabel('2θ-ω (°)') ax.set_ylabel('Log intensity') # 如果需要显示图例 ax.legend() # 保存这个包含数据的指定尺寸figure plt.savefig('new_graph.svg', format='svg')
关键注意事项
- 所有绘图操作(绘图、设置标签、添加图例等)必须作用在同一个figure/axes对象上
- 一定要先创建指定尺寸的figure,再做后续操作,避免Matplotlib自动创建默认尺寸的figure
- 不要重复调用
plt.figure()或plt.subplots(),否则会生成多个独立的figure,容易保存到错误的空白图
备注:内容来源于stack exchange,提问作者Kray
相关产品推荐
相关产品推荐

