两行之间的阴影块,值随facet_wrap变化

时间:2019-01-22 17:37:21

标签: r ggplot2

我正在绘制四种不同物种(每个物种都在不同方面)的速度和时间之间的关系。对于每种物种,我都有自己感兴趣的一系列速度,并希望在最小值和最大值之间加阴影。但是,与前三个物种相比,第四个物种的这些范围有所不同。

#data to plot as points
species <- sample(letters[1:4], 40, replace = TRUE)
time <- runif(40, min = 1, max = 100)
speed <- runif(40, min = 1, max = 20)
df <- data.frame(species, time, speed)

#ranges of key speeds
sp <- letters[1:4]
minspeed <- c(5, 5, 5, 8)
maxspeed <- c(10, 10, 10, 13)
df.range <- data.frame(sp, minspeed, maxspeed)

ggplot() +
  geom_hline(data = df.range, aes(yintercept = minspeed), 
             colour = "red") +
  geom_hline(data = df.range, aes(yintercept = maxspeed), 
             colour = "red") +
  geom_point(data=df, aes(time, speed),
             shape = 1) + 
  facet_wrap(~species) +
  theme_bw()

我如何:

  1. 获取geom_hline仅绘制正确物种的最大和最小范围,并且

  2. 阴影两条线之间的区域?

对于后面的部分,我尝试将geom_ribbon添加到我的绘图中,但是我不断收到一条错误消息,我不确定该如何解决。

geom_ribbon(data = df, 
              aes(ymin = minspeed, ymax = maxspeed, 
                  x = c(0.0001, 100)), 
              fill = "grey",
              alpha = 0.5) +
  

错误:美学必须为长度1或与数据相同   (40):x,ymin,ymax

1 个答案:

答案 0 :(得分:2)

根据我的评论,以下应该有效。也许您的实际用例与问题示例之间还有其他无法观察到的差异?

colnames(df.range)[which(colnames(df.range) == "sp")] <- "species"

ggplot() +
  geom_hline(data = df.range, aes(yintercept = minspeed), 
             colour = "red") +
  geom_hline(data = df.range, aes(yintercept = maxspeed), 
             colour = "red") +
  geom_point(data = df, aes(time, speed),
             shape = 1) + 
  geom_rect(data = df.range, 
            aes(xmin = -Inf, xmax = Inf, ymin = minspeed, ymax = maxspeed), 
            fill = "grey", alpha = 0.5) +
  facet_wrap(~species) +
  theme_bw()

plot

使用的数据:

df <- data.frame(species = sample(letters[1:4], 40, replace = TRUE),
                 time = runif(40, min = 1, max = 100),
                 speed = runif(40, min = 1, max = 20))

df.range <- data.frame(sp = letters[1:4],
                       minspeed = c(5, 5, 5, 8),
                       maxspeed = c(10, 10, 10, 13))