2017-04-09 4 views
2

의 여러 요인에 의해 패 시팅은 내가 Rggplotgeom_boxplotfacetted 방식으로 그릴려고하는 data.frame이 두 가지 요소가이 예에서색상 및 ggplot

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 싶습니다

facet.factors <- c("group","cycle") 
for(f in 1:length(facet.factors)) df[,facet.factors[f]] <- factor(df[,facet.factors[f]],levels=unique(df[,facet.factors[f]])) 
levels.vec <- sapply(facet.factors,function(f) length(levels(df[,f]))) 

그러나 다른 경우에 나는 하나 또는 두 개 이상의 요소가있을 수 있습니다.

facet_wrap에 전달할 수있는 방법은 패싯 수와 열 수의 벡터입니까? 분명히이 오류가 발생합니다

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)) 

:

Error in combine_vars(data, params$plot_env, vars, drop = params$drop) : 
    At least one layer must contain all variables used for facetting 

을 분명이 작품 : 여기에

는 추가로 내가 각 요인 수준에 대한 내 자신의 색깔을 만들어 어디 시도 무엇

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)) 

enter image description here

그러나 나는 통과하고 전설을 추가하지 않는 색상을 무시하고 colfillaestheticsvector을 전달할 수 없기 때문에 상상할 수 있으며 분명히 패싯을 하드 코딩해야합니다.

이것은 facetting 문제에 대한 중 하나가 작동하지 않습니다

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_wrap하는 벡터를 통과 할 수있는 방법이 있습니까? 2. 하나의 요인에 의한 요인 벡터로 채색하고 채우는 방법이 있습니까? facet_wrap

df$col.fill <- Reduce(paste, df[facet.factors]) 

facets 문자 벡터 또는 하나 모두 허용합니다

답변

3

우리는 색 두 가지 색상을 지정할 수 없습니다/하나의 상자로 작성, 나는 패 시팅 변수가 착색/충전 규모로 함께 붙여 넣기 할 것을 제안 양면 식 :

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) 
    ) 
,

legend.position = "none",을 추가 했으므로 범례가 표시되지 않습니다. enter image description here

알아두면 코드에 공백과 줄 바꿈을 추가하면 가독성이 향상됩니다.