如何在IPython中呈现matplotlib图表

6

我正在运行一个包含Python/JupyterLab和所有依赖项的容器。我使用以下命令启动它:

docker run --rm -it -p 8888:8888 \
  --mount type=bind,source=/project,target=/work \
  python-3.9.1-jupyterlab

它启动了JupyterLab,我可以通过浏览器连接。一切正常。


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

docker exec -it {containerID} bash <

然后我打开了一个iPython shell:

jo@:~/work $ ipython --pylab

Python 3.9.1
IPython 7.20.0 -- An enhanced Interactive Python.
Using matplotlib backend: agg

In [1]: matplotlib.get_backend()
Out[1]: 'agg'

In [2]: import matplotlib.pyplot as plt

In [3]: plt.plot([1.6, 2.7])
Out[3]: [<matplotlib.lines.Line2D at 0x7f5ed0ed8d30>]

In [4]: plt.show()

In [5]: %matplotlib inline

In [6]: plt.plot([1.6, 2.7])
Out[6]: [<matplotlib.lines.Line2D at 0x7f5ed0df5d60>]
<Figure size 432x288 with 1 Axes>

In [7]: plt.show()

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

能否有人提供一些尝试的指导? 这是我正在使用的容器的镜像

1个回答

3
您正在shell中运行jupyterlab,这不是一个图形化环境。此外,如果您从非X11桌面运行Docker容器,则DISPLAY变量(用于显示图形的X11)将不会设置。如果您是从Linux桌面运行它,您可以设置环境以允许X11,如此示例,但对于所有环境都不相同,您可能需要进一步研究如何设置特定环境以允许docker容器与主机上的X11客户端通信(请注意,在X11中,应用程序是server和桌面是client)。
在Linux上,如果环境变量DISPLAY未设置,“事件循环”将被标识为“headless”,这会导致回退到非交互式后端(agg)。您可以在matplotlib文档中了解有关后端及其选择方式的更多信息。一旦将“事件循环”设置为“headless”,所有呈现都将在文件中完成。您可以查看这个答案,了解如何使用此后端与mahtplotlib。
使用Jupyther和VSCode的好方法是使用VSCode的扩展程序。最受欢迎的扩展之一是由Microsoft开发的jupyter。该扩展将允许您拥有与使用浏览器相同的体验。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接