PAYATHON 2026

LangChain 在 VS Code 中无法显示 count plot

支付老李

结论

这通常不是 LangChain 或 VS Code 执行失败,而是绘图库在不同运行环境中的显示方式不同。

Jupyter Notebook 通常会自动渲染当前图形,普通的 VS Code Python 脚本则不会。生成图表的代码需要显式调用:

plt.show()

最直接的解决办法是在提示词中明确要求 Agent 使用 Matplotlib 或 Seaborn,并在绘图后执行 plt.show()。为了避免图形窗口无法显示,还可以同时调用 plt.savefig(...),把图表保存为文件。

原因

create_csv_agent 会让模型生成并执行 Python 代码。收到 生成 count plot 之类的请求时,它可能只生成:

sns.countplot(data=df, x="Payment")

Jupyter Notebook 通常会自动渲染图形对象,所以即使没有 plt.show(),也可能看到图表。

在 VS Code 中直接运行 .py 文件时,这段代码只会创建图形。如果模型生成的代码没有调用 plt.show(),脚本可能正常结束,既不报错,也不弹出图形窗口。这就会出现文本答案正常返回、图表却没有显示的情况。

解决方法

1. 在提示词中明确要求调用 plt.show()

result = agent.run(
    """
    Generate a count plot of the Payment column using seaborn.
    After creating the plot, call matplotlib.pyplot.tight_layout()
    and matplotlib.pyplot.show() explicitly.
    """
)

print(result)

Agent 执行的绘图代码由模型生成,因此提示词要写清楚。只说 Generate a count plot,不能保证模型会调用 plt.show()。

2. 同时保存图表文件

如果运行环境没有可用的图形界面,或者图形窗口一闪而过,保存图片会更可靠:

result = agent.run(
    """
    Generate a count plot of the Payment column using seaborn.
    Save the figure as payment_count_plot.png with dpi=150 and
    bbox_inches="tight", then call matplotlib.pyplot.show().
    """
)

print(result)

运行结束后,到当前工作目录检查:

payment_count_plot.png

也可以在提示词中指定绝对路径,免得找不到图片实际保存的位置。

3. 先验证 VS Code 能否显示 Matplotlib 图表

在同一个 Python 环境中单独运行以下脚本:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.read_csv("supermarket_sales - Sheet1.csv")

sns.countplot(data=df, x="Payment")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

如果这段代码能显示图表,说明 VS Code、Python 解释器和绘图库基本正常,问题多半是 Agent 生成的代码没有显式显示图形。

如果仍然无法显示,可以改为保存文件:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.read_csv("supermarket_sales - Sheet1.csv")

sns.countplot(data=df, x="Payment")
plt.tight_layout()
plt.savefig("payment_count_plot.png", dpi=150, bbox_inches="tight")

如果能生成 PNG,却无法弹出窗口,通常是当前 Matplotlib backend 或运行环境不支持交互式窗口。

检查 Matplotlib backend

先查看当前使用的 backend:

import matplotlib
print(matplotlib.get_backend())

如果结果是 Agg,说明当前使用的是非交互式 backend。它可以生成图片文件,但不会弹出图形窗口,此时应优先使用 savefig()。

如果电脑具备桌面图形环境,并且已经安装相应的 GUI 依赖,也可以在导入 matplotlib.pyplot 之前指定交互式 backend:

import matplotlib
matplotlib.use("TkAgg")

import matplotlib.pyplot as plt

不要随意切换 backend。远程 SSH、容器、WSL 或没有桌面环境的服务器通常无法使用 GUI,直接保存图片会更合适。

VS Code 中的运行方式

VS Code 支持多种 Python 运行方式,图表的显示行为也有所不同:

  • 在 .ipynb 或 Interactive Window 中运行时,图表通常会内嵌显示。
  • 使用 Run Python File 在终端中运行 .py 文件时,通常需要调用 plt.show()。
  • 在远程、容器或无图形界面的环境中,通常需要使用 plt.savefig()。

还要确认 VS Code 当前选择的 Python 解释器,就是安装了 langchain、matplotlib、seaborn 和 pandas 的那个环境。

推荐写法

让 Agent 生成图表时,可以同时要求它保存并显示图表:

from langchain.agents import create_csv_agent
from langchain.llms import OpenAI
import os

os.environ["OPENAI_API_KEY"] = "Your-API-Key"

agent = create_csv_agent(
    OpenAI(temperature=0.2),
    "supermarket_sales - Sheet1.csv",
    verbose=True,
)

response = agent.run(
    """
    Create a seaborn count plot for the Payment column.
    Add a descriptive title and axis labels.
    Call matplotlib.pyplot.tight_layout().
    Save the chart to payment_count_plot.png using dpi=150 and
    bbox_inches="tight".
    Finally, call matplotlib.pyplot.show() explicitly.
    """
)

print(response)

注意事项

  • verbose=True 可以帮助你检查 Agent 实际生成并执行了哪些代码,尤其要看其中是否包含 plt.show() 或 plt.savefig()。
  • Agent 返回自然语言答案,并不代表图表已经显示。图形窗口属于 Python 执行环境产生的副作用。
  • 如果模型只返回绘图代码或文字说明,没有实际执行绘图工具,也不会生成图表。具体行为取决于所用的 LangChain 版本和 Agent 配置。
  • 不要把真实 API Key 直接写入代码仓库。建议通过环境变量或 .env 文件加载。
  • LangChain 的导入路径和 Agent API 可能因版本而异。如果现有代码已经能返回文本结果,应先排查图形显示和 backend,而不是立刻更换 LangChain 版本。

备注:内容仅供参考。