首页 > 解决方案 > 如何在 R 中为 ggplot 添加图例?

问题描述

我在 R 中使用带有 3 个变量的数据框。我想根据第三个变量(AmtX)将(ggplot)2个变量(CMod4X和CMod5X)绘制为两条不同的线。最后,我成功地创建了某种适合我的图表,但我没有包含图例。我已经在这里咨询了其他一些线索,但答案似乎对我不起作用。

(人工)数据集如下所示

AmtX <- seq(from = 1, to = 10001, by = 50)
CMod4X <- rnorm(201, mean = 0.87, sd = 0.01)
CMod5X <- rnorm(201, mean = 0.84, sd = 0.01)
EvalAmtX <- as.data.frame(cbind(AmtX,CMod4X,CMod5X))

我做了这样的情节

pltX <- ggplot(data = EvalAmtX, aes (x = AmtX)) + 
        geom_line(aes(y = CMod4X), color = "red", show.legend = TRUE) +
        geom_line(aes(y = CMod5X), color = "blue", show.legend = TRUE) +
        geom_smooth(aes(y = CMod4X), color = "red", se = FALSE, show.legend = TRUE) +
        geom_smooth(aes(y = CMod5X), color = "blue", se = FALSE, show.legend = TRUE) +
        labs(y = "C-index", x = "Amount (Tau)", title = "model 4 and model 5") +
        scale_colour_manual(name = "Models", values = c("CMod4" = "red", "CMod5" = "blue"))
pltX

但是这个情节不会包含标签。我在下面包含了我的情节:

我获得的情节可以在这里看到

我做错了什么,我必须做什么才能获得一个告诉我红线是 CMod4 而蓝线是 CMod5 的情节?

谢谢你的帮助!!伦纳德

标签: rggplot2legend

解决方案


我想您需要更深入地了解其ggplot2工作原理,因为您的问题与数据框的基本设置有关。关于这个主题有很多很棒的资源,例如这个。无论如何,这里有两种将图例放入图表的解决方案。

解决方案 1:将数据帧重新排列为长格式

library(reshape2)
df <- melt(data = EvalAmtX, id.vars = "AmtX")

数据框现在如下所示:

head(df)
# AmtX variable     value
# 1    1   CMod4X 0.8772716
# 2   51   CMod4X 0.8524197
# 3  101   CMod4X 0.8686019
# 4  151   CMod4X 0.8638835
# 5  201   CMod4X 0.8674627
# 6  251   CMod4X 0.8729925

现在,绘图很容易。无需告诉ggplot2每条线的颜色,您只需向其提供数据框中的哪一列包含应确定线颜色的因素的信息。因此,您添加了另一种美学 ( col = variable)。这也会自动添加颜色图例。

ggplot(df, aes(x=AmtX, y=value, col = variable)) +
  geom_line()

解决方案 2:使用手动色标

你几乎在你的代码中得到了它。

pltX <- ggplot(data = EvalAmtX, aes (x = AmtX)) + 
    geom_line(aes(y = CMod4X, color = "CMod4")) +
    geom_line(aes(y = CMod5X, color = "CMod5")) +
    geom_smooth(aes(y = CMod4X, color = "CMod4"), se = FALSE) +
    geom_smooth(aes(y = CMod5X, color = "CMod5"), se = FALSE) +
    labs(y = "C-index", x = "Amount (Tau)", title = "model 4 and model 5") +
    scale_colour_manual(name = "Models", values = c(CMod4 = "red", CMod5 = "blue"))
pltX

推荐阅读