Visualizando funciones trigonométricas con ggplot

Rafa · 2018/08/16 · 2 minute read

En mis épocas más humanísticas adquirí cierta admiración por los antiguos griegos y siempre me dió intriga la trigonometría. En este post armo un gráfico de las dos funciones trigonométricas más famosas: seno y coseno. La complicación más grande fue especificar la leyenda de las dos curvas y los caracteres griegos en los ejes.

Para dibujar las funciones, uso stat_function, geom_segment. scale_x_continuous permite especificar la posición y etiqueta de las guías.

En stat_function especifico aes(colour = "sin(x)"). Eso hace que el color de ese geom quede ligado al texto "sin(x)" en la leyenda.

Otra cosa que resultó más complicada de lo esperado son las etiquetas del eje x con letras griegas. Este post de stackoverflow sobre como poner letras griegas en ggplot fue de bastante utilidad.

library(tidyverse)
library(ggplot2)

# Crear etiquetas para eje x
lbls <- c( expression(-2 * pi),
           expression(-3 * pi / 2),
           expression(- pi),
           expression(-pi/2),
           0,
           expression(pi/ 2),
           expression(pi),
           expression(3 * pi /2),
           expression(2 * pi)
           )


# Gráfico
ggplot(data_frame(x = c(-7, 7)), aes(x = x)) +
  stat_function(fun = function(x) { sin(x) }, 
                geom = "line", 
                linetype = "dashed", 
                size = 1,
                aes(colour = "sin(x)")) +
  stat_function(fun = function(x) { cos(x) },
                linetype = "dashed",
                size = 1,
                aes(colour = "cos(x)")
                ) +
  scale_x_continuous(
    breaks = seq(-2 * pi, 2*pi, pi/2),
    labels = lbls
  ) + 
  labs(x = "x", y = "y") + 
  geom_segment(aes(x=-7, xend = 7, y=0, yend=0), 
               size = 0.5,
               arrow = arrow(length = unit(0.2, "cm"))) + 
  geom_segment(aes(x=0, xend=0, y=-1, yend=1.2),
               size = 0.5,
               lineend = "butt",
               arrow = arrow(length = unit(0.2, "cm"))) + 
  labs(title = "Funciones Trigonométricas") + 
  theme_minimal() + 
  theme(
    plot.title = element_text(hjust = 0.5),
    legend.title = element_blank(),
  )