Capítulo29 Hex Stickers

## [1] "2026-09-09"
library(hexSticker) 
library(magick)
library(sysfonts)
library(tidyverse)

29.1 Temas

  • Qué es un hex sticker y por qué son hexagonales
  • sticker() y sus tres grupos de argumentos
  • El sistema de coordenadas: dónde va cada cosa
  • Fuentes: sysfonts y showtext
  • Guardar: png, svg y resolución
  • Consejos de diseño para que se lea a dos centímetros

29.2 Qué es un hex sticker

Un hex sticker es una calcomanía hexagonal que identifica un paquete, un proyecto o un laboratorio. La forma no es un capricho: los hexágonos teselan, es decir, encajan unos con otros sin dejar huecos, así que se pueden pegar en una laptop formando un panal. Los círculos y los cuadrados no dan ese resultado.

La comunidad de R acordó un estándar de tamaño y proporciones para que las calcomanías de distintas personas encajen entre sí. Antes de mandar a imprimir conviene consultarlo, porque un hexágono con proporciones propias no encaja con los demás y se nota.

El estándar y las medidas exactas están documentados en el repositorio terinjokes/StickersStandard de GitHub, y hay una galería de calcomanías de paquetes en http://hexb.in. Comprueba ahí las medidas antes de mandar a imprimir; hexSticker genera las proporciones correctas por defecto, pero la imprenta necesita el tamaño físico y el margen de corte.

Este capítulo es distinto a los demás del libro: no hay datos que analizar, hay un objeto que diseñar. Aun así encaja aquí por dos razones. La primera es que el subplot de una calcomanía puede ser un ggplot, así que todo lo aprendido sobre gráficas se aplica. La segunda es que hacer una calcomanía obliga a pensar en algo que casi nunca se piensa: qué se ve y qué no cuando la figura mide dos centímetros.


29.3 La función y los valores “default”

Los hex stickers (calcomanías hexagonales) se popularizaron en la comunidad de R alrededor de 2015, impulsados por desarrolladores de RStudio/Posit y el proyecto rOpenSci. El formato hexagonal permite unir las calcomanías sin dejar huecos (como un panal), por lo que se convirtió en la forma estándar de identificar paquetes de R en conferencias y computadoras portátiles. El paquete hexSticker, de Guangchuang Yu, automatiza su creación.

sticker(): crea una calcomanía hexagonal a partir de una imagen o gráfico.

  • subplot: la imagen o gráfico (ggplot) que va en el centro; s_x, s_y, s_width, s_height controlan su posición y tamaño.
  • package: el texto (normalmente el nombre del paquete); p_size, p_color, p_family ajustan su tipografía.
  • h_fill, h_color, h_size: color de relleno, color y grosor del borde del hexágono.
  • filename: dónde se guarda; la extensión (.png, .svg) decide el formato de salida.

La lista de argumentos asusta al principio y en realidad son tres grupos, cada uno con su prefijo:

  • s_ es el subplot, la imagen o gráfica del centro.
  • p_ es el package, el texto principal.
  • u_ es la url, el texto pequeño del borde de abajo.
  • h_ es el hexágono en sí: relleno, borde y grosor.
  • l_ es el spotlight, un brillo opcional en diagonal.

En cuanto reconoces los prefijos, la lista deja de dar miedo: son cinco cosas con sus propias posiciones, tamaños y colores.

29.3.1 El sistema de coordenadas

Este es el detalle que más tiempo ahorra y que no está en ninguna parte de la documentación de forma clara: el hexágono ocupa un cuadrado que va de 0 a 2 en los dos ejes, con el centro en (1, 1).

Por eso:

  • s_x = 1, s_y = 1 deja la imagen justo en el centro;
  • p_y = 1.5 sube el texto hacia la parte de arriba;
  • u_y = 0.08 deja la url pegada al borde inferior;
  • s_width y s_height son fracciones, así que 0.5 es media anchura.

