Python Matplotlib 到 smtplib

新手上路,请多包涵

我想知道我是否可以通过 smtplib 发送一个 matplotlib pyplot。我的意思是,在我绘制这个数据框之后:

 In [3]: dfa
Out[3]:
           day      imps  clicks
70  2013-09-09  90739468   74609
69  2013-09-08  90945581   72529
68  2013-09-07  91861855   70869

In [6]: dfa.plot()
Out[6]: <matplotlib.axes.AxesSubplot at 0x3f24da0>

我知道我可以使用

plt.show()

但是对象本身存储在哪里?或者我对 matplotlib 有什么误解?有没有办法在 python 中将它转换为图片或 html,以便我可以通过 smtplib 发送它?谢谢!

原文由 David Yang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 636
2 个回答

您可以使用 figure.savefig() 将绘图保存到文件中。我将绘图输出到文件的示例:

 fig = plt.figure()
ax = fig.add_subplot(111)

# Need to do this so we don't have to worry about how many lines we have -
# matplotlib doesn't like one x and multiple ys, so just repeat the x
lines = []
for y in ys:
    lines.append(x)
    lines.append(y)

ax.plot(*lines)

fig.savefig("filename.png")

然后只需将图片附加到您的电子邮件中(就像 这个答案中的食谱)。

原文由 thegrinner 发布,翻译遵循 CC BY-SA 3.0 许可协议

也可以将内存中的所有内容保存到 BytesIO 缓冲区,然后用它来提供有效负载:

 import io
from email.encoders import encode_base64
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart

buf = io.BytesIO()
plt.savefig(buf, format = 'png')
buf.seek(0)

mail = MIMEMultipart()
...
part = MIMEBase('application', "octet-stream")
part.set_payload( buf.read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % 'anything.png')
mail.attach(part)

原文由 Jorge González Lorenzo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进