Как мне заставить 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()