首页 > 解决方案 > 如何将图例添加到具有多个组的 ggplot 中,这些组在数据框中具有多列数据

问题描述

我有一个包含 4 组数据的 60x13 数据框,1 列是 1-60 个月的时间,1 列是时间点 n 的中值,2 是时间点 n 的可信间隔。我想生成一个图,其中中位数为实线,置信区间为虚线,我已经能够通过将每列添加为它自己的 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"
                       ))




标签: rggplot2plot

解决方案


这听起来很像数据形状问题。由于没有提供数据,这里是一个带有虚拟数据的示例。首先,我们生成一些大致与您在文本中提到的形状相同的数据。

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)
)

现在,我们将把它从宽格式重塑为长格式。下面的函数究竟应该是什么样子,很大程度上取决于数据的列名。我选择虚拟数据列名称非常简单。

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

因为median,lowhigh现在被视为单独的观察,我们需要再次重塑数据以使其稍微宽一些。

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)

在此处输入图像描述

如果有人有更合适的重塑策略,我很想听听他们,因为我还在学习正确的旋转。


推荐阅读