使用ggplot的连续和虚线

A-A*_*A-A 8 r ggplot2

我有一套坐标

(x, y) = (0, 2), (1, 3), (1, 2), (2, 4)      (this is a simplified example)
Run Code Online (Sandbox Code Playgroud)

每当y坐标增加时,我想用连续线加入坐标.每当y坐标减小时,我想用虚线加入坐标.在上面的例子中,

1.)坐标(0,2)和(1,3)由直线连接,

2.)坐标(1,3)和(1,2)用虚线连接,并且

3.)坐标(1,3)和(2,4)由直线连接.

是否可以在R中使用ggplot来做到这一点?到目前为止,我只能连续加入坐标线.(如果这可能使任何事情变得更容易,那么当x坐标没有变化时,我只会减少y坐标.)

谢谢您的帮助!

bap*_*ste 7

试试这个,

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"))
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 6

(编辑删除一些可能具有误导性的陈述......)

谢谢你提出这个问题!起初我觉得这会非常可怕,但后来我想起了一个关于如何ggplot在列表中存储一堆组件的小技巧,事实证明并不是那么糟糕:

#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
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

然而,如评论中所述,这种解决方案效率很低......