开发者

Continuous and Dashed Lines using ggplot

开发者 https://www.devze.com 2023-03-22 09:34 出处:网络
I have a set of coordinates (x, y) = (0, 2), (1, 3), (1, 2), (2, 4)(this is a simplified example) Whenever there is an increase in the y-ordinate, I would like to join the coordinates by a continu

I have a set of coordinates

(x, y) = (0, 2), (1, 3), (1, 2), (2, 4)      (this is a simplified example)

Whenever there is an increase in the y-ordinate, I would like to join the coordinates by a continuous line. Whenever there is a decrease in the y-ordinate, I would like to join the coordinates by a dashed line. In the example above,

1.) the coordinates (0, 2) and (1, 3) are joined by a straight line,

2.) the coordinates (1, 3) and (1, 2) are joined by a dashed line, and

3.) the coordinates开发者_运维技巧 (1, 3) and (2, 4) are joined by a straight line.

Is it possible to do this using ggplot in R? So far, I could only have a continuous line joining the coordinates. (If this possibly makes anything easier, I only have a decrease in the y-ordinate when there is no change in the x-ordinate.)

Thank You for your help!


try this,

dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4))

## add endpoints (xend, yend), and and id variable 
## tracking the sign of diff(y)
dat2 <- with(dat, data.frame(x=x[-length(x)], y=y[-length(y)],
                             id= diff(y) > 0,xend=x[-1], yend=y[-1]))

head(dat2)
ggplot(dat2) +
  geom_segment(aes(x=x, y=y, xend=xend, yend=yend, linetype=id)) +
  scale_linetype_manual(values=c("dashed", "solid"))


(Edited to remove some potentially misleading statements...)

Thanks for asking this question! At first I thought that would be pretty horrible, but then I remembered a little trick about how you can store a bunch of ggplot components in a list, and it turns out to not be so bad:

#Your example data
dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4))

#Initialize the list    
pathList <- vector("list",nrow(dat) - 1)
#Loop over the data and put the appropriate `geom_line` in each slot
for (i in 2:nrow(dat)){
    if (dat$y[i] - dat$y[i-1] >= 0){
        pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y))
    }
    else{
        pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y),
                                 linetype="dashed")
    }
}

p <- ggplot(data=dat,aes(x=x,y=y)) + pathList

Which resulted in this:

Continuous and Dashed Lines using ggplot

As noted in the comments, though, this solution is going to be quite inefficient...

0

精彩评论

暂无评论...
验证码 换一张
取 消