r - geom_vline() 图例的位置发生变化

标签 r ggplot2 legend

我有几个像下面这样的图。我的问题是,geom_vline()(类型)的图例在图之间移动,有时出现在“平均”图例上方,有时出现在下方。

如何指定 geom_vline() 图例(或其他图例)的位置,以便我的论文中的各个图不会出现变化?

set.seed(1234)
data <- data.frame(value = rnorm(n = 10000, mean = 50, sd = 20),
                   Type = sample(letters[1:2], size = 10000, replace = TRUE))
data$value[data$Type == "b"] <- data$value[data$Type == "b"] +
    rnorm(sum(data$Type == "b"), mean = 55)

gp <- ggplot(data = data, aes_string(x = "value"))
gp <- gp + geom_density(aes_string(fill = "Type"), alpha = 0.3)

vlines <- data.frame(value = c(mean(data$value[data$Type == "a"]),
                               mean(data$value[data$Type ==  "b"])), 
                     Mean = c("A", "B"))

gp2 <- gp + geom_vline(data = vlines, aes(xintercept = value, colour = Mean),
                       size = 1.05, linetype = "dashed", show.legend = TRUE)
gp3 <- gp2 + geom_vline(xintercept = (50 + 55 + 50) / 2, size = 1.05)

gp3

最佳答案

您可以将 guide_legendorder 参数传递给 scale_* 函数的 guide 参数您想要重新排列的指南。例如:

library(ggplot2)
set.seed(1234)

data <- data.frame(value = rnorm(n = 10000, mean =50, sd = 20),
                   Type = sample(letters[1:2], size = 10000, replace = TRUE))
data$value[data$Type == "b"] <- data$value[data$Type == "b"] +
    rnorm(sum(data$Type == "b"), mean = 55)

vlines <- data.frame(value = c(mean(data$value[data$Type == "a"]),
                               mean(data$value[data$Type ==  "b"])), 
                     Mean = c("A", "B"))

ggplot(data, aes(x = value)) + 
    geom_density(aes(fill = Type), alpha = 0.3) + 
    geom_vline(data = vlines, aes(xintercept = value, colour = Mean),
               size = 1.05, linetype = "dashed", show.legend = TRUE) + 
    geom_vline(xintercept = (50 + 55 + 50) / 2, size = 1.05) + 
    scale_fill_discrete(guide = guide_legend(order = 1)) +    # fill first
    scale_color_discrete(guide = guide_legend(order = 2))     # color second

ggplot(data, aes(x = value)) + 
    geom_density(aes(fill = Type), alpha = 0.3) + 
    geom_vline(data = vlines, aes(xintercept = value, colour = Mean),
               size = 1.05, linetype = "dashed", show.legend = TRUE) + 
    geom_vline(xintercept = (50 + 55 + 50) / 2, size = 1.05) + 
    scale_fill_discrete(guide = guide_legend(order = 2)) +    # now fill second
    scale_color_discrete(guide = guide_legend(order = 1))     # and color first

关于r - geom_vline() 图例的位置发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43604233/

相关文章:

r - Rcpp糖中的rep_each

r - 如何用 ggplot2 中的图例替换 x 值?

r - 为 geom_polygon 添加图例

r - 如何将适用于 data.frame 单元格的函数应用于 data.frame 列

r - dataframe[ ,-1] 和 dataframe[-1] 是一样的吗?

返回选定的函数参数

r - 如何用箭头和最大值注释线图?

r - 在 ggplot2 上覆盖 ggmap 、 geom_polygon(shape file)

jquery - JqPlot 1.0 如何创建带有日期轴和图例的折线图

r - 在 R 中使用 ggplot 包制作的图中裁剪额外的空白区域