studio - superponer graficas en r
trazando una curva alrededor de un conjunto de puntos (4)
Bien, aquí hay una versión de una respuesta que creo que se acerca a lo que está persiguiendo: utiliza la función spline.poly
creada en esta respuesta ( https://gis.stackexchange.com/a/24929 ) en el foro GIS .
Aquí hay algunos puntos de ejemplo:
testpts <-
structure(list(x = c(4.9, 4.2, 4, 4.1, 4.4, 5.8, 5.8, 5.8, 5.8,
5.5, 4.9, 3.2, 3.2, 3.3, 5.4, 5.4, 5.7, 6.4, 6.7, 6.7, 6, 4.8,
3.6, 2.8, 3.5, 4.4, 5.1, 4, 3.7, 4.5, 4.9, 5.7), y = c(6.9, 6.2,
5.3, 4.1, 3.1, 2.9, 2.9, 3.5, 4.2, 4.9, 5.1, 4.9, 4.9, 5.2, 6.9,
6.9, 5.3, 3.8, 4.2, 5.6, 6.9, 5.8, 1.2, 2.5, 5.3, 6.4, 6.8, 7.6,
6.9, 5.4, 4.8, 4.4)), .Names = c("x", "y"))
Configura una trama básica.
plot(NA,xlim=c(0,10),ylim=c(0,10))
points(testpts,pch=19)
chuld <- lapply(testpts,"[",chull(testpts))
polygon(chuld,lty=2,border="gray")
polygon(spline.poly(as.matrix(as.data.frame(chuld)),100),border="red",lwd=2)
Y el resultado:
EDITAR PARA AGREGAR UN EJEMPLO DE CONCAVE
Esta parte de la respuesta usa la librería alphahull
# load the required library
library(alphahull)
plot(NA,xlim=c(0,10),ylim=c(0,10))
points(testpts,pch=19)
# remove duplicate points so the ahull function doesn''t error out
testptsnodup <- lapply(testpts,"[",which(!duplicated(as.matrix(as.data.frame(testpts)))))
Genere y trace el objeto ahull: el valor alfa parece ser muy importante para determinar el ajuste del polígono a los datos.
ahull.obj <- ahull(testptsnodup,alpha=2)
plot(ahull.obj,add=TRUE,col="red",wpoints=FALSE)
Y el resultado:
Tengo un conjunto de puntos en un plano. Se dividen en subconjuntos. Quiero trazar una curva cerrada alrededor de los puntos que pertenecen al mismo subconjunto, de modo que los puntos que pertenecen a un subconjunto estén dentro de la curva, y los que no lo estén estarán afuera. Por lo tanto, los círculos simples o un casco convexo podrían no funcionar.
Para un principiante, digamos que solo quiero tener una curva suave alrededor de un conjunto de puntos (sin el requisito de que excluya otros puntos)
¿Alguna idea de cómo hacer eso en R?
--- añadido más tarde ---
Lo que estoy buscando finalmente, es algo en el espíritu de los gráficos aquí: https://tex.stackexchange.com/questions/1175/drawing-a-hypergraph - aunque el contexto no es un hipergráfico, sino un dado Conjunto de puntos y una partición de esos.
Después de algunas búsquedas en Google, modifico poco este ejemplo Morota ggplot2
EDITAR
Utiliza la función chull con bezier.
library(ggplot2)
library(plyr)
library(Hmisc)
df <- data.frame(x = rnorm(20), y = rnorm(20),z = sample(letters[1:5], 20, rep = T))
ggplot(df, aes(x, y, colour = z)) + geom_point()
find_hull <- function(df) {
res.ch <- df[chull(df$x, df$y), ]
res <- bezier(res.ch)
res <- data.frame(x=res$x,y=res$y)
res$z <- res$z
res
}
hulls <- ddply(df, "z", find_hull)
ggplot(df, aes(x, y, colour = z,fill = z)) +
geom_point() + geom_polygon(data = hulls,alpha = 0.4)
El paquete ggalt
proporciona geom_encircle
, que se supone que proporciona algo como esto: convexo, pero suave:
library(ggplot2)
library(ggalt) ## v 0.4.0
df <- data.frame(x = rnorm(20), y = rnorm(20),
z = sample(letters[1:5], 20, replace = TRUE))
ggplot(df, aes(x, y, colour = z)) + geom_point() +
geom_encircle(aes(fill=z),alpha=0.3)
Simplemente:
testpts <- structure(list(x = c(4.9, 4.2, 4, 4.1, 4.4, 5.8, 5.8, 5.8, 5.8,
5.5, 4.9, 3.2, 3.2, 3.3, 5.4, 5.4, 5.7, 6.4, 6.7, 6.7, 6, 4.8,
3.6, 2.8, 3.5, 4.4, 5.1, 4, 3.7, 4.5, 4.9, 5.7), y = c(6.9, 6.2,
5.3, 4.1, 3.1, 2.9, 2.9, 3.5, 4.2, 4.9, 5.1, 4.9, 4.9, 5.2, 6.9,
6.9, 5.3, 3.8, 4.2, 5.6, 6.9, 5.8, 1.2, 2.5, 5.3, 6.4, 6.8, 7.6,
6.9, 5.4, 4.8, 4.4)), .Names = c("x", "y"))
x <- do.call(''cbind'',testpts)
ch<-chull(x)
x[c(ch,ch[1]),]
plot(x,pch=20)
points(x[ch,],pch=20,col=''red'')
lines(x[c(ch,ch[1]),],lwd=.5)
Trama: