1

我想在 R 中显示每个变量的两个功能区,例如(最大 - 最小功能区和置信水平功能区) ,如下例geom_ribbon()所示ggplot2。我无法分别为每个色带设置颜色。理想情况下,我可以将调色板映射到分类变量 ( type) 的每个级别,两条色带将从这些颜色中获取颜色。

## Set up data
set.seed(999)
n <- 100

mn1 <- seq(0.5, 0.9, length.out = n)
mn2 <- seq(0.75, 0.25, length.out = n)

tmp1 <- lapply(seq_len(n), function(x) {
  
  x1 <- rnorm(n, mn1[x], 0.1)
  x2 <- rnorm(n, mn2[x], 0.1)
  
  rbind(cbind(min(x1), mean(x1)-sd(x1), mean(x1), mean(x1)+sd(x1), max(x1)),
        cbind(min(x2), mean(x2)-sd(x2), mean(x2), mean(x2)+sd(x2), max(x2))
  )
})

year <- seq(1900, 1900+n-1, 1)
type <- rep(c("all", "partial"), n)

df1 <- data.frame(rep(year,each = 2), do.call(rbind, tmp1), type)
colnames(df1) <- c("year", "xmin", "xsd_lwr", "xmn", "xsd_upr", "xmax", "type")
head(df1)                  
rm(tmp1, mn1, mn2, year, type, n)

这是我到目前为止在 ggplot2 中所拥有的:

library(ggplot2)

ggplot(df1, aes(x = year, y = xmn, fill = type, col= type))+
  geom_ribbon(aes(ymin=xsd_lwr, ymax = xsd_upr), linetype = 0, alpha = 0.4)+
  geom_ribbon(aes(ymin=xmin, ymax = xmax), linetype = 0, alpha = 0.4)+
  scale_color_manual(values = c("black", "darkred"))+
  scale_fill_manual(values = c("grey10", "grey30"))+
  geom_line(aes(linetype= type), size = 1)+
  scale_x_continuous(breaks = seq(1900, 2000,10))

双丝带ggplot geom_ribbon

更新:我已经接受了答案,因为它确实可以精确控制四种不同的颜色,但是,我想表明@teunbrand 的评论也可以作为透明度,实际上,也可以创建四种颜色,并且有更好的图例. 我已将建议修改为以下内容:

ggplot(df1, aes(x = year, y = xmn,col= type))+
  geom_ribbon(aes(ymin=xsd_lwr, ymax = xsd_upr, fill = type), linetype = 0, alpha = 0.5)+
  geom_ribbon(aes(ymin=xmin, ymax = xmax, fill = type), linetype = 0, alpha =0.5)+
  scale_fill_manual(values = c("tomato", "dodgerblue"))+
  scale_color_manual(values = c("black", "darkred"))+
  geom_line(aes(linetype= type), size = 1)+
  scale_x_continuous(breaks = seq(1900, 2000,10))

在此处输入图像描述

4

2 回答 2

1

您可以在's中定义一个特定fill组,并将您希望的颜色与它相关联:ribbonaesscale_fill_manual

ggplot(df1, aes(x = year, y = xmn, fill = type, col= type))+
  geom_ribbon(aes(ymin=xsd_lwr, ymax = xsd_upr), linetype = 0, alpha = 0.4,show.legend=F)+
  scale_fill_manual(values = c("grey10","red","grey30","green"))+
  geom_ribbon(aes(ymin=xmin, ymax = xmax,fill=ifelse(type=='all','all_minmax','partial_min_max')), linetype = 0, alpha = 0.4,show.legend=F)+
  scale_color_manual(values = c("black", "darkred"))+
  geom_line(aes(linetype= type), size = 1)+
  scale_x_continuous(breaks = seq(1900, 2000,10))

请注意,我必须删除图例ribbons以避免显示带有新颜色组的第二个图例。 在此处输入图像描述

于 2021-02-06T17:05:12.097 回答
1

要根据需要轻松和完全控制尽可能多的颜色/填充,请使用ggnewscale. 这使您还可以完全控制图例。

我不在控制台上,在 rdrr.io/snippets 上进行编码,因此难以显示图形输出。但可重现它是

library(ggplot2)
library(ggnewscale)

ggplot(df1, aes(x = year, y = xmn, col = type))+
  geom_ribbon(aes(ymin=xsd_lwr, ymax = xsd_upr, fill = "SE"), linetype = 0, alpha = 0.4)+
  scale_fill_manual(name = NULL, values = c("tomato","darkred"))+
  new_scale_fill()+
  geom_ribbon(aes(ymin=xmin, ymax = xmax, fill= "range"), linetype = 0, alpha = 0.4)+
  scale_fill_manual(name = NULL, values = c("dodgerblue", "darkred"))+
  geom_line(aes(linetype= type), size = 1)+
  scale_color_manual(values = c("black", "darkred"))+
  scale_x_continuous(breaks = seq(1900, 2000,10)) 
于 2021-02-10T15:56:29.773 回答