Plots en Julia
Ulises M. Alvarez

La librería, Plots, es una interface de visualización y una caja de herramientas. Nos permite usar el poder de muchas de las librerías de gráficos de Julia, i.e. motores, usando una sintaxis única.

Como principales ventajas podemos destacar:

  • Dialecto de gráficos universal. No importa el motor de gráficos que estemos usando, PyPlot, Gadfly, Plotly, PGFPlots, etc, podemos usar un sólo dialecto para construir las gráficas.

  • Se puede cambiar el motor de gráficos con un sólo comando y no es necesario reescribir el código.

  • Es muy sencillo agregar capas, --anotaciones, leyendas, incluso gráficos adicionales superpuestos--, a un gráfico.

Prerrequisitos de sistema operativo

En sistemas Linux, se necesita instalar el software:

  • libgtk-3-dev
  • libwandio-devel

Instalación de librería

Cero: Inicializar entorno de Julia


In [1]:
ENV["PYTHON"] = ""  # Declaramos la variable PYTHON nula, para reproducibilidad
Pkg.update()        # Actualizamos la biblioteca


INFO: Updating METADATA...
INFO: Updating cache of UnicodePlots...
INFO: Computing changes...
INFO: Upgrading UnicodePlots: v0.2.3 => v0.2.4

Función para facilitar y acelerar la instalación de las librerías


In [2]:
function p_it(p::String...)
    # Instala el paquete 'p'
    #
    # Args:
    #   p: el nombre completo del paquete::String
    #
    # Returns:
    #   Mensaje de error o notifica de la instalación vía Base.Pkg.add
    #
    ENV["PYTHON"]=""
    for i = 1:length(p)
        if !contains(==, Pkg.available(), p[i])
            println(p[i], ", no disponible.")
        else
            if !haskey(Pkg.installed(), p[i])
                Pkg.add(p[i])
            end
        end
     end
end


Out[2]:
p_it (generic function with 1 method)

Para saber más sobre la función, lo invitamos a consultar la libreta "Paquetes en Julia II":

Instalación de la librería y motores recomendados

Una vez inicializado el entorno, procedemos a instalar la librería:


In [3]:
p_it("Plots",
    "PlotlyJS",
    "PyPlot",
    "GR",
    "UnicodePlots",
    "PGFPlots")

Extensiones

También instalaremos las extensiones recomendadas:


In [4]:
p_it("StatPlots", "PlotRecipes")

Auxiliares

Para poder desplegar los gráficos generados con el motor, PlotlyJS, es importante instalar otros dos paquetes:


In [5]:
p_it("Rsvg", "Blink")

Una vez instalado, Blink(), es importante instalar su auxiliar:


In [6]:
using Blink                  # Cargamos el paquete
# Blink.AtomShell.install()  # Instalamos auxiliar. ¡Ejecutar sólo una vez!

Nota:

La instalación de librerías es un proceso que requiere de 10 a 20 minutos. El resultado variará de acuerdo a su sistema operativo y la velocidad de su conexión a Internet.

Uso de Plots

Una vez instaladas la librerías, podemos proceder a usar Plots con el motor de nuesta preferencia. Es importante señalar que:

  • Para generar estas notas usamos el motor, GR.
  • Para sesiones o documentos interactivos, i.e. html, se recomienda el motor plotly().
  • Para poder exportar desde Jupyter o IJulia, es necesario especificar el formato de salida. Les recomendamos SVG o PNG. Ejemplo:
plot(rand(10), fmt = :svg)

URL: https://juliaplots.github.io/output/


In [7]:
using Plots  # Cargamos librería
pyplot()     # Definimos motor, PyPlot


Out[7]:
Plots.PyPlotBackend()

Gráfica simple de líneas

Generaremos una gráfica de líneas. Usaremo el motor PGFPlots y SVG como formato de salida:


In [8]:
plot(Plots.fakedata(50, 5),  # las abcisas y las ordenadas, respectivamente
w   = 2,                     # Ancho de las líneas
fmt = :svg)                  # Opción para generar las notas


Out[8]:

