Este módulo proporciona una interfaz Julia para la biblioteca de trazado Matplotlib de Python y específicamente para el módulo matplotlib.pyplot
.
PyPlot usa el paquete Julia PyCall para llamar a Matplotlib directamente desde Julia con poca o ninguna sobrecarga (las matrices se pasan sin hacer una copia). (Consulte también PythonPlot.jl para obtener una versión de PyPlot.jl que utiliza el paquete alternativo PythonCall.jl).
Este paquete aprovecha la API de E/S multimedia de Julia para mostrar gráficos en cualquier backend gráfico de Julia, incluidos gráficos en línea en IJulia. Alternativamente, puede utilizar un backend gráfico de Matplotlib basado en Python para admitir el zoom interactivo del gráfico, etc.
(Este paquete PyPlot reemplaza un paquete anterior del mismo nombre de Junfeng Li, que usaba PyPlot sobre un socket ZeroMQ con IPython).
Necesitará tener la biblioteca Python Matplotlib instalada en su máquina para poder utilizar PyPlot. Puede realizar gráficos en línea con IJulia, que no requiere un backend GUI, o usar los backends Qt, wx o GTK+ de Matplotlib como se describe a continuación.
Una vez que Matplotlib esté instalado, puede usar Pkg.add("PyPlot")
en Julia para instalar PyPlot y sus dependencias.
Si configura PyCall para usar el paquete Conda.jl para instalar una distribución privada de Julia Python (no en la PATH
del sistema) (a través de Miniconda), PyPlot instalará automáticamente Matplotlib según sea necesario.
Si está instalando PyCall y PyPlot por primera vez, simplemente haga ENV["PYTHON"]=""
antes de ejecutar Pkg.add("PyPlot")
. De lo contrario, puede reconfigurar PyCall para usar Conda a través de:
ENV [ " PYTHON " ] = " "
Pkg . build ( " PyCall " )
La próxima vez que importe PyPlot
, le indicará a Conda que instale Matplotlib.
En MacOS, debe instalar XQuartz para MacOS 10.9 o posterior o instalar la distribución Anaconda Python para obtener un PyPlot completamente funcional.
MacOS 10.9 viene con Python y Matplotlib, pero esta versión de Matplotlib tiene por defecto el backend Cocoa GUI, que no es compatible con PyPlot. También tiene un backend Tk, que es compatible, pero el backend Tk no funciona a menos que instales XQuartz.
Alternativamente, puede instalar la distribución Anaconda Python (que también incluye ipython
y otras dependencias de IJulia).
De lo contrario, puedes utilizar el administrador de paquetes Homebrew:
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
(Es posible que desee agregar los dos comandos export
a su archivo ~/.profile
para que se ejecuten automáticamente cada vez que inicie un shell).
Una vez que Matplotlib y PyPlot estén instalados, y esté utilizando un entorno Julia con capacidad gráfica como IJulia, simplemente puede escribir using PyPlot
y comenzar a llamar funciones en la API matplotlib.pyplot. Por ejemplo:
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 " )
En general, todos los argumentos, incluidos los argumentos de palabras clave, son exactamente iguales que en Python. (Con traducciones menores, por supuesto, por ejemplo, Julia usa true
y nothing
en lugar de True
and None
de Python).
La API matplotlib.pyplot
completa es demasiado extensa para describirla aquí; consulte la documentación matplotlib.pyplot para obtener más información. El número de versión de Matplotlib lo devuelve PyPlot.version
.
Solo se exporta la API matplotlib.pyplot
actualmente documentada. Para usar otras funciones en el módulo, también puede llamar matplotlib.pyplot.foo(...)
como plt.foo(...)
. Por ejemplo, plt.plot(x, y)
también funciona. (Y también se puede acceder al PyObject
sin formato para los módulos matplotlib
como PyPlot.matplotlib
).
Matplotlib es algo inconsistente en cuanto a las mayúsculas: tiene contour3D
pero bar3d
, etcétera. PyPlot cambia el nombre de todas esas funciones para usar una D mayúscula (por ejemplo, tiene hist2D
, bar3D
, etc.).
También debe calificar explícitamente algunas funciones integradas en Julia. En particular, se deben utilizar PyPlot.xcorr
, PyPlot.axes
y PyPlot.isinteractive
para acceder matplotlib.pyplot.xcorr
, etc.
Si desea acceder a todas las funciones de PyPlot exclusivamente a través de plt.somefunction(...)
, como es convencional en Python, puede import PyPlot; const plt = PyPlot
en lugar de using PyPlot
.
Puede obtener la figura actual como un objeto Figure
(un contenedor alrededor de matplotlib.pyplot.Figure
) llamando gcf()
.
El tipo Figure
admite la API de E/S multimedia de Julia, por lo que puede usar display(fig)
para mostrar una fig::PyFigure
y show(io, mime, fig)
(o writemime
en Julia 0.4) para escribirla en un tipo mime
determinado. cadena (por ejemplo "image/png"
o "application/pdf"
) que es compatible con el backend de Matplotlib.
Si utiliza PyPlot desde un indicador interactivo de Julia, como el indicador de línea de comandos de Julia o un cuaderno de IJulia, los gráficos aparecen inmediatamente después de que se evalúa una función de trazado ( plot
etc.).
Sin embargo, si usa PyPlot desde un script de Julia que se ejecuta de forma no interactiva (por ejemplo, julia myscript.jl
), entonces Matplotlib se ejecuta en modo no interactivo: no se abre una ventana de trazado hasta que ejecuta show()
(equivalente a plt.show()
en los ejemplos de Python).
PyPlot puede utilizar cualquier backend de gráficos de Julia capaz de mostrar imágenes PNG, SVG o PDF, como el entorno IJulia. Para usar un backend diferente, simplemente llame pushdisplay
con la Display
deseada; consulte la API de visualización multimedia de Julia para obtener más detalles.
Por otro lado, es posible que desee utilizar uno de los backends de Python Matplotlib para abrir una ventana interactiva para cada gráfico (para hacer zoom interactivo, desplazamiento, etc.). Puedes hacer esto en cualquier momento ejecutando:
pygui ( true )
para activar la GUI basada en Python (si es posible) para gráficos posteriores, mientras que pygui(false)
volverá al backend de Julia. Incluso cuando se está ejecutando una GUI de Python, puede mostrar la figura actual con el backend de Julia ejecutando display(gcf())
.
Si no hay ningún backend de gráficos de Julia disponible cuando se importa PyPlot, entonces pygui(true)
es el valor predeterminado.
PyPlot solo admite los backends de GUI de Python Tk, wxWidgets, GTK+ (versión 2 o 3) y Qt (versión 4 o 5; a través de PyQt5, PyQt4 o PySide). (Obviamente, primero debe haber instalado uno de estos kits de herramientas para Python). De forma predeterminada, PyPlot elige uno de estos cuando se inicia (según lo que haya instalado), pero puede forzar la elección de un kit de herramientas específico importando el Módulo PyCall y usando su función pygui
para configurar un backend de Python antes de importar PyPlot:
using PyCall
pygui (gui)
using PyPlot
donde gui
actualmente puede ser uno de :tk
, :gtk3
, :gtk
, :qt5
, :qt4
, :qt
o :wx
. También puede establecer un valor predeterminado a través del parámetro Matplotlib rcParams['backend']
en su archivo matplotlibrc.
El módulo PyPlot también exporta algunas funciones y tipos basados en los módulos matplotlib.colors y matplotlib.cm para simplificar la gestión de mapas de color (que se utilizan para asignar valores a colores en varios tipos de gráficos). En particular:
ColorMap
: un contenedor alrededor del tipo matplotlib.colors.Colormap. Se proporcionan los siguientes constructores:
ColorMap{T<:Colorant}(name::String, c::AbstractVector{T}, n=256, gamma=1.0)
construye un mapa de colores n
componentes interpolando linealmente los colores en la matriz c
de Colorant
s (de la paquete ColorTypes.jl). Si desea que un name
se construya automáticamente, llame ColorMap(c, n=256, gamma=1.0)
en su lugar. Alternativamente, en lugar de pasar una matriz de colores, puede pasar una matriz de 3 o 4 columnas de componentes RGB o RGBA, respectivamente (similar a ListedColorMap en Matplotlib).
Se pueden definir mapas de colores aún más generales pasando matrices de tuplas (x,y0,y1) para los componentes rojo, verde, azul y (opcionalmente) alfa, según lo definido por el constructor matplotlib.colors.LinearSegmentedColormap, a través de: 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)
o 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)
devuelve un mapa de colores existente (registrado), equivalente a matplotlib.pyplot.get_cmap( name
).
Los objetos matplotlib.colors.Colormap
devueltos por las funciones de Python se convierten automáticamente al tipo ColorMap
.
get_cmap(name::String)
o get_cmap(name::String, lut::Integer)
llama a la función matplotlib.pyplot.get_cmap.
register_cmap(c::ColorMap)
o register_cmap(name::String, c::ColorMap)
llama a la función matplotlib.colormap.register.
get_cmaps()
devuelve un Vector{ColorMap}
de los mapas de colores registrados actualmente.
Tenga en cuenta que, dado un entorno de visualización compatible con SVG como IJulia, los objetos ColorMap
y Vector{ColorMap}
se muestran gráficamente; prueba get_cmaps()
!
El paquete PyPlot también importa funciones del kit de herramientas mplot3d de Matplotlib. Sin embargo, a diferencia de Matplotlib, puede crear gráficos 3D directamente sin crear primero un objeto Axes3d, simplemente llamando a uno de: bar3D
, contour3D
, contourf3D
, plot3D
, plot_surface
, plot_trisurf
, plot_wireframe
o scatter3D
(así como text2D
, text3D
), exactamente como los métodos correspondientemente nombrados de Axes3d. También exportamos la surf
de sinónimos similar a Matlab para plot_surface
(o plot_trisurf
para argumentos de matriz 1d) y mesh
para plot_wireframe
. Por ejemplo, puedes hacer:
surf ( rand ( 30 , 40 ))
para trazar una malla de superficie aleatoria de 30×40.
También puedes crear explícitamente una subtrama con ejes 3D a través de, por ejemplo, subplot(111, projection="3d")
, exactamente como en Matplotlib, pero primero debes llamar a la función using3D()
para asegurarte de que mplot3d esté cargado (esto sucede automáticamente para plot3D
etc.). También se exportan el constructor Axes3D
y el módulo art3D.
Matplotlib le permite usar ecuaciones LaTeX en etiquetas de gráficos, títulos, etc. simplemente encerrando las ecuaciones en signos de dólar ( $ ... $
) dentro de la cadena. Sin embargo, escribir ecuaciones LaTeX en cadenas literales de Julia es incómodo porque es necesario escapar para evitar que Julia interprete los signos de dólar y las barras invertidas; por ejemplo, la ecuación de LaTeX $alpha + beta$
sería la cadena literal "$\alpha + \beta$"
en Julia.
Para simplificar esto, PyPlot usa el paquete LaTeXStrings para proporcionar un nuevo tipo LaTeXString
que se construye mediante L"...."
sin escapar de barras invertidas o signos de dólar. Por ejemplo, uno puede simplemente escribir L"$alpha + beta$"
para la ecuación mencionada anteriormente y, por lo tanto, puede hacer cosas como:
title ( L " Plot of $ G amma_3(x)$ " )
Si su cadena contiene sólo ecuaciones, puede omitir los signos de dólar, por ejemplo, L"alpha + beta"
y se agregarán automáticamente. Como beneficio adicional, LaTeXString
se muestra automáticamente como una ecuación renderizada en IJulia. Consulte el paquete LaTeXStrings para obtener más información.
De forma predeterminada, los trazados en IJulia se envían al cuaderno como imágenes PNG. Opcionalmente, puede indicarle a PyPlot que muestre gráficos en el navegador como imágenes SVG, que tienen la ventaja de ser independientes de la resolución (para que se muestren sin pixelación en altas resoluciones, por ejemplo, si convierte un cuaderno IJulia a PDF), al correr:
PyPlot . svg ( true )
Este no es el valor predeterminado porque los gráficos SVG en el navegador son mucho más lentos de mostrar (especialmente para gráficos complejos) y pueden mostrarse de manera inexacta en algunos navegadores con compatibilidad con SVG con errores. El método PyPlot.svg()
devuelve si la visualización SVG está actualmente habilitada.
Tenga en cuenta que esto es completamente independiente de exportar gráficos manualmente a SVG o cualquier otro formato. Independientemente de si PyPlot usa SVG para la visualización del navegador, puede exportar un gráfico a SVG en cualquier momento usando el comando savefig de Matplotlib, por ejemplo, savefig("plot.svg")
.
Puede mutar el diccionario rcParams
que Matplotlib usa para los parámetros globales siguiendo este ejemplo:
rcParams = PyPlot . PyDict (PyPlot . matplotlib. " rcParams " )
rcParams[ " font.size " ] = 15
(Si en su lugar usara PyPlot.matplotlib.rcParams
, PyCall haría una copia del diccionario para que los rcParams
de Python no se modificaran).
Este módulo fue escrito por Steven G. Johnson.