Capítulo29 Hex Stickers
## [1] "2026-09-09"
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:
sysfontsyshowtext - 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_heightcontrolan su posición y tamaño.package: el texto (normalmente el nombre del paquete);p_size,p_color,p_familyajustan 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 = 1deja la imagen justo en el centro;p_y = 1.5sube el texto hacia la parte de arriba;u_y = 0.08deja la url pegada al borde inferior;s_widthys_heightson fracciones, así que0.5es 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
| 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:
sysfonts::font_add_google("Nombre de la fuente")baja la fuente de Google Fonts.showtext::showtext_auto()le dice a R que useshowtextpara dibujar texto.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 bajaNo 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é.
.pngcondpi = 300o 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 elsubplot, 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 asticker().
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
subplotes unggplot, quítale los ejes, la leyenda y la rejilla contheme_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
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?
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?
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?
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.
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.
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.
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.