2 min read

Círculos con ggplot

En este post exploro un poco algunas secciones cónicas usando ggplot y LaTeX.

Círculo

La ecuación genérico de un círculo es

\[ (x-h)^2+(y-k)^2=r^2 \]

donde \((h, k)\) es el centro y \(r\) el radio.

Un círculo que pasa por (1, 4) con centro en (-2, -3).

# distancia euclideana
my_dist <- function(x, y) { sqrt(sum((x-y)^2)) }
center <- c(-2, -3)
point <- c(1, 4)
#  Hallar el radio como la distancia entre el punto y el centro
radius <- my_dist(center, point)
radius^2
## [1] 58

La ecuación del círculo es: \[(x+2)^2 + (y+3)^2 = 58\]

Completar el cuadrado y encontrar la ecuación del círculo

\[x^2-6x+y^2-2y+6\] es \[(x-3)^2+(y-1)^2 = 4\]

Graficarlo este post en Stack Overflow. Los primeros geom_segment son para dibujar los ejes. Luego uso annotate para graficar las curvas en su forma paramétrica.

Para dibujar la capa con puntos, primero hice un data frame con las coordenadas, una layer geom_point para marcar los puntos y una layer geom_text para las etiquetas de los puntos. El problema es que hay dos puntos que quedan superpuestos con el círculo.

Así que esos dos puntos (\((1,1)\) y \((5, 1)\)) los dibujo aparte con annotate.

library(ggplot2)
library(latex2exp)

center <- c(x=3, y=1)
#pt1 <- c(x=1, y=1)
#pt2 <- c(x=5, y=1)
pt3 <- c(x=3, y=3)
pt4 <- c(x=3, y=-1)
pts <- dplyr::bind_rows(center,pt3, pt4)
radius <- 2
t <- seq(0, 2*pi, length.out = 100)

g <- ggplot() + 
  geom_segment(aes(x=-1, xend = 6, y=0, yend=0),
               size = 0.5,
               arrow = arrow(length = unit(0.2, "cm"))) + # Eje X
  geom_segment(aes(x=0, xend=0, y=-1, yend=4),
               size = 0.5,
               lineend = "butt",
               arrow = arrow(length = unit(0.2, "cm"))) + # Eje Y
  annotate("path", 
           x = center[1] + radius * cos(t),
           y = center[2] + radius * sin(t)) + 
  geom_point(data = pts, aes(x=x, y =y)) + 
  geom_text(data = pts,
            parse = TRUE,
            nudge_y = 0.2,
            aes(x=x, y=y, label = paste0("list(", x ,",", y, ")"))) +
  annotate("point", x=1, y=1) + 
  annotate("text", x=1.25, y=1, label="1,1") + 
  annotate("point", x=5, y=1) + 
  annotate("text", x=4.75, y=1, label="5, 1") + 
  labs(x="", y="") + 
  ggtitle(TeX("(x-3)^2+(y-1)^2=4")) + 
  coord_fixed()
g