Matplotlib绘图重叠求助:新生成的.png图表包含旧图内容
Matplotlib绘图异常问题解决
问题1:新图表带旧图残留
在Spyder里跟着Python教程用Matplotlib绘图,用plt.savefig()直接存成.png时,新画的图总会带上之前的元素(比如粉色标记、旧线条),和教程效果对不上。因为plt.show()加载慢,还得配matplotlib.use('TkAgg')才能跑,所以改用直接存图的方式。
问题2:savefig输出到stdout报错
试了用plt.savefig(stdout,buffer)加sys.stdout.flush(),结果报错:AttributeError: 'TTYOutStream' object has no attribute 'buffer',已经把这段代码弃了。
解决方案
搞定绘图残留
每次绘图前后清理画布,两种方法选一种就行:
- 绘图前调用
plt.figure(),创建全新的空白画布,确保每次都是从零开始画 - 存完图后调用
plt.clf()清空当前画布,或者plt.close()关掉当前图表
示例代码:
import matplotlib.pyplot as plt # 画第一个图 plt.plot([1,2,3], marker='o', color='hotpink') plt.savefig('figure51.png') plt.clf() # 清空画布 # 画第二个图 plt.plot([1,2,3], linestyle='dotted') plt.savefig('figure52.png') plt.clf()
解决stdout输出报错
Spyder的sys.stdout是TTYOutStream类型,没有buffer属性,所以不能直接这么用。要是需要把图片存到内存缓冲区,改用io.BytesIO():
import matplotlib.pyplot as plt import io buffer = io.BytesIO() plt.plot([1,2,3]) plt.savefig(buffer, format='png') buffer.seek(0) # 把缓冲区指针移回开头 # 之后可以处理buffer里的数据,比如写文件或者传输 plt.clf()
内容的提问来源于stack exchange,提问作者6502Assembly4NESgames
相关产品推荐
相关产品推荐