No intentes calcular las posiciones: prueba y mira. Cambia un número, vuelve a generar la calcomanía, y repite. Es más rápido que razonarlo, y en cinco intentos ya le agarras el truco a la escala.

sticker(
  subplot, # position and size of subplot
  s_x = 0.8,
  s_y = 0.75,
  s_width = 0.4,
  s_height = 0.5,
  package, # package name and characteristics
  p_x = 1,
  p_y = 1.4,
  p_color = "#FFFFFF",
  p_family = "Aller_Rg",
  p_fontface = "plain",
  p_size = 8,
  h_size = 1.2, # hexagon border size and colors
  h_fill = "#1881C2",
  h_color = "#87B13F",
  spotlight = FALSE,
  l_x = 1, # spotlight x position
  l_y = 0.5,
  l_width = 3,
  l_height = 3,
  l_alpha = 0.4,
  url = "", # url at lower border
  u_x = 1,
  u_y = 0.08,
  u_color = "black",
  u_family = "Aller_Rg",
  u_size = 1.5,
  u_angle = 30,
  white_around_sticker = FALSE, # if TRUE, puts white triangles in the corners
  ...,
  filename = paste0(package, ".png"), # filename to save sticker
  asp = 1, # aspect ratio, only works if subplot is an image file
  dpi = 300 # plot resolution
)

Arguments

library(gt)
gt(argumentos)
Función Descripción
subplot subplot
s_x x position for subplot
s_y y position for subplot
s_width width for subplot
s_height height for subplot
package package name
p_x x position for package name
p_y y position for package name
p_color color for package name
p_family font family for package name
p_fontface fontface for package name
p_size font size for package name
h_size size for hexagon border
h_fill color to fill hexagon
h_color color for hexagon border
spotlight whether add spotlight
l_x x position for spotlight
l_y y position for spotlight
l_width width for spotlight
l_height height for spotlight
l_alpha maximum alpha for spotlight
url url at lower border
u_x x position for url
u_y y position for url
u_color color for url
u_family font family for url
u_size text size for url
u_angle angle for url
white_around_sticker default to FALSE. If set to TRUE, it puts white triangles in the corners
... additional parameter to geom_pkgname
filename filename to save sticker
asp aspect ratio, only works if subplot is an image file
dpi plot resolution

29.3.2 Las fuentes

Aquí está el tropiezo clásico del capítulo: la fuente que escoges en p_family tiene que estar disponible para R, y las fuentes de tu computadora no lo están automáticamente. El proceso son siempre tres pasos:

  1. sysfonts::font_add_google("Nombre de la fuente") baja la fuente de Google Fonts.
  2. showtext::showtext_auto() le dice a R que use showtext para dibujar texto.
  3. showtext_opts(dpi = 300) hace que el tamaño del texto cuadre con la resolución de salida.

Sin el paso 2, la fuente se baja y no se usa, y el texto sale en la tipografía por defecto sin que nada avise.

sysfonts::font_add_google("Rubik")
sysfonts::font_add_google("Sixtyfour Convergence")
sysfonts::font_add_google("Young Serif")   # esta no siempre baja

No todas las fuentes de Google Fonts bajan bien, y las que fallan lo hacen en silencio o con un error poco claro. Si el texto no sale como esperabas, comprueba primero que la fuente esté cargada, con sysfonts::font_families(). Y ten un plan B: una fuente muy elaborada se ve preciosa en la pantalla y se vuelve ilegible impresa a dos centímetros.

29.3.3 Guardar la calcomanía

La extensión del nombre del archivo decide el formato: "sticker.png" produce un png y "sticker.svg" produce un svg. hexSticker usa por dentro ggplot2::ggsave(), así que sirve cualquier formato que esa función acepte.

