簡體   English   中英

如何將圖例添加到具有多個組的 ggplot 中,這些組在 dataframe 中具有多列數據

[英]How do I add a legend to a ggplot with multiple groups that have multiple columns of data in a dataframe

我有一個 60x13 dataframe 包含 4 組數據,1 列是 1-60 個月的時間,1 列是時間點 n 的中值,2 是時間點 n 的可信區間。 我想生成一個 plot,隨着時間的推移,中位數為實線,置信區間為虛線,我已經能夠通過將每列添加為自己的 geom_line 並通過匹配中位數的顏色手動分組來實現以及它們相應的可信區間,但是,我無法添加圖例。 任何幫助將不勝感激。

ggplot(data=data1, 
       aes(x=month)) +
  xlab("Month") +
  ylab("Hazard Ratio") +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_line(aes(y=median),
            color = "#4682B4",
            size = 1) +
  geom_line(aes(y=ucrd),
            color = "#4682B4",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=lcrd),
            color = "#4682B4",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=median.1),
            color = "#4BB446",
            size = 1) +
  geom_line(aes(y=ucrd.1),
              color = "#4BB446",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=lcrd.1),
            color = "#4BB446",
            linetype=2,
            size = 0.9,
            alpha=0.5) + 
  geom_line(aes(y=median.2),
          color = "#AF46B4",
          size = 1) +
  geom_line(aes(y=ucrd.2),
            color = "#AF46B4",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=lcrd.2),
            color = "#AF46B4",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=median.3),
            color = "#B47846",
            size = 1) +
  geom_line(aes(y=ucrd.3),
            color = "#B47846",
            linetype=2,
            size = 0.9,
            alpha=0.5) +
  geom_line(aes(y=lcrd.3),
            color = "#B47846",
            linetype=2,
            size = 0.9,
            alpha=0.5)
scale_color_manual(name= "Treament",
                     values=c("4682B4", "4BB446", "AF46B4", "B47846"),
                       labels=c("a", 
                                "b",
                                "c",
                                "d"
                       ))




這聽起來很像數據形狀問題。 由於沒有提供數據,這里是一個帶有虛擬數據的示例。 首先,我們生成一些大致與您在文本中提到的形狀相同的數據。

library(tidyr)
library(ggplot2)

n <- 60
df <- data.frame(
  time = seq_len(n),
  group1_median = rnorm(n),
  group1_low = rnorm(n, -2),
  group1_high = rnorm(n, 2),
  group2_median = rnorm(n),
  group2_low = rnorm(n, -2),
  group2_high = rnorm(n, 2),
  group3_median = rnorm(n),
  group3_low = rnorm(n, -2),
  group3_high = rnorm(n, 2),
  group4_median = rnorm(n),
  group4_low = rnorm(n, -2),
  group4_high = rnorm(n, 2)
)

現在,我們將把它從寬格式重塑為長格式。 下面的 function 應該是什么樣子在很大程度上取決於數據的列名。 我選擇虛擬數據列名稱非常簡單。

df <- pivot_longer(
  df, -time,
  names_to = c("group", "metric"),
  names_sep = "_"
)

因為medianlowhigh現在被視為單獨的觀察值,我們需要再次重塑數據以使其稍微寬一些。

df <- pivot_wider(
  df, names_from = "metric"
)

然后將它放入ggplot2中的形狀相當不錯,傳奇將自行解決。

ggplot(df, aes(time, colour = group)) +
  geom_line(aes(y = median)) +
  geom_ribbon(aes(ymin = low, ymax = high),
              linetype = 2, fill = NA)

在此處輸入圖像描述

如果有人有更合適的重塑策略,我很想聽聽他們,因為我還在正確地學習 pivot。

暫無
暫無

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

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