簡體   English   中英

ggplot:如何將圖例添加到由幾個 geom_ribbon() 和 geom_line() 組成的 plot?

[英]ggplot: how to add legend to a plot composed of several geom_ribbon() and geom_line()?

問題:如何為這個特定的 plot 添加圖例?

我有

在此處輸入圖像描述

圖例應包括:

nd$y_fem - 藍線 - 在legend中應該是“5 年死亡概率”

nd$y_tre - 紅線 - 在legend中應該是“3 年死亡概率”

nd$y_et - 綠線 - 在legend中應為“1 年死亡概率”

最好, legend應包括linefill

如何才能做到這一點?

ggplot(nd, aes(x=n_fjernet))  +
  geom_ribbon(aes(ymin = y_tre, ymax = y_fem), alpha = .15, fill="#2C77BF") +
  geom_line(aes(y=y_fem), size=3, color="white") +  
  geom_line(aes(y=y_fem), color="#2C77BF", size=.85) + 

  geom_ribbon(aes(ymin = y_et, ymax = y_tre), alpha = .15, fill="#E38072") +     
  geom_line(aes(y=y_tre), size=3, color="white") + 
  geom_line(aes(y=y_tre), color="#E38072", size=.85) +

  geom_ribbon(aes(ymin = 0, ymax = y_et), alpha = .15, fill="#6DBCC3") + 
  geom_line(aes(y=y_et), size=3, color="white") +
  geom_line(aes(y=y_et), color="#6DBCC3",  size=.85) + 

  scale_x_continuous(breaks = seq(0,10,2), limits=c(0,10)) 

我的數據

nd <- structure(list(y_et = c(0.473, 0.473, 0.472, 0.471, 0.471, 0.47, 
0.47, 0.469, 0.468, 0.468, 0.467, 0.467, 0.466, 0.465, 0.465, 
0.464, 0.464, 0.463, 0.462, 0.462, 0.461, 0.461, 0.46, 0.459, 
0.459, 0.458, 0.458, 0.457, 0.456, 0.456, 0.455, 0.455, 0.454, 
0.453, 0.453, 0.452, 0.452, 0.451, 0.45, 0.45, 0.449, 0.449, 
0.448, 0.447, 0.447, 0.446, 0.446, 0.445, 0.445, 0.444, 0.443, 
0.443, 0.442, 0.442, 0.441, 0.44, 0.44, 0.439, 0.439, 0.438, 
0.438, 0.437, 0.436, 0.436, 0.435, 0.435, 0.434, 0.433, 0.433, 
0.432, 0.432, 0.431, 0.431, 0.43, 0.429, 0.429, 0.428, 0.428, 
0.427, 0.427, 0.426, 0.425, 0.425, 0.424, 0.424, 0.423, 0.423, 
0.422, 0.421, 0.421, 0.42, 0.42, 0.419, 0.419, 0.418, 0.417, 
0.417, 0.416, 0.416, 0.415), y_tre = c(0.895, 0.894, 0.894, 0.893, 
0.893, 0.893, 0.892, 0.892, 0.891, 0.891, 0.89, 0.89, 0.889, 
0.889, 0.889, 0.888, 0.888, 0.887, 0.887, 0.886, 0.886, 0.886, 
0.885, 0.885, 0.884, 0.884, 0.883, 0.883, 0.882, 0.882, 0.881, 
0.881, 0.881, 0.88, 0.88, 0.879, 0.879, 0.878, 0.878, 0.877, 
0.877, 0.876, 0.876, 0.875, 0.875, 0.875, 0.874, 0.874, 0.873, 
0.873, 0.872, 0.872, 0.871, 0.871, 0.87, 0.87, 0.869, 0.869, 
0.868, 0.868, 0.867, 0.867, 0.866, 0.866, 0.865, 0.865, 0.865, 
0.864, 0.864, 0.863, 0.863, 0.862, 0.862, 0.861, 0.861, 0.86, 
0.86, 0.859, 0.859, 0.858, 0.858, 0.857, 0.857, 0.856, 0.856, 
0.855, 0.855, 0.854, 0.854, 0.853, 0.853, 0.852, 0.852, 0.851, 
0.851, 0.85, 0.85, 0.849, 0.848, 0.848), y_fem = c(0.974, 0.974, 
0.973, 0.973, 0.973, 0.973, 0.973, 0.973, 0.972, 0.972, 0.972, 
0.972, 0.972, 0.971, 0.971, 0.971, 0.971, 0.971, 0.971, 0.97, 
0.97, 0.97, 0.97, 0.97, 0.969, 0.969, 0.969, 0.969, 0.969, 0.968, 
0.968, 0.968, 0.968, 0.968, 0.967, 0.967, 0.967, 0.967, 0.967, 
0.966, 0.966, 0.966, 0.966, 0.966, 0.965, 0.965, 0.965, 0.965, 
0.965, 0.964, 0.964, 0.964, 0.964, 0.963, 0.963, 0.963, 0.963, 
0.963, 0.962, 0.962, 0.962, 0.962, 0.961, 0.961, 0.961, 0.961, 
0.961, 0.96, 0.96, 0.96, 0.96, 0.959, 0.959, 0.959, 0.959, 0.958, 
0.958, 0.958, 0.958, 0.957, 0.957, 0.957, 0.957, 0.957, 0.956, 
0.956, 0.956, 0.956, 0.955, 0.955, 0.955, 0.955, 0.954, 0.954, 
0.954, 0.954, 0.953, 0.953, 0.953, 0.952), n_fjernet = c(0, 0.1, 
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 
1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 
2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.1, 5.2, 5.3, 
5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 
6.7, 6.8, 6.9, 7, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 
8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9, 9.1, 9.2, 
9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9)), row.names = c(NA, -100L), class = c("data.table", 
"data.frame"))

ggplot中,圖例是根據您設置的比例生成的,以識別數據中的分組或值。 您已經分別繪制了每個功能區和線條,因此沒有將它們捆綁在一起的比例可以自動生成圖例。

我明白你為什么這樣做 - 你的變量都在不同的列中,而不是在單個列中的變量。 這是最好使用pivot_longer中的tidyr將數據轉換為長格式以進行繪圖的場合之一。

為了簡化數據整理,您可以使用堆疊區域 plot,而不是使用功能區。 這需要您修改輸入數據,我們可以使用mutate輕松完成:

library(dplyr)
library(tidyr)
library(ggplot2) 

my_labels <- c("5 year probability of death",
               "3 year probability of death",
               "1 year probability of death")

df <- mutate(nd, y_fem = y_fem - y_tre, y_tre = y_tre - y_et) %>%
  tidyr::pivot_longer(1:3) %>% 
  mutate(name = factor(name, levels = c("y_fem", "y_tre", "y_et")))

  ggplot(df, aes(x=n_fjernet, y = value, colour = name, group = name))  +
  geom_area(aes(fill = name), position = "stack", alpha = 0.15) +
  geom_line(colour = "white", size = 3, position = "stack") +
  geom_line(position = "stack") +
  geom_point(position = "stack", data = df[c(1:3, -2:0 + nrow(df)), ]) +
  scale_fill_manual(values = c("#2C77BF", "#E38072", "#6DBCC3"),
                    labels = my_labels) +
  scale_colour_manual(values = c("#2C77BF", "#E38072", "#6DBCC3"),
                      labels = my_labels)

在此處輸入圖像描述

請注意,plot 與示例一不同:提供的數據僅適用於 plot 的最左側部分。

暫無
暫無

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

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