Formatos de salida: cuál usar según para qué.

  • .png con dpi = 300 o más: para imprimir. Es un mapa de puntos, así que el tamaño físico y la resolución hay que decidirlos al generarlo.
  • .svg: vectorial, se puede agrandar sin perder calidad y la imprenta suele preferirlo. La pega es que el subplot, si era una foto, sigue siendo una foto por dentro.
  • save_sticker("archivo.png"): guarda la última calcomanía dibujada, sin tener que repetir toda la llamada a sticker().

29.3.4 Consejos de diseño

Una calcomanía se ve impresa y pequeña, no en la pantalla y grande, y eso cambia todas las decisiones:

  • Contraste antes que color bonito. Texto claro sobre fondo oscuro o al revés. Dos colores de intensidad parecida se ven bien en el monitor y se convierten en una mancha al imprimirse.
  • Una sola idea en el centro. Una figura con detalle fino desaparece. Si el subplot es un ggplot, quítale los ejes, la leyenda y la rejilla con theme_void().
  • El nombre corto y grande. Si no se lee de un vistazo, no sirve.
  • La url es opcional y casi siempre estorba. Solo ponla si de verdad quieres que alguien la teclee.

Prueba de fuego: genera la calcomanía, ábrela, y aléjala hasta que ocupe el tamaño de una moneda. Si a esa distancia no se distingue qué es y qué dice, hay que simplificarla.


29.4 Ejemplo de Crear un Hex con un gatito

El ejemplo siguiente junta todo lo anterior: carga una fuente de Google, activa showtext, lee una imagen con magick::image_read() y llama a sticker() con las posiciones y los colores puestos a mano. Fíjate en el spotlight = T del final, que añade el brillo diagonal.

Para usar una fuente de Google, cárgala con font_add_google() y activa showtext_auto() antes de llamar a sticker(). Si no, el texto no se dibujará con la fuente elegida.

#font_files()  #a list of all fonts available

## Loading Google fonts (https://fonts.google.com/)

#sysfonts::font_add_google("Dancing Script") # selección de fonts de google
#sysfonts::font_add_google("Bebas Neue")
#sysfonts::font_add_google("Fuggles")
#sysfonts::font_add_google("Roboto")
#sysfonts::font_add_google("Montserrat")
#sysfonts::font_add_google("Lobster Two")
sysfonts::font_add_google("Monsieur La Doulaise")
#sysfonts::font_add_google("monsieur")



cat_img=image_read('img/cat.jpg')
analitica_img=image_read('img/Analitica3.png')



library(showtext)
font_add_google("Monsieur La Doulaise")
showtext_opts(dpi = 300)
showtext_auto()



sticker(
  subplot= cat_img,
  package="Meow \n software",
  filename = "img/hex_meow_software.png",
  s_width =.55,
  s_height = .55,
  s_x=1,
  s_y=.75,
  p_size=8, # tamaño del texto
  p_x = 1.0,
  p_y = 1.5,
  p_color= 'purple',
  p_family= "Monsieur La Doulaise",
  h_fill ='gold',
  h_color='hotpink',
  h_size = 2,
  url="www.cat.foundation.com",
  u_size=4,
  u_color = "violetred",
  spotlight=T

) %>% print

save_sticker("img/hex_sticker_cat.jpg")

29.5 Ejercicios del capítulo

Sobre los ejercicios de este capítulo. Este capítulo no produce números sino un objeto de diseño, así que la entrega es distinta: cada ejercicio necesita el código, la imagen resultante (insértala en el documento con knitr::include_graphics()) y una explicación en palabras de las decisiones que tomaste. Las decisiones son lo que se evalúa: por qué ese color, ese tamaño, esa fuente. Guarda todas tus calcomanías en una carpeta img/ejercicios/. La hoja completa para entregar está en Ejercicios/Ejercicios_Capitulo_29_hex.Rmd.

29.5.1 Ejercicio 1. Una calcomanía a partir de una gráfica

