HOWTO · R
Cómo cambiar las etiquetas de los ejes en ggplot2 con R
Cambia las etiquetas de graduación de ejes discretos y continuos en ggplot2, aplica formatos y gira textos superpuestos.
En esta página
Usa scale_x_discrete(labels = ...) para renombrar las etiquetas de graduación de un factor o una variable de caracteres. Para un eje numérico, usa scale_x_continuous(breaks = ..., labels = ...) a fin de fijar las posiciones y el formato. La rotación y otros cambios visuales corresponden a theme(axis.text.x = element_text(...)). Si quieres cambiar el título del eje, utiliza labs(x = ...): el título no es una etiqueta de graduación. Sustituye x por y para aplicar las mismas ideas al eje vertical.
Los ejemplos requieren R y ggplot2. El ejemplo continuo también usa el paquete scales para dar formato. Se verificaron con R 4.1.2, ggplot2 3.3.5 y scales 1.1.1. Los argumentos utilizados también aparecen en la API actual de ggplot2, aunque el tema puede presentar pequeñas diferencias entre versiones.
| Tarea | Control de ggplot2 |
|---|---|
| Cambiar el título del eje | labs(x = "Title") o labs(y = "Title") |
| Renombrar etiquetas de valores de factor o de tipo carácter | scale_x_discrete(labels = ...) |
| Definir posiciones y texto numéricos | scale_x_continuous(breaks = ..., labels = ...) |
| Girar o estilizar el texto visible | theme(axis.text.x = element_text(...)) |
Dar formato a un eje Date |
scale_x_date(breaks = ..., labels = ...) |
Crear un gráfico base de ggplot2
Usaremos un único data frame pequeño para distinguir con claridad cada cambio. La columna plan es un factor, por lo que recibe una escala x discreta. orders es numérica y usa una escala y continua.
library(ggplot2)
plan_sales <- data.frame(
plan = factor(
c("starter", "standard", "premium", "enterprise"),
levels = c("starter", "standard", "premium", "enterprise")
),
orders = c(180, 250, 210, 140)
)
base_plot <- ggplot(plan_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
base_plot
ggsave(
"ggplot-default-axis-tick-labels.png",
plot = base_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
El gráfico base muestra los cuatro valores almacenados del factor en el eje x y graduaciones numéricas elegidas automáticamente en el eje y. labs(x = "Plan") establece el título visible “Plan”, pero no cambia starter, standard, premium ni enterprise.
Antes de elegir una escala, comprueba el tipo de la variable asignada. str(plan_sales$plan) indica que es un factor, mientras que str(plan_sales$orders) muestra un vector numérico. Un factor que contenga "1", "2" y "3" sigue siendo discreto. Del mismo modo, una columna numérica continúa siendo continua aunque tenga pocos valores distintos. Convierte el tipo solo si la nueva representación coincide con el significado de los datos.
Renombrar y ordenar etiquetas discretas
En una escala discreta, combina breaks con labels. breaks identifica los valores de datos que tendrán una graduación y labels proporciona el texto impreso para cada valor. La asociación explícita evita que una etiqueta termine en la posición equivocada si cambia el orden de la escala.
El ejemplo siguiente también ordena las categorías de manera segura. Modifica los niveles del factor en una copia del data frame y pasa la misma secuencia a breaks. El vector con nombres permite entender la correspondencia antes de ejecutar el gráfico.
plan_order <- c("premium", "standard", "starter", "enterprise")
plan_names <- c(
premium = "Premium",
standard = "Standard",
starter = "Starter",
enterprise = "Enterprise"
)
ordered_sales <- plan_sales
ordered_sales$plan <- factor(ordered_sales$plan, levels = plan_order)
discrete_plot <- ggplot(ordered_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
scale_x_discrete(
breaks = plan_order,
labels = plan_names[plan_order]
) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
discrete_plot
ggsave(
"ggplot-discrete-axis-tick-labels.png",
plot = discrete_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
La secuencia visible es Premium, Standard, Starter, Enterprise. Los valores almacenados siguen en minúsculas; solo cambia su presentación. labels también puede recibir una función cuando una regla se aplica a todas las graduaciones. Por ejemplo, scale_x_discrete(labels = abbreviate) pasa los valores a la función abbreviate() de R base. Una function(x) propia debe devolver un vector de caracteres de igual longitud.
Si solo necesitas nombres nuevos y quieres conservar el orden actual, omite breaks y proporciona un vector con nombre que cubra todos los valores visibles, como c(starter = "Starter", standard = "Standard", premium = "Premium", enterprise = "Enterprise"). La forma emparejada anterior es preferible cuando tanto el conjunto como el orden son requisitos. Después de filtrar datos, lee el eje de izquierda a derecha y compáralo con la secuencia esperada indicada junto a la imagen.
No confundas breaks con limits. En una escala discreta, breaks selecciona las graduaciones visibles sin cambiar las categorías admitidas. limits define los valores permitidos y su orden. Los valores excluidos se convierten en ausentes, y una capa como geom_col() puede eliminar esas filas y emitir una advertencia. Cambia los niveles del factor cuando el orden sea una decisión sobre los datos; usa limits solo si la exclusión es intencional.
Definir y formatear graduaciones continuas
Un eje numérico necesita una escala continua. Indica las posiciones exactas mediante breaks y suministra a labels un vector de caracteres correspondiente o una función de formato. La función es más segura si los valores pueden cambiar, porque ggplot2 la llama con los valores finales de las graduaciones.
Este diagrama de dispersión coloca marcas de potencia en 100, 200 y 300, y scales::label_number() añade la unidad. La llamada directa al formateador permite verificar el texto antes de dibujar.
hp_breaks <- c(100, 200, 300)
hp_formatter <- scales::label_number(suffix = " hp", accuracy = 1)
hp_formatter(hp_breaks)
continuous_plot <- ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(size = 3, color = "#d95f0e") +
scale_x_continuous(
breaks = hp_breaks,
labels = hp_formatter
) +
labs(x = "Engine power", y = "Fuel economy (mpg)") +
theme_minimal(base_size = 16)
continuous_plot
ggsave(
"ggplot-continuous-axis-tick-labels.png",
plot = continuous_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
[1] "100 hp" "200 hp" "300 hp"
El eje x debe mostrar exactamente esas tres etiquetas. Para un eje y numérico, usa la llamada equivalente scale_y_continuous(). scales incluye funciones para separadores de miles, porcentajes, divisas y otros formatos. Los datos permanecen numéricos: solo cambia el texto mostrado.
Los breaks exactos son adecuados cuando las posiciones tienen significado. Si solo importa el formato, omite breaks, deja que ggplot2 elija posiciones según el rango y pasa únicamente el formateador a labels. No conviertas la columna numérica en cadenas para añadir un sufijo: eso cambia el tipo de escala y puede ordenar lexicográficamente en lugar de mantener el espaciado numérico.
Las fechas constituyen otro tipo de escala. Si la columna hereda de Date, usa scale_x_date() o su equivalente para y en vez de forzar una escala numérica o discreta. Se mantiene el principio de separar posiciones y etiquetas, pero con intervalos y formatos específicos para fechas.
Girar etiquetas de graduación superpuestas
Cambiar el contenido y cambiar el estilo resuelven problemas distintos. Si el texto es correcto pero se superpone, conserva la escala y ajusta axis.text.x en el tema. angle = 35 gira cada etiqueta y hjust = 1 alinea su borde derecho con la graduación. El tamaño base mayor mantiene la legibilidad al estrechar el gráfico.
channel_sales <- data.frame(
channel = c(
"North America Online",
"Europe Retail Stores",
"Asia Pacific Partners",
"Latin America Direct"
),
orders = c(260, 220, 195, 150)
)
rotated_plot <- ggplot(channel_sales, aes(x = channel, y = orders)) +
geom_col(fill = "#31a354", width = 0.65) +
labs(x = "Sales channel", y = "Orders") +
theme_minimal(base_size = 18) +
theme(
axis.text.x = element_text(angle = 35, hjust = 1, vjust = 1)
)
rotated_plot
ggsave(
"ggplot-rotated-axis-tick-labels.png",
plot = rotated_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
La rotación conserva los cuatro nombres completos. Si todavía se solapan, abreviar el texto o ampliar el gráfico suele comunicar mejor que aumentar el ángulo. En el entorno verificado con ggplot2 3.3.5, scale_x_discrete(guide = guide_axis(n.dodge = 2)) distribuye las etiquetas discretas en dos filas; la función también aparece en la API actual. El escalonamiento ocupa más espacio vertical. Consulta cómo girar etiquetas de ejes en R base o ggplot2 para ver otras opciones.
Ocultar etiquetas, marcas o graduaciones de forma deliberada
Elige el objeto que deseas retirar en lugar de tratar estos controles como sinónimos. Los tres objetos siguientes muestran resultados distintos:
control_plot <- base_plot +
theme_classic(base_size = 16)
labels_hidden <- control_plot +
theme(axis.text.x = element_blank())
ticks_hidden <- control_plot +
theme(axis.ticks.x = element_blank())
breaks_hidden <- control_plot +
scale_x_discrete(breaks = NULL)
control_plot usa theme_classic(), que dibuja marcas cortas y ofrece una referencia visible. labels_hidden retira solo el texto impreso. ticks_hidden elimina solo las marcas, de modo que los nombres de las categorías permanecen. breaks_hidden impide que la escala produzca graduaciones principales; desaparecen sus etiquetas y marcas. Ninguna expresión filtra filas de plan_sales.
Otra opción de escala es labels = NULL, que oculta el texto conservando las posiciones. Úsala cuando la propia escala no deba generar etiquetas. Prefiere element_blank() cuando la escala siga siendo significativa pero un tema concreto no deba dibujar el texto. Si ocultas nombres de categorías, añade anotaciones directas u otra clave para que las barras o los puntos sigan siendo identificables.
No se guardan imágenes adicionales para estas variantes, ya que el código seleccionable y la descripción permiten una comparación precisa. Imprime, por ejemplo, ticks_hidden en la consola y compáralo con control_plot. Las barras y sus alturas deben permanecer idénticas; solo cambian las guías del eje. Si cambia la geometría o aparece una advertencia sobre filas eliminadas, busca una llamada a limits en otra parte del gráfico.
Solucionar etiquetas incorrectas o ausentes
Si ggplot2 informa que se proporcionó un valor continuo a una escala discreta, o al revés, examina la columna con str() antes de modificar el gráfico. Los factores y caracteres usan escalas discretas; los números, escalas continuas; y los objetos Date o de fecha y hora, sus escalas correspondientes. Convierte la variable únicamente si el nuevo tipo refleja su significado real.
Cuando labels sea un vector de caracteres, acompáñalo con breaks explícitos y mantén la misma longitud. De lo contrario, las etiquetas pueden desplazarse tras filtrar, reordenar o agregar categorías. Una correspondencia con nombres como plan_names documenta qué texto pertenece a cada valor. Una función evita el problema de longitud cuando aplica una sola transformación a todos los valores.
Las barras ausentes y las advertencias sobre filas eliminadas suelen señalar a limits, no a labels. Comprueba si los límites omiten un valor presente en los datos. Usa breaks cuando solo quieras reducir el número de etiquetas visibles. Para controlar el rango o el zoom, consulta cómo definir límites de ejes en ggplot2 sin confundirlos con las graduaciones.
Por último, verifica si el texto es en realidad el título del eje. labs(x = "Plan") y el argumento name de una escala x cambian el título; el argumento labels controla las etiquetas de graduación. Separar ambas funciones evita que el título cambie correctamente mientras las categorías o cifras permanecen intactas.
En la mayoría de los gráficos, elige la escala según el tipo de datos, combina breaks con labels cuando el texto exacto sea importante y reserva theme() para la apariencia. Así los cambios del eje son previsibles y no alteran las observaciones subyacentes.