La función ggplot() en R: gráficos por capas (y cuándo basta con plot())

ggplot() construye gráficos sumando capas. Es de ggplot2, hay que instalarlo:

install.packages("ggplot2")
library(ggplot2)

Su lógica es distinta a la de plot(): en vez de una función que lo dibuja todo, vas encadenando piezas con el signo +.

Ejemplo simple

library(ggplot2)

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) +
  geom_point()

Tres piezas ahí:

  • ggplot(datos, ...) → los datos.
  • aes(...) → qué columna va en cada eje. Es el "mapeo estético".
  • geom_point() → cómo dibujarlo. Puntos, en este caso.

Sin el geom_ no verías nada: ggplot() a secas solo prepara el lienzo.

Añadir capas

Aquí está su gracia. Cada + suma un elemento:

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
  geom_point() +
  labs(title = "Relación entre sépalo y pétalo",
       x = "Largo del sépalo",
       y = "Largo del pétalo")

Al meter color = Species dentro de aes(), ggplot colorea por especie y añade la leyenda solo. Eso en R base tendrías que montarlo a mano, y es la ventaja real de ggplot2.

Ejemplo algo más completo

ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
  geom_boxplot() +
  labs(title = "Distribución por especie") +
  theme_minimal()

Cambiando el geom_ cambias el tipo de gráfico sin tocar nada más: geom_col() para barras, geom_line() para líneas, geom_histogram() para histogramas.

Lo mismo con R base

Los dos ejemplos anteriores, sin instalar nada:

plot(iris$Sepal.Length, iris$Petal.Length,
     col = iris$Species, pch = 19,
     main = "Relación entre sépalo y pétalo",
     xlab = "Largo del sépalo", ylab = "Largo del pétalo")

boxplot(Sepal.Length ~ Species, data = iris,
        main = "Distribución por especie")

El boxplot sale prácticamente igual. En el de dispersión, R base colorea por especie pero no pone la leyenda: hay que añadirla con legend().

Nuestra recomendación: mientras exploras tus datos, usa plot(), boxplot() y hist() de R base → escribes menos y no dependes de nada. Reserva ggplot2 para el gráfico final que va a ver otra persona, donde sí compensa el control fino sobre leyendas, escalas y temas.