箱图的颜色框按因子水平不同

时间:2014-05-02 18:12:09

标签: r boxplot

我认为这将是一个直接的任务,但是尽管搜索stackoverflow,文档和R-help档案我一直无法找到答案。 我需要能够根据因子值对盒子图的方框进行不同的着色。

以下简化示例显示了所需的结果:

df<-data.frame("Grp" = rep(LETTERS[1:5],each=20),"V" = rnorm(100),"F" = c(rep("a",80),rep("b",20)))
boxplot(V~Grp,df,col=c("red","red","red","red","blue"))

我需要做的是将col=c(...)替换为等同于&#34的内容;具有F="a"的框的颜色将为红色,并且具有{{1的框的颜色将是蓝色&#34;。 当然,在实际数据中,有几个因素,还有更多的Grps,等等。

任何想法都将受到赞赏。

谢谢。

2 个答案:

答案 0 :(得分:2)

ggplot2很容易做到这一点。我无法想到用基本图形做到这一点的简单方法。

我们的想法是在数据集中创建一个取决于因子的颜色变量。然后将其作为颜色属性传递给ggplot

df<-data.frame("Grp" = rep(LETTERS[1:5],each=20),"V" = rnorm(100),"F" =     c(rep("a",80),rep("b",20)))
df$boxcolor <- with(df, ifelse(F == "a", "red", "blue"))

library(ggplot2)
ggplot(df, aes(x = Grp, y = V, color = boxcolor)) + geom_boxplot()

在您的简单示例中,您可以直接将变量F作为颜色变量传递,让ggplot为您选择颜色。我不知道这是否会扩展到更复杂的问题。

ggplot(df, aes(x = Grp, y = V, color = F)) + geom_boxplot()    

答案 1 :(得分:1)

df<-data.frame("Grp" = factor(rep(LETTERS[1:5],each=20)),"V" = rnorm(100),"F" = c(rep("a",80),rep("b",20)))
boxplot(V~Grp,df,col=c("red","red","red","red","blue"))

# these are the combinations of group and F, the color-by variable    
unique(df[c('Grp','F')])
#    Grp F
# 1    A a
# 21   B a
# 41   C a
# 61   D a
# 81   E b

## you need a color vector that is the same length as the grouping variable in boxplot
(colors <- c('red','blue')[unique(df[c('Grp','F')])$F])
# [1] "red"  "red"  "red"  "red"  "blue"

# plot with a legend for F
boxplot(V ~ Grp, df, boxfill = colors)
legend('top', horiz = TRUE, fill = unique(colors), legend = levels(df$F), bty = 'n')

enter image description here