Gráfico de columnas

Anteriormente hemos visto cómo cambiar el tema de un gráfico en highcharter o cómo modificar el título. En esta sección aprenderemos a hacer un gráfico de columnas en highcharter.

Notarás que el tema de los gráficos es diferente al de por defecto. Esto se debe a que hemos modificado las opciones globales con el tema creado en la sección anterior:

library(highcharter)

options(highcharter.theme = elartedeldato_theme)

Cómo hacer un gráfico de columnas en highcharter

En primer lugar generamos los datos de tipo categórico. Generaremos un dataset muy pequeño como ejemplo.

df_cat <- dplyr::tribble(
  ~x, ~y,
  "A", 10,
  "B", 23,
  "C", 7,
  "D", 16
)

df_cat
# A tibble: 4 × 2
  x         y
  <chr> <dbl>
1 A        10
2 B        23
3 C         7
4 D        16

A continuación, construimos el gráfico con la función hchart() e indicando el tipo de gráfico de columnas con type = "column".

library(highcharter)

hchart(
  df_cat,
  name = "Columnas", # Nombre de la serie
  type = "column", # Tipo de gráfico
  hcaes(x = x, y = y) # Mapeado de variables
) |>
hc_title(text = "<b>Gráfico de columnas</b>") |> # Título
hc_subtitle(text = "<i>Orden por defecto</i>")  |> # Subtítulo
hc_credits(enabled = TRUE, text = "http://elartedeldato.com")  -> hc # Créditos

hc

Además, como ya vimos en el post inicial sobre cómo hacer un gráfico con highcharter podemos añadir el título y el subtítulo con las funciones hc_title() y hc_subtitle().

Cómo ordenar un gráfico de columnas en highcharter

Una tarea que se suele recomendar hacer en los gráficos de columnas es ordenar el eje x de forma descendente según la variable numérica. Para ello existen dos soluciones.

1) Solución trivial para ordenar un gráfico de columnas

La solución trivial es ordenar la variable en el dataset previamente. Aunque parezca obvio, esta solución en ggplot2, por ejemplo, no tendría el resultado esperado (en variables character, sí en variables factor). En este caso, con highcharter, basta con ordenar la variable categórica según la variable numérica.

df_cat |>
  dplyr::arrange(desc(y)) |>
  hchart(
    name = "Columnas",
    type = "column",
    hcaes(x = x, y = y) 
  ) |>
  hc_title(text = "<b>Gráfico de columnas</b>") |>
  hc_subtitle(text = "<i>Ordenado por variable y</i>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com")  -> hc_ordenado

hc_ordenado

También comentar que al trabajar con datos categóricos, highcharter permite indicar las categorías directamente en las funciones hc_xAxis() y hc_yAxis() con el argumento categories. Un caso en el que puede compensar utilizarlo para hacer el equivalente de geom_count de ggplot2 en highcharter, es decir, un gráfico de puntos para representar frecuencias de dos variables.

2) Solución avanzada para ordenar un gráfico de columnas

Como alternativa, highcharter cuenta con un argumento llamado categories que permite indicar los niveles de la variable categórica directamente como argumento en la función hc_xAxis().

df_cat |>
  hchart(
    name = "Columnas",
    type = "column",
    hcaes(x = x, y = y),
    dataSorting = list(enabled = TRUE), # Ordenar el eje x por variable y (por defecto)
  ) |>
  hc_title(text = "<b>Gráfico de columnas</b>") |>
  hc_subtitle(text = "<i>Ordenado por variable y</i>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com")  -> hc_ordenado2

hc_ordenado2

Por defecto, highcharter no ordena por ninguna variable excepto si se indica explícitamente. Ésto se puede hacer a través del argumento sortkey. Para información más detallada puedes consultar la API de highcharts.

Cómo hacer un gráfico de columnas por grupos

Tras ver cómo hacer un gráfico de columnas en highcharter, vamos a ver cómo hacer un gráfico de columnas por grupos en highcharter.

Cuando queremos representar un gráfico de columnas por grupos, podemos o bien agrupar las columnas en las etiquetas del eje o bien apilar las categorías por grupo (o viceversa). Aquí, nos centraremos en la primera opción.

En primer lugar generaremos los datos de entrada. Se trata de un dataset con una variable categórica, una numérica, que podría indicar por ejemplo la frecuencia de cada categoría, y una etiqueta de grupo asociada a cada valor.

df_cat_grupos <- dplyr::tribble(
  ~x, ~y, ~grupo,
  "A", 10, "G1",
  "B", 23, "G1",
  "C", 24, "G1",
  "A", 7, "G2",
  "B", 16, "G2",
  "C", 13, "G2",
  "A", 9, "G3",
  "B", 21, "G3",
  "C", 20, "G3"
)

df_cat_grupos
# A tibble: 9 × 3
  x         y grupo
  <chr> <dbl> <chr>
1 A        10 G1   
2 B        23 G1   
3 C        24 G1   
4 A         7 G2   
5 B        16 G2   
6 C        13 G2   
7 A         9 G3   
8 B        21 G3   
9 C        20 G3   

Construimos el gráfico indicando el tipo correspondiente y la variable grupo en la estética.

