R ggplot中多因素的颜色和刻面

R ggplot中多因素的颜色和刻面,r,ggplot2,factors,facet-wrap,R,Ggplot2,Factors,Facet Wrap,我有一个data.frame,我正试图用R的ggplot的geom\u boxplot以faceted的方式绘制它: set.seed(1) vals <- rnorm(12) min.vals <- vals-0.5 low.vals <- vals-0.25 max.vals <- vals+0.5 high.vals <- vals+0.25 df <- data.frame(sample=c("c0.A_1","c0.A_2","c1.A_1",

我有一个
data.frame
,我正试图用
R
ggplot
geom\u boxplot
faceted
的方式绘制它:

set.seed(1)

vals <- rnorm(12)
min.vals <- vals-0.5
low.vals <- vals-0.25
max.vals <- vals+0.5
high.vals <- vals+0.25


df <- data.frame(sample=c("c0.A_1","c0.A_2","c1.A_1","c1.A_2","c2.A_1","c2.A_2","c0.B_1","c0.B_2","c1.B_1","c1.B_2","c2.B_1","c2.B_2"),
                 replicate=rep(c(1,2),6),val=vals,min.val=min.vals,low.val=low.vals,max.val=max.vals,high.val=high.vals,
                 group=c(rep("A",6),rep("B",6)),cycle=rep(c("c0","c0","c1","c1","c2","c2"),2),
                 stringsAsFactors = F)
但在其他情况下,我可能只有一个或两个以上的因素

是否有一种方法可以传递到
facet\u wrap
facet所依据的因子向量和列数

以下是我尝试过的,除此之外,我还为每个因素级别创建了自己的颜色:

library(RColorBrewer,quietly=T)
library(scales,quietly=T)
level.colors <- brewer.pal(sum(levels.vec),"Set2")

require(ggplot2)
ggplot(df,aes_string(x="replicate",ymin="min.val",lower="low.val",middle="val",upper="high.val",ymax="max.val",col=facet.factors,fill=facet.factors))+
  geom_boxplot(position=position_dodge(width=0),alpha=0.5,stat="identity")+
  facet_wrap(~facet.factors,ncol=max(levels.vec))+
  labs(x="Replicate",y="Val")+
  scale_x_continuous(breaks=unique(df$replicate))+
  scale_color_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+scale_fill_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+
  theme_bw()+theme(legend.position="none",panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=8))
显然,这是可行的:

ggplot(df,aes_string(x="replicate",ymin="min.val",lower="low.val",middle="val",upper="high.val",ymax="max.val",col=facet.factors,fill=facet.factors))+
  geom_boxplot(position=position_dodge(width=0),alpha=0.5,stat="identity")+
  facet_wrap(group~cycle,ncol=max(levels.vec))+
  labs(x="Replicate",y="Val")+
  scale_x_continuous(breaks=unique(df$replicate))+
  scale_color_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+scale_fill_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+
  theme_bw()+theme(legend.position="none",panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=8))

但它忽略了我正在传递的颜色,也没有添加图例,我想,因为我无法将
向量
传递到
填充
美学
,显然我必须硬编码刻面

这对于镶嵌面问题也不起作用:

ggplot(df,aes_string(x="replicate",ymin="min.val",lower="low.val",middle="val",upper="high.val",ymax="max.val",col=facet.factors,fill=facet.factors))+
      geom_boxplot(position=position_dodge(width=0),alpha=0.5,stat="identity")+
      facet_wrap(facet.factors[1]~facet.factors[2],ncol=max(levels.vec))+
      labs(x="Replicate",y="Val")+
      scale_x_continuous(breaks=unique(df$replicate))+
      scale_color_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+scale_fill_manual(values=level.colors,labels=unname(unlist(sapply(facet.factors,function(f) levels(df[,f])))),name="factor level")+
      theme_bw()+theme(legend.position="none",panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=8))
因此,我的问题是: 1.有没有一种方法可以将一个向量传递给facet\u wrap?
2.有没有办法通过因子向量而不是单个因子来着色和填充?

我们不能为单个框指定两种着色/填充颜色,我建议将镶嵌面变量粘贴在一起作为着色/填充比例:

df$col.fill <- Reduce(paste, df[facet.factors])
因此,代码最终如下所示:

ggplot(df,
       aes_string(
           x = "replicate", ymin = "min.val", ymax = "max.val",
           lower = "low.val", middle = "val", upper = "high.val",
           col = "col.fill", fill = "col.fill"
       )) +
    geom_boxplot(position = position_dodge(width = 0),
                 alpha = 0.5,
                 stat = "identity") +
    facet_wrap(facet.factors, ncol = max(levels.vec)) +
    # alternatively: facet_wrap(facet.formula, ncol = max(levels.vec)) +
    labs(x = "Replicate", y = "Val") +
    scale_x_continuous(breaks = unique(df$replicate)) +
    theme_bw() +
    theme(
        #legend.position = "none",
        panel.border = element_blank(),
        strip.background = element_blank(),
        axis.title = element_text(size = 8)
    )
图例不会显示,因为您添加了
legend.position=“none”,

顺便说一句,如果在代码中添加一些空格和换行符,肯定会提高可读性

df$col.fill <- Reduce(paste, df[facet.factors])
facet.formula <- as.formula(paste('~', paste(facet.factors,  collapse = '+')))
ggplot(df,
       aes_string(
           x = "replicate", ymin = "min.val", ymax = "max.val",
           lower = "low.val", middle = "val", upper = "high.val",
           col = "col.fill", fill = "col.fill"
       )) +
    geom_boxplot(position = position_dodge(width = 0),
                 alpha = 0.5,
                 stat = "identity") +
    facet_wrap(facet.factors, ncol = max(levels.vec)) +
    # alternatively: facet_wrap(facet.formula, ncol = max(levels.vec)) +
    labs(x = "Replicate", y = "Val") +
    scale_x_continuous(breaks = unique(df$replicate)) +
    theme_bw() +
    theme(
        #legend.position = "none",
        panel.border = element_blank(),
        strip.background = element_blank(),
        axis.title = element_text(size = 8)
    )