Как мне заставить matplotlib работать в ноутбуке AWS EMR Jupyter?

Это очень близко к этому вопросу, но я добавил несколько деталей, специфичных для моего вопроса:

Matplotlib Plotting с использованием ноутбука AWS-EMR jupyter

Я хотел бы найти способ использовать matplotlib внутри моего ноутбука Jupyter. Вот фрагмент кода по ошибке, он довольно прост:

ноутбук

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'

к моей записной книжке, которая вызывает команду "Волшебная искра", которая встраивает графики matplotlib (по крайней мере, в мою интерпретацию). Я попробовал оба из них после использования действия начальной загрузки:

EMR начальная загрузка

sudo pip install matplotlib
sudo pip install ipython

Даже с учетом этого, я все еще получаю сообщение об ошибке, что нет волшебства для matplotlib. Так что мой вопрос определенно:

Вопрос

Как заставить matplotlib работать в ноутбуке AWS EMR Jupyter?

(Или как просматривать графики и изображения в блокноте AWS EMR Jupyter?)

Ответ 1

Как вы упомянули, matplotlib не установлен в кластере EMR, поэтому возникает такая ошибка:

error

Однако он фактически доступен в управляемом экземпляре ноутбука Jupyter (контейнере Docker). Использование %%local magic позволит вам запустить ячейку локально:

local

Ответ 2

Следующее должно работать:

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

Запустите весь скрипт в одной ячейке

Ответ 3

Хорошо, я также сталкиваюсь с несколько похожей ошибкой. Вот подробности:

Я могу построить график с помощью matplotlib, как показано ниже

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt

df = [1, 1.6, 3, 4.2, 5, 4, 2.5, 3, 1.5]
plt.plot(df)

Теперь приведенный выше фрагмент кода работает довольно аккуратно для меня.

После этого примера я продвинулся дальше, чтобы построить график данных моего панды из новой/нескольких ячеек в AWS-EMR Jupyterhub следующим образом:

-Cell 1-
sparkDS=spark.read.parquet('s3://bucket_name/path').cache()


-Cell 2-
from pyspark.sql.functions import *
sparkDS_groupBy=sparkDS.groupBy('col1').agg(count('*').alias('count')).orderBy('col1')
pandasDF=sparkDS_groupBy.toPandas()


-cell 3-
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt

plt.plot(pandasDF)

Мой код просто не работает в ячейке 3 со следующей ошибкой:

NameError: имя 'pandasDF' не определено

У кого-нибудь есть идеи, что не так?

Почему новая ячейка в моем блокноте jupyterhub не может распознать переменную из предыдущей ячейки?

Должен ли он что-то делать с магической командой "% matplotlib inline" (я тоже пробовал с "% matplotlib notebook", но не смог)?

PS: я использую настройки ноутбука AWS 5.19 EMR-Jupyterhub для своей работы по печати.

Ответ 4

Попробуйте код ниже. К вашему сведению, мы установили matplotlib 3.1.1 в Python3.6 на emr-5.26.0, и я использовал PySpark Kernel. Убедитесь, что "% matplotlib inline" является первой строкой в ячейке

%matplotlib inline

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