如何在 ipython 中渲染 matplotlib 图

Jef*_*eff 6 matplotlib ipython docker visual-studio-code jupyter-console

我有一个运行 Python/JupyterLab 和我所有依赖项的容器。我从以下开始:

docker run --rm -it -p 8888:8888 \
  --mount type=bind,source=/project,target=/work \
  python-3.9.1-jupyterlab
Run Code Online (Sandbox Code Playgroud)

它启动 jupyterlab,我可以通过浏览器连接。一切都很好。


现在我正在尝试使用 VSCode 作为 Python IDE。将 VSCode 中的 shell 附加到我的容器很有帮助,这样我就可以在一个地方运行 iPython 并编辑我的代码。我从 VSCode Docker 扩展运行“附加外壳”:

docker exec -it {containerID} bash <
Run Code Online (Sandbox Code Playgroud)

然后我打开一个 iPython shell:

docker exec -it {containerID} bash <
Run Code Online (Sandbox Code Playgroud)

我看不到任何情节。我试过用不同的后端渲染它们(默认是“agg”)。我认为这是因为内核 - 在容器上执行 - 无法使用主机图形(即,内核可以渲染绘图但无法显示它们)。也许我没有正确映射主机/容器端口。

有人可以就尝试的事情提供一些指导吗?这是我正在使用的容器的图像

jor*_*ski 3

您正在 shell 中运行 jupyterlab,这不是图形环境。此外,如果您从非 X11 桌面运行 Docker 容器,则不会设置 DISPLAY 变量(X11 用于显示图形)。如果您从 Linux 桌面运行它,您可以将环境设置为允许 X11,如本示例所示,但并非所有环境都相同,您可能需要进一步研究如何设置特定环境以允许来自 docker 的 X11 服务器容器与主机上的 X11 客户端通信(注意,在 X11 中,应用程序是server,桌面是client

在 Linux 上,如果未设置环境变量 DISPLAY,“事件循环”将被识别为“无头”,这会导致回退到非交互式后端 (agg)。您可以在 matplotlib文档中阅读有关后端以及如何选择它们的更多信息。一旦“偶循环”设置为“无头”,所有渲染都将在文件中完成。您可以检查此答案,了解如何将 mahtplotlib 与此后端一起使用。

使用 Jupyther 和 VSCode 的好处的一个好方法是使用 VSCode 的扩展。最流行的扩展之一是 Microsoft 开发的jupyter 。该扩展将使您拥有与使用浏览器相同的体验。