Haz un ggplot sencillo con millas (por ejemplo cilindrada contra autopista), quítale todo lo que sobra con theme_void(), y úsalo como subplot de una calcomanía llamada millas.

Verificación: el archivo .png tiene que existir y verse. Compruébalo con file.exists().

En palabras: compara tu calcomanía con la misma gráfica sin theme_void(). ¿Qué desapareció y por qué mejora a este tamaño?

# Escribe tu código aquí

29.5.2 Ejercicio 2. El sistema de coordenadas

Partiendo de la calcomanía del ejercicio anterior, genera cuatro versiones cambiando solo las posiciones: la gráfica arriba y el texto abajo, las dos centradas y superpuestas, la gráfica muy pequeña en una esquina, y la gráfica ocupando casi todo el hexágono.

Verificación: las cuatro tienen que salir distintas y todas legibles dentro del hexágono, sin nada cortado por el borde.

En palabras: anota qué valores de s_x, s_y, p_x y p_y usaste en cada una. ¿Cuál es el centro exacto del hexágono, y cómo lo dedujiste?

# Escribe tu código aquí

29.5.3 Ejercicio 3. Fuentes

Baja dos fuentes distintas de Google Fonts con font_add_google(), una de palo seco y otra decorativa, y haz la misma calcomanía con cada una.

Verificación: las dos versiones tienen que verse con tipografías claramente distintas. Si salen iguales, se te olvidó showtext_auto().

En palabras: reduce las dos imágenes al tamaño de una moneda y míralas. ¿Cuál sigue siendo legible? ¿Cambia tu opinión sobre cuál es más bonita?

# Escribe tu código aquí

29.5.4 Ejercicio 4. Contraste

Haz dos calcomanías con exactamente el mismo contenido: una con buen contraste entre el texto y el fondo, y otra con dos colores de intensidad parecida (por ejemplo verde medio sobre azul medio).

Verificación: las dos tienen que existir como archivos. Insértalas una al lado de la otra en el documento.

En palabras: describe qué le pasa a la mala cuando la miras de lejos. Busca qué son la luminosidad y el contraste de un color y explica en dos oraciones por qué dos colores distintos pueden verse igual de oscuros.

# Escribe tu código aquí

29.5.5 Ejercicio 5. Los adornos

Añádele a tu calcomanía la url de un sitio (real o inventado) con url y sus argumentos u_, y prueba también spotlight = TRUE con distintos valores de l_alpha.

Verificación: la url tiene que quedar pegada al borde de abajo, sin salirse del hexágono y sin tocar la gráfica.

En palabras: ¿aporta algo la url a esta calcomanía en concreto? ¿Y el spotlight? Defiende quitarlos o dejarlos.

# Escribe tu código aquí

29.5.6 Ejercicio 6. Formatos

Guarda la misma calcomanía en .png con dpi = 300 y en .svg. Compara el tamaño de los dos archivos con file.size() y ábrelos los dos, agrandándolos mucho.

Verificación: al agrandar mucho, uno de los dos se ve pixelado y el otro no.

En palabras: ¿cuál se pixela y por qué? ¿Cuál mandarías a una imprenta? Y una pregunta más fina: si el subplot fuera una foto en vez de un ggplot, ¿el .svg seguiría siendo perfectamente escalable? Justifícalo.

# Escribe tu código aquí

29.5.7 Ejercicio 7 (BONO). La tuya

Diseña la calcomanía de tu proyecto: tu tesis, tu laboratorio, tu curso o un paquete que te gustaría escribir. Aplica todo lo del capítulo.

Verificación: tiene que pasar la prueba de la moneda: se entiende qué es y qué dice al tamaño de una moneda.

En palabras: escribe un párrafo justificando cada decisión: la imagen, el color, la fuente y el tamaño del texto. Pídele a un compañero que la mire dos segundos y te diga qué entendió, y anota lo que te dijo.

# Escribe tu código aquí