Histograma

Histograma simple:


In [9]:
#plotly()               # ¡Pruebe diferentes motores!

histogram(randn(1000),  # histograma
fmt = :svg)             # Opción para generar las notas


Out[9]:

Colores

Ahora, manipularemos colores, transparencia y agregaremos una capa de color superpuesta. Seguimos usando el motor PyPlot:


In [10]:
#plotly()              # ¡Pruebe diferentes motores!

y       = rand(100)    # Cien números aleatorios

plot(0:10:100,         # Iniciamos gráfica
rand(11,4),            # Subconjuntos aleatorios
lab     = "lines",     # Texto de la leyenda
w       = 3,           # Ancho de las líneas
palette = :grays,      # Paleta de color
fill    = (0, :auto),  # Área con color
α       = 0.4,         # Transparencia
fmt     = :svg)        # Opción para generar las notas


Out[10]:

Para modificar la gráfica, color en esta caso, basta con agregar "!" al comando:


In [11]:
scatter!(y, 
        zcolor = abs(y - 0.5),
        m      = (:heat, 0.8, stroke(1, :green)),
        ms     = 10 * abs(y - 0.5) + 4,
        lab    = "grad",
        fmt    = :svg)  # Opción para generar las notas


WARNING: abs{T <: Number}(x::AbstractArray{T}) is deprecated, use abs.(x) instead.
Stacktrace:
 [1] depwarn(::String, ::Symbol) at ./deprecated.jl:64
 [2] abs(::Array{Float64,1}) at ./deprecated.jl:51
 [3] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/uma/.julia/v0.6/IJulia/src/execute_request.jl:160
 [4] eventloop(::ZMQ.Socket) at /home/uma/.julia/v0.6/IJulia/src/eventloop.jl:8
 [5] (::IJulia.##11#14)() at ./task.jl:335
while loading In[11], in expression starting on line 1
Out[11]:

Gráficas en 3D

La siguiente gráfica se ve mejor en formato HTML, porque resulta interactiva y se puede rotar sobre los tres ejes.

Como ejercicio, en su consola use:

plotlyjs()  # Definimos motor
...

In [12]:
n      = 100
ts     = linspace(0, 8π, n)
x      = ts .* map(cos, ts)
y      = (0.1ts) .* map(sin, ts)
z      = 1:n

#plotlyjs()  # Use este motor para hacer la gráfica interactiva

plot(x, y, z,
zcolor = reverse(z),
m      = (10,0.8, :blues, stroke(0)),
leg    = false,
cbar   = true,w=5)


plot!(zeros(n),
zeros(n),
1:n,
w   = 10,
fmt = :svg)  # Opción para generar las notas


Out[12]:

Contornos


In [13]:
# plotly()      # ¡Pruebe diferentes motores!

x      = 1:0.5:20
y      = 1:0.5:10

f(x,y) = begin 
            (3x + y ^ 2) * abs(sin(x) + cos(y))
         end

X      = repmat(x', length(y), 1)
Y      = repmat(y, 1, length(x))
Z      = map(f, X, Y)


p1     = contour(x, y, f, fill=true)
p2     = contour(x, y, Z)


plot(p1, p2, 
fmt    = :svg)  # Opción para generar las notas)


Out[13]:

Para saber más:

Conceptos básicos y tips

https://juliaplots.github.io/basics/

Ventajas y desventajas de los motores

https://juliaplots.github.io/backends/

Formatos de salida

https://juliaplots.github.io/output/

Reproducibilidad

Esta libreta se modificó para:

  • Hacer más eficiente la instalación de librerías, vía la función local it().

In [14]:
versioninfo()


Julia Version 0.6.0-rc2.0
Commit 68e911be53* (2017-05-18 02:31 UTC)
Platform Info:
  OS: Linux (x86_64-solus-linux)
  CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (NO_AFFINITY CORE2)
  LAPACK: libopenblas
  LIBM: libopenlibm
  LLVM: libLLVM-4.0.0 (ORCJIT, haswell)

In [15]:
Dates.today()


Out[15]:
2017-06-21