Як зробити сюжет маплотлібу для ноутбука IPython


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 inline та plt.show ()) працює як очікується на Windows
Joaquin

Дякую за ці пропозиції, але вони не працюють на мене. Я все ще отримую вищезазначений вихід без вбудованої графіки. Чи є якісь поради щодо усунення несправностей?
Ян Фіске

ніякої підказки. Той самий пітон, той самий ipython (і той самий бекенд), але на Windows, і він працює .... Я вважаю, що сюжет працює для вас, коли не в рядку, правда?
Жоакін

2
без цього %matplotlib inlineядро залишається зайнятим постійно, і я не отримую виводу. Його треба вбити. Це намагається використовувати MacOSXбекенд, але я думаю, його не можна відкрити з якихось причин. Якщо не використовується ноутбук ipython, бекенд MacOSX для matplotlib працює чудово.
Ян Фіске

1
У мене був ідентичний симптом, але виявилося, що я встановив 32-бітну версію Canopy на OSX 10.8. Перевстановлення 64-бітної версії виправлено.
Vicky T

Відповіді:


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'. Будь-яка ідея, як отримати інтерактивні фігури сітківки?
orome

Гм ... Я насправді не маю занадто багато досвіду з фігурами сітківки. Єдине, на що я натрапив - це посилання , але воно може бути застарілим. Якщо більше людей цікавить одне і те ж, я пов'язую тут ваше питання ТА і бажаю удачі з відповідями там. Кращий
Løiten

31
Ця відповідь занижена. %matplotlib notebookзабезпечує кращу візуалізацію ніж %matplotlib inline.
Hieu

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в самому ноутбуці. "
Дейв X

14

Щоб зробити matplotlib inline за замовчуванням у 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



5

Я зробив встановлення анаконди, але 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

У мене була така ж проблема, коли я запускав команди для побудови графіків в окремих клітинках Юпітера:

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.