簡體   English   中英

在 ggplot 圖例中控制顏色、填充和線型

[英]Control color, fill and line type in ggplot legend

我有兩個 model 結果的數據,其變化顯示為陰影分位數,每個 model 的參考基准沒有變化。 請參閱此處的示例數據:

# create data
y <- 1+0.1*c(0:29)
r1 <- runif(30,0.8,1.2)
mydata0 <- data.frame(model = "model1",scenario="a_sc1", year = c(2022:2051), q9 = y+2*r1,
                     q7=y+r1, q5=y+r1-1,q3=y-r1,q1=y-2*r1,bench= r1)

mydata1 <- mydata0
mydata1[,4:9] <- r1+mydata1[,4:9]
mydata1$model <- "model2"

mydata <- rbind(mydata0, mydata1)

我的plot是下面這種方式,正是我需要的,但是圖例是缺少了帶線型的benchmark。

library(ggplot2)
col2 <- c("darkred","steelblue")
col2f <- c("magenta","green")

ggplot(data=mydata, aes(x=year, group=model)) +
  geom_ribbon(aes(ymin=q1 , ymax=q9,fill=model),  linetype=0, alpha=0.2) +
  geom_ribbon(aes(ymin=q3 , ymax=q7,fill=model),  linetype=0, alpha=0.2) +
  geom_line(aes(x=year, y=q5 ,color=model), linetype=1, size=1.3)+
  geom_line(aes(x=year, y=bench ,color=model), linetype=2, size=1.3)+
  scale_color_manual(values = col2) +
  scale_fill_manual(values = col2f)+
  scale_linetype_manual(values = c(1,2)) +
  labs( y = "var [mg/l]", x="") +
  theme_light() +
  theme(text = element_text(size = 18),axis.text=element_text(colour="black",size=20),legend.text=element_text(size=22))

< 模型和基准 1 >

我把長格式的數據和plot排列如下:

# second trail: long data
mydata2 <- rbind(mydata[,-9], data.frame(model=mydata$model,scenario="bench",year=mydata$year,q9=NA,q7=NA,q5=mydata$bench,q3=NA,q1=NA))
  
  ggplot(data=mydata2, aes(x=year)) +
    geom_ribbon(aes(ymin=q1 , ymax=q9,fill=model),  linetype=0, alpha=0.2, na.rm = TRUE) +
    geom_ribbon(aes(ymin=q3 , ymax=q7,fill=model),  linetype=0, alpha=0.2, na.rm = TRUE) +
    geom_line(aes(x=year, y=q5 ,color=model, linetype=scenario), size=1.3)+
    scale_color_manual(values = col2) +
    scale_fill_manual(values = col2f)+
    labs( y = "var [mg/l]", x="") +
    theme_light() +
    theme(text = element_text(size = 18),axis.text=element_text(colour="black",size=20),legend.text=element_text(size=22))

< 模型和基准 2 > 現在我有了基准的圖例 - l.netype 是正確的,但缺少着色。 我沒有成功添加它。 感謝任何想法。

***** 編輯 ******

我在這里添加了我希望它如何顯示的圖形編輯圖像。 在我看來,我的第一種方法會更好(不是長格式),但如何添加圖例? 模型和基准 - 期望

如果您希望 l.netype 和線條的顏色都顯示在圖例中,那么一個選項是 map model 的交互l.netype colormodel美學的scenario ,但是需要設置手動調色板考慮到相互作用:

library(ggplot2)

pal_color <- rep(col2, each = 2)
pal_lty <- rep(c("solid", "dashed"), 2)

names(pal_color) <- names(pal_lty) <- c("model1.a_sc1", "model1.bench", "model2.a_sc1", "model2.bench")

ggplot(data = mydata2, aes(x = year)) +
  geom_ribbon(aes(ymin = q1, ymax = q9, fill = model), linetype = 0, alpha = 0.2, na.rm = TRUE) +
  geom_ribbon(aes(ymin = q3, ymax = q7, fill = model), linetype = 0, alpha = 0.2, na.rm = TRUE) +
  geom_line(aes(
    x = year, y = q5,
    color = paste(model, scenario, sep = "."),
    linetype = paste(model, scenario, sep = ".")
  ), size = 1.3) +
  scale_color_manual(values = pal_color) +
  scale_linetype_manual(values = pal_lty) +
  scale_fill_manual(values = col2f) +
  labs(y = "var [mg/l]", x = "") +
  theme_light() +
  theme(
    text = element_text(size = 18),
    axis.text = element_text(colour = "black", size = 20),
    legend.text = element_text(size = 22)
  )

在此處輸入圖像描述

更新基於包含您想要的結果圖像的編輯,我們必須進行一些調整,基本上是您的原始方法和我的方法的混合。 首先,堅持使用color=model以便我們得到一個顏色/填充圖例,同時顯示色帶和實線。 要修復 l.netype 圖例,請設置中斷(和標簽),以便圖例中僅顯示基准線。 此外,我們必須通過 guide_legend 的override.aes參數將guide_legend修改為 l.netype 圖例:

注意:我還修復了 livetypes。 我選擇了"dashed" ,但仔細一看恕我直言,它應該是22

library(ggplot2)

pal_lty <- rep(c("solid", "22"), 2)

names(pal_lty) <- c("model1.a_sc1", "model1.bench", "model2.a_sc1", "model2.bench")

ggplot(data = mydata2, aes(x = year)) +
  geom_ribbon(aes(ymin = q1, ymax = q9, fill = model), linetype = 0, alpha = 0.2, na.rm = TRUE) +
  geom_ribbon(aes(ymin = q3, ymax = q7, fill = model), linetype = 0, alpha = 0.2, na.rm = TRUE) +
  geom_line(aes(
    x = year, y = q5,
    color = model,
    linetype = paste(model, scenario, sep = ".")
  ), size = 1.3) +
  scale_color_manual(values = col2) +
  scale_linetype_manual(
    values = pal_lty,
    breaks = c("model1.bench", "model2.bench"),
    labels = c("Bench_model1", "Bench_model2"),
    guide = guide_legend(override.aes = list(color = col2))
  ) +
  scale_fill_manual(values = col2f) +
  labs(y = "var [mg/l]", x = "", linetype = "Bench") +
  theme_light() +
  theme(
    text = element_text(size = 18),
    axis.text = element_text(colour = "black", size = 20),
    legend.text = element_text(size = 22)
  )

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM