将因子特定颜色添加到R中的截止线

时间:2016-10-17 14:32:25

标签: r ggplot2

我目前正在编写一个函数来制作某个情节。该图将特定于组的相对平均偏差(分别为效应大小)与大样本平均值进行比较,并将每组的总体平均偏差显示为水平线。我已经研究了如何为绘图中的组获取​​不同的颜色,但是我不能让这些颜色也以组特定颜色着色。

以下是一些示例数据:

a <- c(runif(10))
names(a) <- c(paste0("v", 1:10))
b <- c(runif(10))
names(b) <- c(paste0("v", 1:10))
c <- c(runif(10))
names(c) <- c(paste0("v", 1:10))

dev_list <- list(a,b,c)
names(dev_list) <- c("group1", "group2", "group3")

首先我融化数据:

require(reshape2)
df_aux <- data.frame(matrix(unlist(dev_list), nrow=length(dev_list), byrow=T), class = c(names(dev_list)))
colnames(df_aux) <- c(c(paste0("v", 1:10)), "class")
df_melt <- melt(df_aux)

然后我为截止线创建一个数据框:

ml_list <- mapply(function(A, B) {
  list(data.frame( x = c(-Inf, Inf), y = mean(A), cutoff = factor(paste(B, "Mean Deviation", sep = " "))))
}, dev_list, c(names(dev_list)))

然后我绘制数据:

require(ggplot2)
p <- ggplot(df_melt, aes(variable, value)) + geom_point(aes(colour = class))

到目前为止,这么好,但是当我现在插入行时,我不知道如何再次引用类变量来定义行的颜色。到目前为止我的代码:

p <- p + lapply(ml_list, function(z) {geom_line(aes(x,y, linetype = cutoff), z)})

之后的情节p看起来像这样:

Link to the plot as apparently I cannot include it in the post yet

我已经尝试将相同的colour = class放在geom_line的内部,但它没有用。我也试过使用How to assign colors to categorical variables in ggplot2 that have stable mapping?中解释的一些技巧,但我无法工作。

任何人都可以帮助我使用正确的颜色规范,以便我的最后一行代码以与绘图相同的方式使用类变量的颜色吗?

提前致谢!

编辑:如果其他人需要这样做:要使Brandon解决方案正常工作,您需要在上面ml_list中包含颜色定义变量。

新代码行:

ml_list <- mapply(function(A, B) {
    list(data.frame( x = c(-Inf, Inf), y = mean(A), cutoff = factor(paste(B, "Mean Deviation", sep = " ")), class = factor(paste0(B))))
    }, dev_list, c(names(dev_list)))

1 个答案:

答案 0 :(得分:1)

我认为诀窍是将内容保存为data.frame。单独添加图层有点痛苦,因为您还必须在每个apply *

处设置颜色
ml_list <- unique(do.call(rbind, ml_list)[-1])

p <- ggplot(df_melt, aes(variable, value)) + geom_point(aes(colour = class))
p + geom_hline(aes(yintercept=y, linetype = cutoff, color = cutoff), ml_list) + 
    scale_color_discrete(breaks = df_melt$class)

设置scale_color_discrete()强制演示,我认为,这个情节需要。