我对matplotlib
很新,而且一瘸一拐。也就是说,我没有找到这个问题的明显答案。
我有一个散点图,我想通过群体着色,看起来像plotting via a loop是way to roll。
这是我可重复的示例,基于上面的第一个链接:
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,这表明这是因为在show()
之前调用savefig()
,但我完全注释掉了。 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')
删除行plt.figure(figsize=(12, 9))
,它将按预期工作。即在savefig
之前打电话给show
。
问题在于保存的图形是由plt.figure()
创建的图形,而所有数据都绘制在之前创建的ax
(并且在不同的图形中,而不是保存的图形)。
要保存包含图例的图形,请使用bbox_inches="tight"
选项
plt.savefig('test.png', bbox_inches="tight")
当然直接保存图形对象同样是可能的,
fig.savefig('test.png', bbox_inches="tight")
要更深入地了解如何将图例移出图表,请参阅this answer。