Jak mogę otworzyć interaktywne okno matplotlib w notatniku IPython?

125

Używam IPythona --pylab=inlinei czasami chciałbym szybko przełączyć się na interaktywny, skalowalny graficzny interfejs użytkownika matplotlib do przeglądania wykresów (ten, który pojawia się, gdy rysujesz coś w konsoli terminala Pythona). Jak mogłem to zrobić? Najlepiej bez wychodzenia lub ponownego uruchamiania notebooka.

Problem z wykresami inline w notebooku IPy polega na tym, że mają ograniczoną rozdzielczość i nie mogę ich powiększyć, aby zobaczyć mniejsze części. Dzięki graficznemu interfejsowi użytkownika maptlotlib, który zaczyna się od terminala, mogę wybrać prostokąt wykresu, który chcę powiększyć, i odpowiednio dopasować osie. Próbowałem poeksperymentować

from matplotlib import interactive
interactive(True)

i

interactive(False)

ale to nic nie dało. Nie mogłem też znaleźć żadnej wskazówki w Internecie.

metakermit
źródło
4
Innym możliwym rozwiązaniem pierwotnego problemu jest włączenie powiększania wykresów wbudowanych, co jest teraz możliwe, jak opisałem tutaj: stackoverflow.com/a/22949003/145823
yonilevy
3
%matplotlib notebook działa
mion

Odpowiedzi:

140

Zgodnie z dokumentacją powinieneś móc przełączać się w tę iz powrotem w następujący sposób:

In [2]: %matplotlib inline 
In [3]: plot(...)

In [4]: %matplotlib qt  # wx, gtk, osx, tk, empty uses default
In [5]: plot(...) 

a to wyskoczy zwykłe okno wykresu (może być konieczne ponowne uruchomienie notebooka).

Mam nadzieję, że to pomoże.

Adrian Martin
źródło
2
To jest %pylab qt. Nie działa w OS X. Może w Ubuntu to pomoże.
metakermit
11
Niestety nie możesz przełączać się tam i z powrotem. Jeśli spróbujesz przełączyć się po uruchomieniu z pylab = inline lub pylab = qt, otrzymasz: To wywołanie matplotlib.use () nie ma żadnego efektu, ponieważ backend został już wybrany; matplotlib.use () musi zostać wywołana przed pierwszym zaimportowaniem pylab, matplotlib.pyplot lub matplotlib.backends.
Charl Botha
3
Odrzuciłem to, ponieważ nie zadziałało i nadal nie działa, ale najwyraźniej jest to numer 1927 i powinien zostać naprawiony za pomocą merge 2179 . @yarox, jeśli zmodyfikujesz swoją odpowiedź, aby uwzględnić te informacje, cofnę mój głos przeciw.
askewchan
2
działa dobrze również na OSX, używając ipython v1.1.0 i MPL 1.3.0
K.-Michael Aye
1
U mnie działa teraz (2014-08) przy użyciu bieżącej wersji Pythona 2.7 na Win7 x64.
nerdfever.com
65

Jeśli wszystko, co chcesz zrobić, to przełączyć się z wykresów w wierszu na interaktywne iz powrotem (aby można było przesuwać / powiększać), lepiej użyć magii% matplotlib.

#interactive plotting in separate window
%matplotlib qt 

i wróć do html

#normal charts inside notebooks
%matplotlib inline 

% pylab magic importuje kilka innych rzeczy i może nawet spowodować konflikt. Robi to „z importu z pylab *”.

Możesz także użyć nowego zaplecza notebooka (dodanego w matplotlib 1.4):

#interactive charts inside notebooks, matplotlib 1.4+
%matplotlib notebook 

Jeśli chcesz mieć więcej interaktywności na swoich wykresach, możesz spojrzeć na mpld3 i bokeh . mpld3 jest świetny, jeśli nie masz mnóstwa punktów danych (np. <5k +) i chcesz używać normalnej składni matplotlib, ale większej interaktywności w porównaniu z notatnikiem% matplotlib. Bokeh może obsługiwać wiele danych, ale musisz nauczyć się jego składni, ponieważ jest to oddzielna biblioteka.

Możesz również sprawdzić pivottablejs (pip install pivottablejs)

from pivottablejs import pivot_ui
pivot_ui(df)

