将matplotlib子图保存到图像文件

3npbholx  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(146)

我对matplotlib相当陌生,正在沿着前进。也就是说,我还没有找到这个问题的明显答案。
我有一个散点图,我想按组着色,它看起来像plotting via a loop是滚动的方式。
下面是我的可重复的例子,基于上面的第一个链接:

import matplotlib.pyplot as plt
import pandas as pd
from pydataset import data

df = data('mtcars').iloc[0:10]
df['car'] = df.index

fig, ax = plt.subplots(1)
plt.figure(figsize=(12, 9))
for ind in df.index:
    ax.scatter(df.loc[ind, 'wt'], df.loc[ind, 'mpg'], label=ind)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2)
# plt.show()
# plt.savefig('file.png')

取消注解plt.show()得到了我想要的结果:

搜索一下,好像plt.savefig()是保存文件的方法;如果我重新注解掉plt.show()并运行plt.savefig(),我会得到一个空白白色图片。This question表明这是由于在savefig()之前调用show()造成的,Another question有一个注解,建议我可以直接保存ax对象,但这切断了我的图例:

同样的问题有一个替代方案,使用fig.savefig()代替。我得到相同的切碎的图例。
有一个this question似乎是相关的,但我没有直接绘制DataFrame,所以我不知道如何应用答案(其中dtf是他们绘制的pd.DataFrame):

plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png")

感谢您的任何建议。

**编辑:**为了测试下面的建议,尝试tight_layout(),我运行了这个,仍然得到一个空白的白色图像文件:

fig, ax = plt.subplots(1)
plt.figure(figsize=(12, 9))
for ind in df.index:
    ax.scatter(df.loc[ind, 'wt'], df.loc[ind, 'mpg'], label=ind)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2)
fig.tight_layout()
plt.savefig('test.png')
pinkon5k

pinkon5k1#

删除行plt.figure(figsize=(12, 9)),它将按预期工作。即在show之前调用savefig
问题是,保存的图形是由plt.figure()创建的图形,而所有数据都绘制到在此之前创建的ax(并且在不同的图形中,这不是保存的图形)。
要保存包含图例的图形,请使用bbox_inches="tight"选项

plt.savefig('test.png', bbox_inches="tight")

当然,直接保存图形对象同样是可能的,

fig.savefig('test.png', bbox_inches="tight")

要更深入地了解如何将图例移出情节,请参阅此答案。

eagi6jfj

eagi6jfj2#

额外的加法对@ImportanceOfBeingErnest的答案,当bbox_inches='tight''pad_inches=0.1'可能需要设置为更大的值。

相关问题