Dieses Modul bietet eine Julia-Schnittstelle zur Matplotlib-Plotbibliothek von Python und insbesondere zum Modul matplotlib.pyplot
.
PyPlot verwendet das Julia PyCall-Paket, um Matplotlib mit geringem oder keinem Overhead direkt aus Julia aufzurufen (Arrays werden übergeben, ohne eine Kopie zu erstellen). (Siehe auch PythonPlot.jl für eine Version von PyPlot.jl, die das alternative Paket PythonCall.jl verwendet.)
Dieses Paket nutzt die Multimedia-I/O-API von Julia, um Diagramme in jedem grafischen Backend von Julia anzuzeigen, einschließlich als Inline-Grafiken in IJulia. Alternativ können Sie ein Python-basiertes grafisches Matplotlib-Backend verwenden, um interaktives Plotzoomen usw. zu unterstützen.
(Dieses PyPlot-Paket ersetzt ein früheres Paket mit demselben Namen von Junfeng Li, das PyPlot über einen ZeroMQ-Socket mit IPython verwendete.)
Um PyPlot verwenden zu können, muss auf Ihrem Computer die Python-Matplotlib-Bibliothek installiert sein. Sie können entweder Inline-Plots mit IJulia durchführen, wofür kein GUI-Backend erforderlich ist, oder die Qt-, WX- oder GTK+-Backends von Matplotlib verwenden, wie unten beschrieben.
Sobald Matplotlib installiert ist, können Sie einfach Pkg.add("PyPlot")
in Julia verwenden, um PyPlot und seine Abhängigkeiten zu installieren.
Wenn Sie PyCall so einrichten, dass das Conda.jl-Paket zur Installation einer privaten (nicht im System PATH
enthaltenen) Julia-Python-Distribution (über Miniconda) verwendet wird, installiert PyPlot Matplotlib automatisch nach Bedarf.
Wenn Sie PyCall und PyPlot zum ersten Mal installieren, führen Sie einfach ENV["PYTHON"]=""
aus, bevor Sie Pkg.add("PyPlot")
ausführen. Andernfalls können Sie PyCall für die Verwendung von Conda neu konfigurieren:
ENV [ " PYTHON " ] = " "
Pkg . build ( " PyCall " )
Wenn Sie PyPlot
das nächste Mal importieren, wird Conda angewiesen, Matplotlib zu installieren.
Unter MacOS sollten Sie entweder XQuartz für MacOS 10.9 oder höher installieren oder die Anaconda Python-Distribution installieren, um ein voll funktionsfähiges PyPlot zu erhalten.
MacOS 10.9 wird mit Python und Matplotlib geliefert, aber diese Version von Matplotlib verwendet standardmäßig das Cocoa-GUI-Backend, das von PyPlot nicht unterstützt wird. Es verfügt auch über ein Tk-Backend, das unterstützt wird, aber das Tk-Backend funktioniert nur, wenn Sie XQuartz installieren.
Alternativ können Sie die Anaconda-Python-Distribution installieren (die auch ipython
und andere IJulia-Abhängigkeiten enthält).
Ansonsten können Sie den Homebrew-Paketmanager verwenden:
brew install python gcc freetype pyqt
brew link --force freetype
export PATH= " /usr/local/bin: $PATH "
export PYTHONPATH= " /usr/local/lib/python2.7: $PYTHONPATH "
pip install numpy scipy matplotlib
(Möglicherweise möchten Sie die beiden export
zu Ihrer ~/.profile
Datei hinzufügen, damit sie automatisch ausgeführt werden, wenn Sie eine Shell starten.)
Sobald Matplotlib und PyPlot installiert sind und Sie eine grafikfähige Julia-Umgebung wie IJulia verwenden, können Sie einfach using PyPlot
tippen und mit dem Aufrufen von Funktionen in der matplotlib.pyplot-API beginnen. Zum Beispiel:
using PyPlot
# use x = linspace(0,2*pi,1000) in Julia 0.6
x = range ( 0 ; stop = 2 * pi , length = 1000 ); y = sin .( 3 * x + 4 * cos .( 2 * x));
plot (x, y, color = " red " , linewidth = 2.0 , linestyle = " -- " )
title ( " A sinusoidally modulated sinusoid " )
Im Allgemeinen sind alle Argumente, einschließlich der Schlüsselwortargumente, genau die gleichen wie in Python. (Bei kleineren Übersetzungen natürlich, z. B. verwendet Julia true
und nothing
anstelle von Pythons True
und None
.)
Die vollständige matplotlib.pyplot
API ist viel zu umfangreich, um sie hier zu beschreiben; Weitere Informationen finden Sie in der Dokumentation zu matplotlib.pyplot. Die Matplotlib-Versionsnummer wird von PyPlot.version
zurückgegeben.
Es wird nur die aktuell dokumentierte matplotlib.pyplot
-API exportiert. Um andere Funktionen im Modul zu verwenden, können Sie matplotlib.pyplot.foo(...)
auch als plt.foo(...)
aufrufen. Beispielsweise funktioniert plt.plot(x, y)
auch. (Und auf das rohe PyObject
für die matplotlib
-Module kann auch als PyPlot.matplotlib
zugegriffen werden.)
Matplotlib ist in Bezug auf die Groß- und Kleinschreibung etwas inkonsistent: Es hat contour3D
, aber bar3d
usw. PyPlot benennt alle derartigen Funktionen so um, dass sie ein großes D verwenden (z. B. hist2D
, bar3D
usw.).
Sie müssen auch einige in Julia-Funktionen integrierte Funktionen explizit qualifizieren. Insbesondere müssen PyPlot.xcorr
, PyPlot.axes
und PyPlot.isinteractive
verwendet werden, um auf matplotlib.pyplot.xcorr
usw. zuzugreifen.
Wenn Sie wie in Python üblich ausschließlich über plt.somefunction(...)
auf alle PyPlot-Funktionen zugreifen möchten, können Sie import PyPlot; const plt = PyPlot
anstelle von using PyPlot
.
Sie können die aktuelle Figur als Figure
Objekt (einen Wrapper um matplotlib.pyplot.Figure
) erhalten, indem Sie gcf()
aufrufen.
Der Figure
Typ unterstützt Julias Multimedia-I/O-API, sodass Sie display(fig)
verwenden können, um eine fig::PyFigure
anzuzeigen, und show(io, mime, fig)
(oder writemime
in Julia 0.4), um sie in einen bestimmten mime
Typ zu schreiben Zeichenfolge (z. B. "image/png"
oder "application/pdf"
), die vom Matplotlib-Backend unterstützt wird.
Wenn Sie PyPlot über eine interaktive Julia-Eingabeaufforderung verwenden, z. B. die Julia-Befehlszeileneingabeaufforderung oder ein IJulia-Notizbuch, werden Diagramme unmittelbar nach der Auswertung einer Plotfunktion ( plot
usw.) angezeigt.
Wenn Sie PyPlot jedoch aus einem Julia-Skript verwenden, das nicht interaktiv ausgeführt wird (z. B. julia myscript.jl
), wird Matplotlib im nicht interaktiven Modus ausgeführt: Ein Plotfenster wird erst geöffnet, wenn Sie show()
ausführen (entspricht plt.show()
in den Python-Beispielen).
PyPlot kann jedes Julia-Grafik-Backend verwenden, das PNG-, SVG- oder PDF-Bilder anzeigen kann, beispielsweise die IJulia-Umgebung. Um ein anderes Backend zu verwenden, rufen Sie einfach pushdisplay
mit dem gewünschten Display
auf; Weitere Einzelheiten finden Sie in der Julia-Multimedia-Anzeige-API.
Andererseits möchten Sie möglicherweise eines der Python-Matplotlib-Backends verwenden, um für jeden Plot ein interaktives Fenster zu öffnen (zum interaktiven Zoomen, Schwenken usw.). Sie können dies jederzeit tun, indem Sie Folgendes ausführen:
pygui ( true )
um die Python-basierte GUI (falls möglich) für nachfolgende Plots zu aktivieren, während pygui(false)
zum Julia-Backend zurückkehrt. Selbst wenn eine Python-GUI ausgeführt wird, können Sie die aktuelle Abbildung mit dem Julia-Backend anzeigen, indem Sie display(gcf())
ausführen.
Wenn beim Import von PyPlot kein Julia-Grafik-Backend verfügbar ist, ist pygui(true)
die Standardeinstellung.
Nur die Python-GUI-Backends Tk, wxWidgets, GTK+ (Version 2 oder 3) und Qt (Version 4 oder 5; über PyQt5, PyQt4 oder PySide) werden von PyPlot unterstützt. (Natürlich müssen Sie zuerst eines dieser Toolkits für Python installiert haben.) Standardmäßig wählt PyPlot beim Start eines davon aus (basierend auf dem, was Sie installiert haben), aber Sie können die Auswahl eines bestimmten Toolkits erzwingen, indem Sie das importieren PyCall-Modul und Verwendung seiner pygui
Funktion zum Festlegen eines Python-Backends vor dem Import von PyPlot:
using PyCall
pygui (gui)
using PyPlot
Dabei kann gui
derzeit eines von :tk
, :gtk3
, :gtk
, :qt5
, :qt4
, :qt
oder :wx
sein. Sie können auch einen Standardwert über den Matplotlib-Parameter rcParams['backend']
in Ihrer Matplotlibrc-Datei festlegen.
Das PyPlot-Modul exportiert auch einige Funktionen und Typen basierend auf den Modulen matplotlib.colors und matplotlib.cm, um die Verwaltung von Farbkarten (die zum Zuweisen von Werten zu Farben in verschiedenen Plottypen verwendet werden) zu vereinfachen. Insbesondere:
ColorMap
: ein Wrapper um den Typ matplotlib.colors.Colormap. Folgende Konstruktoren stehen zur Verfügung:
ColorMap{T<:Colorant}(name::String, c::AbstractVector{T}, n=256, gamma=1.0)
erstellt eine n
-Komponenten-Farbkarte durch lineare Interpolation der Farben im Array c
von Colorant
s (aus dem ColorTypes.jl-Paket). Wenn Sie möchten, dass ein name
automatisch erstellt wird, rufen Sie stattdessen ColorMap(c, n=256, gamma=1.0)
auf. Anstatt ein Array von Farben zu übergeben, können Sie alternativ auch eine drei- oder vierspaltige Matrix aus RGB- bzw. RGBA-Komponenten übergeben (ähnlich wie ListedColorMap in Matplotlib).
Noch allgemeinere Farbkarten können definiert werden, indem Arrays von (x,y0,y1)-Tupeln für die Rot-, Grün-, Blau- und (optional) Alpha-Komponenten übergeben werden, wie durch den matplotlib.colors.LinearSegmentedColormap-Konstruktor definiert, über: ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
oder ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, alpha::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
ColorMap(name::String)
gibt eine vorhandene (registrierte) Farbkarte zurück, äquivalent zu matplotlib.pyplot.get_cmap( name
).
Von Python-Funktionen zurückgegebene matplotlib.colors.Colormap
Objekte werden automatisch in den ColorMap
Typ konvertiert.
get_cmap(name::String)
oder get_cmap(name::String, lut::Integer)
rufen die Funktion matplotlib.pyplot.get_cmap auf.
register_cmap(c::ColorMap)
oder register_cmap(name::String, c::ColorMap)
rufen die Funktion matplotlib.colormap.register auf.
get_cmaps()
gibt eine Vector{ColorMap}
der aktuell registrierten Farbkarten zurück.
Beachten Sie, dass bei einer SVG-unterstützenden Anzeigeumgebung wie IJulia ColorMap
und Vector{ColorMap}
-Objekte grafisch angezeigt werden; Versuchen Sie es mit get_cmaps()
!
Das PyPlot-Paket importiert auch Funktionen aus dem mplot3d-Toolkit von Matplotlib. Im Gegensatz zu Matplotlib können Sie jedoch 3D-Plots direkt erstellen, ohne zuerst ein Axes3d-Objekt zu erstellen, indem Sie einfach eines der folgenden Elemente aufrufen: bar3D
, contour3D
, contourf3D
, plot3D
, plot_surface
, plot_trisurf
, plot_wireframe
oder scatter3D
(sowie text2D
, text3D
), genau wie die entsprechend benannten Methoden von Axes3d. Wir exportieren auch die Matlab-ähnlichen Synonyme surf
für plot_surface
(oder plot_trisurf
für 1D-Array-Argumente) und mesh
für plot_wireframe
. Sie können zum Beispiel Folgendes tun:
surf ( rand ( 30 , 40 ))
um ein zufälliges 30×40-Oberflächennetz zu zeichnen.
Sie können auch explizit einen Subplot mit 3D-Achsen erstellen, beispielsweise über subplot(111, projection="3d")
, genau wie in Matplotlib, aber Sie müssen zuerst die Funktion using3D()
aufrufen, um sicherzustellen, dass mplot3d geladen wird (dies passiert). automatisch für plot3D
etc.). Der Axes3D
Konstruktor und das art3D-Modul werden ebenfalls exportiert.
Mit Matplotlib können Sie LaTeX-Gleichungen in Plotbeschriftungen, Titeln usw. verwenden, indem Sie die Gleichungen einfach in Dollarzeichen ( $ ... $
) in die Zeichenfolge einschließen. Das Eingeben von LaTeX-Gleichungen in Julia-String-Literalen ist jedoch umständlich, da Escapezeichen erforderlich sind, um zu verhindern, dass Julia die Dollarzeichen und Backslashes selbst interpretiert. Beispielsweise wäre die LaTeX-Gleichung $alpha + beta$
in Julia die Literalzeichenfolge "$\alpha + \beta$"
.
Um dies zu vereinfachen, verwendet PyPlot das LaTeXStrings-Paket, um einen neuen LaTeXString
Typ bereitzustellen, der über L"...."
ohne Escape-Backslashes oder Dollarzeichen erstellt wird. Zum Beispiel kann man für die oben genannte Gleichung einfach L"$alpha + beta$"
schreiben und so Dinge tun wie:
title ( L " Plot of $ G amma_3(x)$ " )
Wenn Ihre Zeichenfolge nur Gleichungen enthält, können Sie die Dollarzeichen weglassen, z. B. L"alpha + beta"
, und sie werden automatisch hinzugefügt. Als zusätzlichen Vorteil wird ein LaTeXString
automatisch als gerenderte Gleichung in IJulia angezeigt. Weitere Informationen finden Sie im LaTeXStrings-Paket.
Standardmäßig werden Diagramme in IJulia als PNG-Bilder an das Notebook gesendet. Optional können Sie PyPlot anweisen, Diagramme im Browser als SVG-Bilder anzuzeigen, die den Vorteil haben, dass sie auflösungsunabhängig sind (so dass sie bei hohen Auflösungen ohne Pixelierung angezeigt werden, wenn Sie beispielsweise ein IJulia-Notizbuch in PDF konvertieren). läuft:
PyPlot . svg ( true )
Dies ist nicht die Standardeinstellung, da SVG-Diagramme im Browser viel langsamer angezeigt werden (insbesondere bei komplexen Diagrammen) und in einigen Browsern mit fehlerhafter SVG-Unterstützung möglicherweise ungenau angezeigt werden. Die Methode PyPlot.svg()
gibt zurück, ob die SVG-Anzeige derzeit aktiviert ist.
Beachten Sie, dass dies völlig unabhängig vom manuellen Exportieren von Diagrammen in SVG oder ein anderes Format ist. Unabhängig davon, ob PyPlot SVG für die Browseranzeige verwendet, können Sie jederzeit einen Plot in SVG exportieren, indem Sie den Matplotlib-Befehl savefig verwenden, z. B. savefig("plot.svg")
.
Sie können das rcParams
-Wörterbuch, das Matplotlib für globale Parameter verwendet, wie folgt ändern:
rcParams = PyPlot . PyDict (PyPlot . matplotlib. " rcParams " )
rcParams[ " font.size " ] = 15
(Wenn Sie stattdessen PyPlot.matplotlib.rcParams
verwenden würden, würde PyCall eine Kopie des Wörterbuchs erstellen, sodass die Python- rcParams
nicht geändert würden.)
Dieses Modul wurde von Steven G. Johnson geschrieben.