如何在Matplotlib中混合使用交互式绘图与嵌入式绘图?
解决Matplotlib部分绘图设为Inline非交互式的问题
我之前也碰到过一模一样的需求——想让部分绘图变成静态的inline模式,同时保留其他图的交互性,试了好几种方法踩过坑,给你几个亲测有效的解决方案:
方案1:单个绘图精准切换Backend
你可以针对需要静态化的绘图单独切换后端,用完再切回原来的交互式后端,完全不影响其他图表:
import matplotlib.pyplot as plt # 先存好当前的交互式后端(比如notebook、Qt5Agg这类) original_backend = plt.get_backend() # 切换到*专门用来生成静态图的无交互agg后端* plt.switch_backend('agg') # 绘制你的静态图 fig, ax = plt.subplots() ax.plot([1,3,5], [2,4,6]) plt.show() # 这个图会以inline静态形式展示 # 切回原来的后端,后续绘图依然保持交互性 plt.switch_backend(original_backend)
方案2:用上下文管理器简化切换逻辑
如果觉得手动来回切换麻烦,可以封装一个上下文管理器,代码更清爽:
from contextlib import contextmanager import matplotlib.pyplot as plt @contextmanager def static_inline_plot(): original_backend = plt.get_backend() plt.switch_backend('agg') yield plt.switch_backend(original_backend) # 用法示例:需要静态图的代码块放在with里 with static_inline_plot(): fig, ax = plt.subplots() ax.bar(["A", "B"], [10, 15]) plt.show() # 这个是静态inline图 # 外面的绘图还是交互式的 fig2, ax2 = plt.subplots() ax2.scatter([1,2,3], [5,3,7]) plt.show()
为什么你之前的方法没效果?
plt.close(fig):这个只是关闭当前的figure对象,压根没改变绘图的交互模式,所以只会清图,不会转静态。plt.ioff():它是关闭全局的交互模式,但如果你的环境默认是notebook这类交互式后端,单纯关交互不会自动切换到inline渲染逻辑,所以没效果。- 用
%matplotlib inline和%matplotlib notebook包裹:这俩魔法命令是全局切换后端,一旦切换就会影响所有后续绘图,自然会把其他交互式图给关掉。
内容的提问来源于stack exchange,提问作者somebody4




