如何在AWS EMR Jupyter笔记本中使用Matplotlib?

29

这与该问题非常接近,但我添加了一些特定于我的问题的细节:

使用 AWS-EMR jupyter 笔记本进行 Matplotlib 绘图

我想找到一种在 Jupyter 笔记本中使用 matplotlib 的方法。 这是出错的代码片段,它非常简单:

笔记本

import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show()

我选择这段代码片段是因为单独这一行会失败,因为它试图使用TKinter(在AWS EMR集群上未安装):

import matplotlib.pyplot as plt

当我运行完整的笔记本片段时,没有运行时错误,但也没有任何反应(没有显示图形)。我了解到其中一种方法是通过添加以下任一代码片段来实现:

pyspark魔法符号

%matplotlib inline

结果

unknown magic command 'matplotlib'
UnknownMagic: unknown magic command 'matplotlib'

IPython 显式魔术调用

from IPython import get_ipython
get_ipython().run_line_magic('matplotlib', 'inline')

结果

'NoneType' object has no attribute 'run_line_magic'
Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'run_line_magic'

我希望将一个spark魔法命令嵌入到我的笔记本中,以内联matplotlib绘图(至少这是我的解释)。在使用引导操作后,我尝试了以下两种方法:

EMR引导操作

sudo pip install matplotlib
sudo pip install ipython

即使添加了这些内容,我仍然会收到一个错误,指出matplotlib没有魔法命令。所以我的问题是:
问题
如何在AWS EMR Jupyter笔记本中使matplotlib工作?
(或者如何在AWS EMR Jupyter笔记本中查看图形和绘制图像?)

从@FoxanNg发布的图片中,我可以看到jupyter实例正在使用一个conda环境(这可能是为Jupyter创建的虚拟环境)。我们可以尝试在引导程序中使用conda而不是pip安装matplotlib并尝试一下。 - DaRkMaN
我不确定集群是如何设置的。但从图像来看,似乎是 `/opt/conda/bin/conda'。我们可以使用完整路径进行安装吗? - DaRkMaN
它在引导时无法找到conda安装:/opt/conda/bin/conda: command not found - Matt
我们在引导过程中不会安装conda。 - Matt
% 命令是 IPython 或 Jupyter 魔术命令。运行 %lsmagic 并检查其中是否包含 %matplotlib。如果找到 %matplotlib,则运行 %matplotlib -l 列出可用的后端。您可以通过运行 %matplotlib <后端名称> 显式地要求特定的后端。 - Nizam Mohamed
显示剩余4条评论
7个回答

11

@00schneider的答案实际上是有效的。

import matplotlib.pyplot as plt

# plot data here
plt.show()

之后

plt.show()

重新运行包含以下代码的魔术单元格,您将在AWS EMR Jupyter PySpark笔记本上看到一张图表。

%matplot plt

这是显示图形的命令。最后,有人回答了与原问题和我的使用情况相同的问题,即连接到Sparkmagic(PySpark)内核的AWS Sagemaker Jupyter笔记本。 - Pablo Adames
1
当我运行%matplot plt绘图后,出现错误:UsageError: Cell magic %%matplot not found. - Yue Y
对我来说,这只是输出一个非常长的字符串,可能是图像的base64表示。 - Nic Scozzaro
@NicScozzaro 尝试将 %matplot plt 放在与生成图表的单元格分开的单独单元格中。 - joon

8

正如您所述,EMR集群上未安装matplotlib,因此会出现此类错误:

error

然而,它实际上可用于托管的Jupyter笔记本实例(即docker容器)。使用%%local魔法命令将允许您在本地运行单元格:

local


2
这个答案使得第一个单元格(我放置了%%local的地方)运行速度更快,但是添加任何其他导入(例如tensorflow)都会失败,尽管之前已经安装并且工作正常。点赞是因为它在技术上使代码片段运行,但不接受,因为它几乎使笔记本无法使用。 - Matt
有没有办法在那个Docker容器中安装matplotlib?也许可以用conda - Kenry Sanchez
https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-jupyterhub-install-kernels-libs.html - Kenry Sanchez
1
这个答案可能适用于其他情境,但它在连接到运行Sparkmagic(PySpark)内核的EMR集群的AWS Jupyter笔记本上无法工作。 - Pablo Adames

4

它是matplotlib库的一部分吗?还是只是AWS的东西? - panc

2
以下内容应该可以正常工作:

最初的回答:

import matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])

在一个单元格中运行整个脚本。最初的回答保留html标签。

3
我感激你试图解决问题。我在问题中尝试解决了这个问题,但是在使用"%matplotlib inline"这一行时出现了错误(我将把错误添加到原问题中):"unknown magic command 'matplotlib'"。 - Matt
3
好的,您可以尝试使用 get_ipython().magic(u'matplotlib inline') 而不是 %matplotlib inline - Prachiti Prakash Prabhu
1
谢谢,但不幸的是 get_ipython() 返回 None,因此 get_ipython().magic() 会失败 :( - Matt
使用@Matt的建议,我得到了“名称'get_ipython'未定义”的错误。 - Pablo Adames

1
要在AWS EMR笔记本中绘制图形,只需使用%matplot plt。您可以在this page from AWS的中间部分看到此文档记录。
例如,如果我想快速绘制一个图:
import matplotlib.pyplot as plt

plt.clf() #clears previous plot in EMR memory
plt.plot([1,2,3,4])
plt.show()

%matplot plt

这是在pyspark内核中对我有效的唯一答案。 - Buddha

1
%matplot plt

在我使用 plt.show() 函数后生效。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-1

尝试以下代码。请注意,我们在emr-5.26.0上安装了Python3.6中的matplotlib 3.1.1,并使用了PySpark内核。 确保“%matplotlib inline”是单元格中的第一行

%matplotlib inline

import matplotlib
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show()

这在运行Sparkmagic(PySpark)内核的AWS Sagemaker jupyter笔记本上无法工作。 - Pablo Adames

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