首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ggplot2中对两条线之间的区域进行着色/着色?

如何在ggplot2中对两条线之间的区域进行着色/着色?
EN

Stack Overflow用户
提问于 2021-08-13 10:04:57
回答 3查看 113关注 0票数 1

我想画一张图,用两条线表示观测数据和来自特殊模型的数据。还有两条线表示其他模型的最大和最小可变性。目标是用灰色对这两条线之间的区域进行着色,以便前两条线仍然可见。

下面是重现数据的代码:

代码语言:javascript
运行
复制
# create the data set
Month.vec <- c(1:12)
Model.vec <- c(70.33056, 58.91058, 73.40891, 74.42824, 108.45975, 125.85887, 126.02867, 102.54128, 70.66263, 61.30316, 66.04057, 75.75262)
Obs.vec <- c(62.64178, 52.39356, 63.07376, 52.87248, 70.80587, 81.85081, 88.29134, 77.22920, 67.67458, 64.74425, 63.96322, 69.89868)
Up_lim.vec <- c(83.46967, 71.27700,  86.43001,  77.62739, 108.32674, 112.61118, 125.43512,  93.71193,  80.17298,  75.01851,  79.05700,  85.40042)
Low_lim.vec <- c(76.44381, 65.19571, 74.27778, 59.91012, 82.14684, 84.09151, 77.91529, 66.21702, 60.89712, 67.85613, 72.49409, 79.13741)
df <- as.data.frame(cbind(Month.vec, Obs.vec, Model.vec, Up_lim.vec, Low_lim.vec))
colnames(df) <- c("Month", "Observation", "Model", "Upper Limit", "Lower Limit")

一个有四条线的“正常”图很容易完成:

代码语言:javascript
运行
复制
# plot 
df %>% 
  as_tibble() %>% 
  pivot_longer(-1) %>% 
  ggplot(aes(Month, value, color = name)) + 
  scale_color_manual("",values= c("blue", "yellow", "red", "black")) +
  scale_x_continuous(breaks = seq(1, 12, by = 1)) +
  scale_y_continuous(breaks = seq(0, 140, by = 20)) +
  ylab("Precipitation [mm]") +
  geom_line() +
  theme_bw()

这将导致以下输出:

所以想法是黑色和蓝色之间的区域被灰色或类似的颜色阴影,这样蓝色和黄色的线仍然是可见的。

this问题中,结果应该看起来有点像这样:

我知道这里有一些类似的问题,其中大多数都暗示要使用geom_ribbon。我试过了,但只收到以下错误消息:

代码语言:javascript
运行
复制
Error: Aesthetics must be either length 1 or the same as the data (48): ymax and ymin

有谁知道怎么做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-13 11:55:04

我认为将数据保存为更宽的格式,然后使用geom_ribbon创建阴影区域会更容易:

代码语言:javascript
运行
复制
df %>% 
  as_tibble() %>% 
  ggplot +
  geom_line(aes(Month, Model, color = 'Model')) +
  geom_line(aes(Month, Observation, color = 'Observation')) +
  geom_ribbon(aes(Month, ymax=`Upper Limit`, ymin=`Lower Limit`), fill="grey", alpha=0.25) +
  scale_x_continuous(breaks = seq(1, 12, by = 1)) +
  scale_y_continuous(breaks = seq(0, 140, by = 20)) +
  scale_color_manual(values = c('Model' = 'yellow','Observation' = 'red')) +
  ylab("Precipitation [mm]") +
  theme_bw() +
  theme(legend.title = element_blank())

票数 3
EN

Stack Overflow用户

发布于 2021-08-13 12:12:41

如果你想保留Upper LimitLower Limit行,你可以为ribbon创建一个数据帧(尽管无可否认,这是一个没有上面那么优雅的解决方案):

代码语言:javascript
运行
复制
library(stringr)

df <- df %>% 
  as_tibble() %>% 
  pivot_longer(-1)

ribbon_df <- df %>% filter(str_detect(name, "Limit")) %>%
    pivot_wider(names_from = name, values_from = value) %>%
    mutate(value = `Upper Limit` ) %>%
    mutate(name = "Upper Limit")

df %>% ggplot(aes(Month, value, color = name)) + 
    scale_color_manual("",values= c("blue", "yellow", "red", "black")) +
    scale_x_continuous(breaks = seq(1, 12, by = 1)) +
    scale_y_continuous(breaks = seq(0, 140, by = 20)) +
    ylab("Precipitation [mm]") +
    geom_ribbon(data = ribbon_df, aes(ymin = `Lower Limit`, ymax = `Upper Limit`), fill = "grey") + 
    geom_line() +
    theme_bw()
票数 1
EN

Stack Overflow用户

发布于 2021-08-13 12:13:58

如果使用较长的格式,则需要一个宽表来存储geom_ribbon数据。

代码语言:javascript
运行
复制
library(tidyverse)
# create the data set
Month.vec <- c(1:12)
Model.vec <- c(70.33056, 58.91058, 73.40891, 74.42824, 108.45975, 125.85887, 126.02867, 102.54128, 70.66263, 61.30316, 66.04057, 75.75262)
Obs.vec <- c(62.64178, 52.39356, 63.07376, 52.87248, 70.80587, 81.85081, 88.29134, 77.22920, 67.67458, 64.74425, 63.96322, 69.89868)
Up_lim.vec <- c(83.46967, 71.27700,  86.43001,  77.62739, 108.32674, 112.61118, 125.43512,  93.71193,  80.17298,  75.01851,  79.05700,  85.40042)
Low_lim.vec <- c(76.44381, 65.19571, 74.27778, 59.91012, 82.14684, 84.09151, 77.91529, 66.21702, 60.89712, 67.85613, 72.49409, 79.13741)
df <- as.data.frame(cbind(Month.vec, Obs.vec, Model.vec, Up_lim.vec, Low_lim.vec))
colnames(df) <- c("Month", "Observation", "Model", "UL", "LL")

df_new <- df %>% 
  as_tibble() %>% 
  pivot_longer(-1)



  ggplot() + 
 # scale_color_manual("",values= c("blue", "yellow", "red", "black")) +
  scale_x_continuous(breaks = seq(1, 12, by = 1)) +
  scale_y_continuous(breaks = seq(0, 140, by = 20)) +
  ylab("Precipitation [mm]") +
  geom_line(data=df_new,aes(Month, value, color = name)) +
  geom_ribbon(data=df, aes(x=Month,ymin = LL, ymax = UL),alpha=0.5)
  theme_bw()

这将导致以下结果

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68770379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档