hchart(
    df_cat_grupos,
    type = "column",
    hcaes(x = x, y = y, group = grupo)
  ) |>
  hc_title(text = "<b>Gráfico de columnas por grupos</b>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com")

Cómo agrupar las columnas de un gráfico de highcharter

Para agrupar las columnas de un gráfico de highcharter y mostrar las etiquetas agrupadas, necesitamos un plugin. En highcharter, se pueden añadir plugins a través de la función hc_add_dependency().

En este caso, el nombre del plugin para agrupar las etiquetas del eje es plugins/grouped-categories.js pero existen muchos más que puedes consultar en la web de Highcharter creada por Joshua Kunst.

Para llevar a cabo la visualización, es necesario indicar las categorías agrupadas en forma de lista como vemos a continuación.

lista_categorias_agrupadas <- df_cat_grupos %>%
  dplyr::select(grupo, x) %>%
  dplyr::group_by(name = grupo) %>%
  dplyr::summarise(categories = list(x)) %>%
  highcharter::list_parse()

hchart(
    df_cat_grupos,
    type = "column",
    hcaes(x, y, grupo, color = grupo)
  ) |>
  hc_xAxis(categories = lista_categorias_agrupadas) |> # Indicar las categorías agrupadas como una lista
  hc_title(text = "<b>Gráfico de columnas por grupos</b>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com") |>
  hc_legend(list(enable = FALSE)) |>
  hc_add_dependency("plugins/grouped-categories.js")

Y así tendríamos un gráfico de columnas agrupado en highcharter. En el próximo post veremos cómo representar los mismos datos pero apilando los diferentes grupos en una misma columna.

Cómo hacer un gráfico de columnas apiladas en highcharter

El gráfico de columnas apiladas o stacked bar es una visualización útil cuando trabajamos con datos categóricos que constan de varios niveles de agregación. Una alternativa al gráfico de columnas por grupos.

Como siempre, el tema de los gráficos lo puedes encontrar al principio de esta guía en el apartado sobre cómo crear temas en highcharter.

Seguimos trabajando con el dataset anterior, que consta de dos variable categóricas y una numérica.

df_cat_grupos <- dplyr::tribble(
  ~x, ~y, ~grupo,
  "A", 10, "G1",
  "B", 23, "G1",
  "C", 24, "G1",
  "A", 7, "G2",
  "B", 16, "G2",
  "C", 13, "G2",
  "A", 9, "G3",
  "B", 21, "G3",
  "C", 20, "G3"
)

df_cat_grupos
# A tibble: 9 × 3
  x         y grupo
  <chr> <dbl> <chr>
1 A        10 G1   
2 B        23 G1   
3 C        24 G1   
4 A         7 G2   
5 B        16 G2   
6 C        13 G2   
7 A         9 G3   
8 B        21 G3   
9 C        20 G3   

A continuación, habilitamos la opción stacking que significa apilado en inglés.

hchart(
    df_cat_grupos,
    type = "column",
    hcaes(x = x, y = y, group = grupo),
    stacking = list(enabled = TRUE) # Apilar columnas
  ) |>
  hc_title(text = "<b>Gráfico de columnas apiladas</b>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com")

Otra alternativa es partir del gráfico de columnas por grupos y añadir el argumento en la función hc_plotOptions().

hc_plotOptions(
  series = list(
    stacking = list(enabled = TRUE) # Apilar columnas
  )
)

Cómo hacer un gráfico de columnas apiladas porcentuales

Al trabajar con datos categóricos, nos podría interesar realizar un gráfico de columnas apiladas porcentuales.

Para ello basta con indicar stacking = "percent" dentro de la función hchart().

hchart(
    df_cat_grupos,
    type = "column",
    hcaes(x = x, y = y, group = grupo),
    stacking = "percent" # Apilar columnas porcentuales
  ) |>
  hc_title(text = "<b>Gráfico de columnas apiladas porcentuales</b>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com")

Cómo añadir etiquetas en las columnas apiladas porcentuales en highcharter

Para añadir etiquetas sobre las columnas en highcharter utilizamos la función dataLabels(). En concreto, para las columnas apiladas porcentuales, definiremos el formato de las etiquetas como tipo porcentual.

hchart(
    df_cat_grupos,
    type = "column",
    hcaes(x = x, y = y, group = grupo),
    stacking = "percent",
    dataLabels = list( 
      enabled = TRUE, # Añadir etiquetas
      format = "{point.percentage:.0f}%" # Definir formato de los porcentajes 
    )
  ) |>
  hc_title(text = "<b>Gráfico de columnas apiladas porcentuales</b>") |>
  hc_credits(enabled = TRUE, text = "http://elartedeldato.com") -> hc

hc

Cómo añadir los porcentajes en el tooltip de un gráfico de columnas apiladas porcentuales

Pero, ¿cómo podríamos añadir los porcentajes también en el tooltip?

Con la función hc_tooltip() podemos modificar el formato del tooltip y complementar los valores absolutos point.y con los valores porcentuales point.percentage.

hc |>
  hc_tooltip( 
    pointFormat = "<b>{series.name} {point.y:.0f}</b> ({point.percentage:.0f}%)" # Mostrar porcentaje en el tooltip
  )