De forma análoga a otras entradas sobre análisis gráficos básicos, empezamos a trabajar con las posibilidades gráficas de Julia. A continuación, se recogerán el 80% de los gráficos que un científico de datos realizará en su vida profesional; el 20% restante se abordará en otras entradas. Emplearemos el conjunto de datos penguins para ilustrar los ejemplos:
using CSV
using DataFrames
using HTTP
url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
res = HTTP.get(url)
penguins = DataFrame(CSV.File(res.body))
using Pkg
Pkg.add("Plots")
Pkg.add("StatsPlots")
Descripción univariable
Variables cuantitativas
Histogramas con Julia:
# Histograma
using Plots
gr()
pinta = map(!ismissing, penguins.flipper_length_mm)
histogram(penguins.flipper_length_mm[pinta])

El primer gráfico con una sintaxis muy sencilla: histogram(vector). Comentarios relevantes: para estas representaciones gráficas empleamos el framework GR; no podemos pintar datos missing y, por ello, hacemos un map. Para pintar el histograma de una variable trabajamos con vectores; si deseamos variar el número de grupos, empleamos nbins. Sentamos las bases del método de trabajo.
Gráficos de densidades:
# Densidades
using StatsPlots
pinta = map(!ismissing, penguins.flipper_length_mm)
density(penguins.flipper_length_mm[pinta])

Sintaxis muy similar a la empleada con el histograma, pero en este caso se usa la función density.
Gráfico Boxplot:
# Boxplot
using StatsPlots
pinta = map(!ismissing, penguins.flipper_length_mm)
boxplot(penguins.flipper_length_mm[pinta])

Variables cualitativas
Gráficos de barras:
# Variables cualitativas
using DataFramesMeta, Query
using StatsPlots
agr = penguins |>
@groupby(_.species) |>
@map({species=key(_), conteo=length(_)}) |>
DataFrame
bar(agr.species, agr.conteo,
label = "Número de pingüinos",
title = "Conteo por especie",
xticks = :all,
size = [600, 400],
legend = :topright)

Para la realización de gráficos de barras se ha realizado una agregación previa: realizamos el groupby por el campo por el que deseamos realizar el gráfico y contamos registros. Aprovechamos el ejemplo para introducir etiquetas con label, títulos con title, ver las líneas de división, especificar el tamaño y establecer la posición de la leyenda. Se observa que las opciones del gráfico no son complejas.
Del mismo modo, si deseamos la representación en porcentaje, podemos calcularlo previamente:
# En porcentaje
agr = penguins |>
@groupby(_.species) |>
@map({species=key(_), conteo=length(_)}) |>
DataFrame
total = nrow(penguins)
agr = agr |> @mutate(pct = _.conteo / total) |> DataFrame
bar(agr.species, agr.pct,
label = "% de pingüinos",
title = "% por especie",
xticks = :all,
size = [600, 400],
legend = :topright)

Descripción bivariable
Gráfico de puntos:
# Gráfico de puntos
grafico = @from i in penguins begin
@where !isna(i.flipper_length_mm) & !isna(i.bill_length_mm)
@select i
@collect DataFrame
end
scatter(grafico.flipper_length_mm, grafico.bill_length_mm, group = grafico.species,
legend = :topleft)

Anotaciones: se eliminan aquellos registros con valores perdidos para evitar problemas en la representación gráfica; esa selección se lleva a cabo mediante una query y, en este caso, vamos a identificar cada punto con un color por la especie. La situación es similar a los gráficos de barras: preparamos un data.frame con la estructura que deseamos representar gráficamente.
Gráfico de densidad comparando un factor:
# Comparación de densidades
pinta = map(!ismissing, penguins.flipper_length_mm)
density(penguins.flipper_length_mm[pinta], group=penguins.species[pinta])

Boxplot comparando distribuciones por factor:
# Comparación boxplot
pinta = map(!ismissing, penguins.flipper_length_mm)
boxplot(penguins.species[pinta], penguins.flipper_length_mm[pinta], legend=false)

De un vistazo, los 8 gráficos más habituales en el trabajo diario. Mi opinión personal: código muy sencillo pero siguen sin gustarme las agregaciones con Julia; en esta entrada se exploran varias posibilidades. El siguiente paso será replicar esta entrada con plotly.