r - 使用 ggplot 为手动添加的行添加图例

标签 r plot ggplot2

我正在尝试使用 ggplot 为 3 个手动添加的行添加相应的图例.我的代码如下:

library(ggplot2)
df = data.frame(error = c(0.0832544999, 0.0226680026, 0.0082536264, 0.0049199958, 0.0003917755, 0.0003859976, 0.0003888253, 0.0003953918, 0.0003958398), sDev = c(8.188111e-03, 2.976161e-03, 1.466221e-03, 2.141425e-03, 2.126976e-05, 2.139364e-05, 2.169059e-05, 2.629895e-05, 2.745938e-05))

minimum <- 6
best.model <- 5

gplot <- ggplot(df, aes(x=1:length(error), y=error)) +
             scale_x_continuous(breaks = seq_along(df$error)) +
             geom_point(size = 3) +
             geom_line() +
             geom_errorbar(data = df, aes(x = 1:length(error), ymin = error - sDev, ymax = error + sDev), 
                           width = 0.1) + 
             geom_hline(data = df, aes(yintercept = error[minimum] + sDev[minimum]), linetype = "dashed") +
             geom_vline(xintercept = minimum, linetype = "dotted", color = "red", size = 1) +
             geom_vline(xintercept = best.model, linetype = "dotted", color = "blue", size = 1) +
             theme_gray(base_size = 18) + 
             theme(axis.text = element_text(color = "black")) +
             labs(x = "# of parameters", fontface = "bold") + 
             labs(y = "CV error") +
             labs(title = "Cross-validation error curve")

enter image description here

我想知道如何为黑色、红色和蓝色的 3 条虚线添加图例。

非常感谢!

最佳答案

诀窍是使用适当的映射:

gplot <- ggplot(df, aes(x=1:length(error), y=error)) +
  scale_x_continuous(breaks = seq_along(df$error)) +
  geom_point(size = 3) +
  geom_line() +
  geom_errorbar(data = df, aes(x = 1:length(error), ymin = error - sDev, ymax = error + sDev), 
                width = 0.1) + 
  geom_hline(data = df, aes(yintercept = error[minimum] + sDev[minimum], linetype="a", colour="a")) +
  geom_vline(data= data.frame(type="b", col="b", minimum=minimum), 
             aes(linetype=type, colour=col, xintercept = minimum), size = 1, show_guide = TRUE) +
  geom_vline(data= data.frame(type="b", col="b", best.model=best.model),
             aes(linetype="c", colour="c", xintercept = best.model), size = 1, show_guide = TRUE) +
  scale_colour_manual(name="Legend", values = c("a" = "black", "b" = "red", "c" = "blue")) +
  scale_linetype_manual(name="Legend", values = c("a" = "dashed", "b" = "dotted", "c" = "dotted")) +
  theme_gray(base_size = 18) + 
  theme(axis.text = element_text(color = "black"),
        legend.key.height  = grid::unit(0.1, "npc")) +
  labs(x = "# of parameters", fontface = "bold") + 
  labs(y = "CV error") +
  labs(title = "Cross-validation error curve")

resulting plot

关于r - 使用 ggplot 为手动添加的行添加图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204758/

相关文章:

javascript - 使用 javascript 删除子元素

r - 在循环中使用scale_fill_manual()时,仅保留上次迭代中分配的颜色值

r - 如何将零件一张一张地添加到 Shiny 的图形中

javascript - 在 rMaps 中使用 ichoropleth 函数绘制其他国家

r - 散点图点子集颜色形状 ifelse

r - 使用scale_x_datetime和时间数据设置限制

r - 标记 geom_points,但不是全部

netbeans - R 有没有好的 Netbeans 插件?

r - 忽略数字符号对 R 中的列进行排序

r - 如何缩短heatmap.2()中ColSideColors的高度