我有一个前端调用一个名为streamlit的包,如果我调用该函数,它将生成最新的Matplotlib对象
st.pyplot()
但是,我想获得实际的
fig
对象,因为我想单独存储。我面临的问题是
fig
是由另一个名为 Pandasai 的包创建的。 (即,我从来不需要导入 matplotlib 包)。
所以基本上我想在我的环境中全局查找无花果对象。
我尝试导入 Matplotlib 但我认为这不是正确的解决方案,因为它可能只是覆盖了实际的对象。
我也尝试使用 plt.gcf() 并将对象以这种方式附加到消息中
a = plt.gcf()
st.session_state.messages.append({"role": "assistant", "content": a})
但是在我要求 pandasai 生成另一个图表后,图表变成了空白
你几乎找到了!
plt.gcf()
的问题在于,如果还没有图形,它会创建一个新的图形。这就是为什么在获得第二个图形后,第一个图形会变成空白的原因。
以下是一些关于如何在不直接修改 PandasAI 或 Matplotlib 的情况下获取由 PandasAI 生成的 Matplotlib 图形对象的解决方法:
1. 使用
matplotlib._pylab_helpers
Matplotlib 将创建的图形存储在一个内部列表中。你可以访问此列表以获取最新的图形,而无需依赖
plt.gcf()
。
```python import matplotlib._pylab_helpers
def get_latest_fig(): figures = matplotlib._pylab_helpers.Gcf.get_all_fig_managers() if figures: return figures[-1].canvas.figure return None
# ...你的 PandasAI 代码生成一个图形...
fig = get_latest_fig() st.session_state.messages.append({"role": "assistant", "content": fig}) ```
此方法从 Matplotlib 的内部结构中获取图形,但它不依赖于可能改变的特定函数或属性名称。
2. Monkey Patching (不推荐,但可能有用)
如果你确定 PandasAI 使用了一个特定的函数来创建图形,你可以 monkey patch 该函数来存储图形对象以供以后使用。 警告: 这种方法依赖于 PandasAI 的内部结构,如果 PandasAI 更新,可能会失效。
```python import pandasai
original_plot_function = pandasai.DataFrame.plot # 假设 PandasAI 使用 DataFrame.plot
def patched_plot_function(self, args, kwargs): global latest_fig latest_fig = original_plot_function(self, args, **kwargs) return latest_fig
pandasai.DataFrame.plot = patched_plot_function
# ... 你的 PandasAI 代码生成一个图形 ...
fig = latest_fig st.session_state.messages.append({"role": "assistant", "content": fig}) ```
此方法用一个新版本替换了 PandasAI 中的
plot
函数,该版本存储了图形对象并将其返回。
请记住,这些解决方法依赖于 Matplotlib 和 PandasAI 的内部行为。如果这些库发生变化,这些解决方法可能需要调整。 ideal 的解决方案是让 PandasAI 提供一种直接访问生成的图形对象的本地方法。
标签:python,matplotlib,streamlit,pandasai From: 78814137