2012-01-31 21 views
6

Estoy intentando mostrar una intersección en un gráfico de líneas usando ggplot vline y hline, pero quiero que las líneas cesen en el punto de interceptación en el gráfico. Es esto posible, ya sea en ggplot o hay otra solución¿Hay alguna manera de limitar las longitudes vline en ggplot2?

library(ggplot2) 

pshare <- data.frame() 

for (i in 1:365) { 
    pshare <- rbind(pshare,c(i, pbirthday(i,365,coincident=3))) 
} 

names(pshare) <- c("number","probability") 

x25 <- qbirthday(prob = 0.25, classes = 365, coincident = 3) #61 
x50 <- qbirthday(prob = 0.50, classes = 365, coincident = 3) 
x75 <- qbirthday(prob = 0.75, classes = 365, coincident = 3) 

p <- qplot(number,probability,data=subset(pshare,probability<0.99)) 

p <- p + geom_vline(xintercept = c(x25,x50,x75)) 
p <- p + geom_hline(yintercept = c(0.25,0.5,0.75)) 
p 

Así, por ejemplo, me gustaría que los 0,25/61 líneas para acabar cuando se encuentran en la parcela

TIA

+7

Use 'geom_segment' lugar, con' 'Inf' o -Inf' para forzar las extensiones a la frontera en la otra dirección. – joran

+0

@joran que suena como una buena respuesta para mí! ¿por qué no publicarlo como una respuesta? – Justin

+0

@Justin Debido a que estoy tratando de alimentar mi solución de SO al mismo tiempo que trabajo, así que estaba contento de "sembrar" la pregunta con una posible respuesta, y dejar los detalles a otra persona. – joran

Respuesta

17

La ampliación de la comentar por @joran en una respuesta y ejemplo

geom_vline dibuja todo el camino a través de la trama; ese es su propósito geom_segment solo dibujará entre puntos finales específicos. Ayuda a crear un marco de datos con la información relevante para dibujar las líneas.

probs <- c(0.25, 0.50, 0.75) 
marks <- data.frame(probability = probs, 
        number = sapply(probs, qbirthday, classes=365, coincident=3)) 

Con esto, hacer que las líneas solo vayan a la intersección es más fácil.

qplot(number,probability,data=subset(pshare,probability<0.99)) + 
    geom_segment(data=marks, aes(xend=-Inf, yend=probability)) + 
    geom_segment(data=marks, aes(xend=number, yend=-Inf)) 

enter image description here

+0

Gracias. v elegante – pssguy

Cuestiones relacionadas