Как сделать IPython Notebook Matplotlib встроенным в сюжет


831

Я пытаюсь использовать ноутбук IPython на MacOS X с Python 2.7.2 и IPython 1.1.0.

Я не могу получить графику Matplotlib, чтобы показать в строке.

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

Я также пробовал %pylab inlineи аргументы командной строки ipython, --pylab=inlineно это не имеет значения.

x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp')
plt.show()

Вместо встроенной графики я получаю это:

<matplotlib.figure.Figure at 0x110b9c450>

И matplotlib.get_backend()показывает, что у меня есть 'module://IPython.kernel.zmq.pylab.backend_inline'бэкэнд.


ваш фрагмент кода не должен выдавать, <matplotlib.figure.Figure at 0x110b9c450>но <matplotlib.text.Text at 0x94f9320>(потому что ваша последняя строка печатает заголовок). В любом случае, ваш код (с встроенным% matplotlib и plt.show ()) работает как положено в Windows
Joaquin

Спасибо за эти предложения, но они не работают для меня. Я все еще получаю вышеупомянутый вывод без встроенной графики. Есть ли у вас какие-либо советы по устранению неполадок?
Ян Фиске

без понятия. Тот же python, тот же ipython (и тот же backend), но на окнах, и он работает .... Я полагаю, что сюжет работает для вас, когда не inline, верно?
Хоакин

2
без %matplotlib inline, ядро ​​остается постоянно занятым, и я не получаю вывод. Это должно быть убито. Это пытается использовать MacOSXбэкэнд, но я думаю, что по какой-то причине его нельзя открыть. Когда не используется ноутбук ipython, бэкэнд MacOSX для matplotlib работает просто отлично.
Ян Фиске

1
У меня был идентичный симптом, но оказалось, что я установил 32-разрядную версию Canopy на OSX 10.8. Переустановка с 64-битной версией исправила это.
Вики Т

Ответы:


1130

Я использовал %matplotlib inlineв первой ячейке ноутбука, и это работает. Я думаю, что вы должны попробовать:

%matplotlib inline

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

Вы также всегда можете запустить все свои ядра IPython по умолчанию в встроенном режиме, установив следующие параметры конфигурации в своих файлах конфигурации:

c.IPKernelApp.matplotlib=<CaselessStrEnum>
  Default: None
  Choices: ['auto', 'gtk', 'gtk3', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt4', 'qt5', 'tk', 'wx']
  Configure matplotlib for interactive use with the default matplotlib backend.

7
Я бы отметил это как правильный ответ. Альтернатива --pylab inlineработает, но приветствует вас следующим предупреждением: запускать все ядра в режиме Pylab не рекомендуется и будет отключен в следующем выпуске. Пожалуйста, используйте магию% matplotlib, чтобы вместо нее включить matplotlib. pylab подразумевает много импортов, которые могут иметь запутанные побочные эффекты и нанести ущерб воспроизводимости ваших ноутбуков.
mpavlov

1
@ eNord9 @mightwolf: я учусь использовать iPython (и программирование на Python вместо Matlab); что import matplotlib' do versus импортирует matplotlib как [имя] '? Простите за упрощенный комментарий
TSGM

1
@ eNord9 @mightwolf: а также как это можно сравнить с `из matplotlib import mpl '.
TSGM

2
@TSGM Лучшее объяснение вашего вопроса, которое я видел, это: effbot.org/zone/import-confusion.htm
mpavlov

Спасибо @ eNord9. Я только что проверил ваши команды, так как прошло много времени с обновлениями и прочим. Теперь все отлично работает на Python 2.7.9 и IPython 3.1.0.
Ян Фиске

216

Если ваша версия matplotlib выше 1.4, также возможно использовать

IPython 3.x и выше

%matplotlib notebook

import matplotlib.pyplot as plt

старые версии

%matplotlib nbagg

import matplotlib.pyplot as plt

Оба активируют бэкэнд nbagg , который обеспечивает интерактивность.

Пример графика с бэкэндом nbagg


Это не похоже на работу %config InlineBackend.figure_format='retina'. Есть идеи, как получить интерактивные фигуры Retina?
Оромэ

Хм ... У меня нет особого опыта с фигурами сетчатки. Единственное, на что я наткнулся, была эта ссылка , но она может быть устаревшей. Если больше людей интересуются тем же, я связываю ваш ТАК вопрос здесь и желаю вам удачи с ответами там. Лучший
Løiten

31
Этот ответ недооценен. %matplotlib notebookобеспечивает лучшую визуализацию, чем %matplotlib inline.
Хиеу

9
Использование %matplotlib notebookне работает (вид показывает что-то, а затем пусто) на ноутбуке Jupyter 4.1.1 / Ubuntu 16.04 / Chrome, %matplotlib inlineпоказывает изображения, но они идут после текста уценки, а не буквально «встроенный».
Майкл

6
Если вы %matplotlib inlineсначала попробовали, а затем переключились на %matplotlib notebook, вы можете получить пустой результат. Перезапустите ядро ​​и снова запустите.
Чехнология


24

Используйте %pylab inlineмагическую команду.


14
Больше не нужно: «ipython notebook --pylab inline [E 15: 01: 18.182 NotebookApp] Удалена поддержка указания --pylab в командной строке. [E 15: 01: 18.182 NotebookApp] Пожалуйста, используйте %pylab inlineили %matplotlib inlineв самой записной книжке. "
Дейв Икс

14

Чтобы сделать Matplotlib встроенным по умолчанию в Jupyter (IPython 3):

  1. Редактировать файл ~/.ipython/profile_default/ipython_config.py

  2. Добавить строку c.InteractiveShellApp.matplotlib = 'inline'

Обратите внимание, что добавление этой строки ipython_notebook_config.pyне будет работать. В противном случае это хорошо работает с Jupyter и IPython 3.1.0


10

Я должен согласиться с foobarbecue (мне не хватает рексов, чтобы можно было просто вставить комментарий под его постом):

Теперь рекомендуется, чтобы ноутбук python не запускался с аргументом --pylab, и, по словам Фернандо Переса (создателя ipythonnb), он %matplotlib inlineдолжен быть начальной командой ноутбука.

Смотрите здесь: http://nbviewer.ipython.org/github/ipython/ipython/blob/1.x/examples/notebooks/Part%203%20-%20Plotting%20with%20Matplotlib.ipynb


7

Я нашел обходной путь, который вполне удовлетворителен. Я установил Anaconda Python, и теперь он работает для меня из коробки.


5

Я установил Anaconda, но Matplotlib не готовит

Это начинает заговор, когда я сделал это

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

2

Вы можете смоделировать эту проблему с синтаксической ошибкой, однако, %matplotlib inlineне решит проблему.

Сначала пример правильного способа создания сюжета. Все работает, как и ожидалось, с импортом и магией, которые поставил eNord9 .

df_randNumbers1 = pd.DataFrame(np.random.randint(0,100,size=(100, 6)), columns=list('ABCDEF'))

df_randNumbers1.ix[:,["A","B"]].plot.kde()

Однако, оставив за ()пределами типа графика, вы получите несколько неоднозначную ошибку.

Ошибочный код:

df_randNumbers1.ix[:,["A","B"]].plot.kde

Пример ошибки:

<bound method FramePlotMethods.kde of <pandas.tools.plotting.FramePlotMethods object at 0x000001DDAF029588>>

Кроме этого однострочного сообщения, нет трассировки стека или другой очевидной причины думать, что вы допустили синтаксическую ошибку. Сюжет не печатается.


Это не ошибка синтаксиса - без ()для вызова kde , IPython говорит вам , что kde есть , а именно, связанный метод. Так что, на самом деле, с точки зрения iPython, это вовсе не «ошибка», поэтому и не существует трассировки стека.
Кайл Стрэнд

1
@KyleStrand Спасибо. После перечитывания моего поста я должен был сказать следующее: «Я думал, что у меня возникла проблема с тем, чтобы мои графики не отображались встроенными с помощью %matplotlib inlineкоманды. Действительно, я просто забыл поставить () в конце типа графика. все остальное терпит неудачу, посмотрите на свои круглые скобки для ошибки. "
Блейк М

1

У меня была такая же проблема, когда я выполнял команды построения в отдельных ячейках в Jupyter:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         <Figure size 432x288 with 0 Axes>                      #this might be the problem
In [4]:  ax = fig.add_subplot(1, 1, 1)
In [5]:  ax.scatter(x, y)
Out[5]:  <matplotlib.collections.PathCollection at 0x12341234>  # CAN'T SEE ANY PLOT :(
In [6]:  plt.show()                                             # STILL CAN'T SEE IT :(

Проблема была решена путем объединения команд построения в одну ячейку:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         ax = fig.add_subplot(1, 1, 1)
         ax.scatter(x, y)
Out[3]:  <matplotlib.collections.PathCollection at 0x12341234>
         # AND HERE APPEARS THE PLOT AS DESIRED :)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.