Jakkolwiek fajna jest interaktywna eksploracja danych, może ona całkowicie zepsuć powtarzalność. Przydarzyło mi się to, więc staram się go używać tylko na bardzo wczesnym etapie i przechodzę na czysty inline matplotlib / seaborn, gdy tylko wyczuję dane.

volodymyr
źródło
1
Warning: Cannot change to a different GUI toolkit: notebook. Using qt instead.dla %matplotlib notebook.
mLstudent33
1
ImportError: Failed to import any qt bindingdla polecenia qt magic
mLstudent33
31

Począwszy od wersji matplotlib 1.4.0 istnieje teraz interaktywne zaplecze do użytku w notebooku

%matplotlib notebook

Istnieje kilka wersji IPythona, które nie mają zarejestrowanego aliasu, powrót to:

%matplotlib nbagg

Jeśli to nie zadziała, zaktualizuj IPython.

Aby się z tym bawić, przejdź do tmpnb.org

i wklej

%matplotlib notebook

import pandas as pd
import numpy as np
import matplotlib

from matplotlib import pyplot as plt
import seaborn as sns

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
                  columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
df.plot(); plt.legend(loc='best')    

do komórki kodu (lub po prostu zmodyfikuj istniejący notatnik demonstracyjny Pythona)

tacaswell
źródło
6

Lepszym rozwiązaniem Twojego problemu może być biblioteka Wykresów . Umożliwia korzystanie z doskonałej biblioteki javascript Highcharts do tworzenia pięknych i interaktywnych wykresów. Highcharts używa svgznacznika HTML, więc wszystkie Twoje wykresy są w rzeczywistości obrazami wektorowymi.

Niektóre funkcje:

  • Wykresy wektorowe, które można pobrać w formatach .png, .jpg i .svg, dzięki czemu nigdy nie napotkasz problemów z rozdzielczością
  • Interaktywne wykresy (powiększanie, przesuwanie, najeżdżanie na punkty, ...)
  • Do użytku w notatniku IPython
  • Eksploruj setki struktur danych w tym samym czasie, korzystając z możliwości kreślenia asynchronicznego.

Zastrzeżenie: jestem twórcą biblioteki

arnoutaertgeerts
źródło
Całkiem niezła biblioteka! Na pewno spróbuję :)
metakermit
Dzięki! Daj mi znać, co myślisz na githubie i zgłoś problem, jeśli napotkasz jakiekolwiek problemy :)
arnoutaertgeerts
1
Chociaż ta odpowiedź jest zdecydowanie istotna, niekoniecznie nazwałbym ją „lepszym rozwiązaniem”. Najprawdopodobniej to właśnie spowodowało w przeszłości negatywną opinię.
volodymyr
1
Negocjowano, ponieważ ten post nie mówi mi, w jaki sposób mogę używać biblioteki Wykresów, aby otworzyć interaktywne okno wykresu.
Robert Hönig,
4

Używam ipythona w „jupyter QTConsole” firmy Anaconda pod adresem www.continuum.io/downloads 28.05.20117.

Oto przykład przełączania się między oddzielnym oknem i trybem kreślenia w wierszu przy użyciu magii ipython.

>>> import matplotlib.pyplot as plt

# data to plot
>>> x1 = [x for x in range(20)]

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Note: the %matplotlib magic above causes:
#      plt.plot(...) 
# to implicitly include a:
#      plt.show()
# after the command.
#
# (Not sure how to turn off this behavior
# so that it matches behavior without using %matplotlib magic...)
# but its ok for interactive work...
Bill Moore
źródło
1
Kiedy próbuję użyć, %matplotlibImportError: No module named 'PyQt4'
pojawia
Mam dokładnie ten sam problem, co user3731622. Co można zrobić? To jest dla większości odpowiedzi na tej stronie
bernando_vialli
@mkheifetz @ user3731622 Może być konieczne zainstalowanie pakietu: sudo apt-get install python-pyqt5lubsudo apt-get install python-pyqt5
ttb
2

Zrestartuj jądro i wyczyść wyjście (jeśli nie zaczynasz od nowego notatnika), a następnie uruchom

%matplotlib tk

Aby uzyskać więcej informacji, przejdź do Plotting with matplotlib

Marcin Lentner
źródło
0

Możesz użyć

%matplotlib qt

Jeśli pojawił się błąd, ImportError: Failed to import any qt bindingzainstaluj PyQt5 jako: pip install PyQt5i działa dla mnie.

susan097
źródło