2017-08-25 48 views
1

出于某种原因,蜱,我不得不做出一个情节,看起来或多或少是这样的: enter image description here[R ggplot facet_wrapŸ在不同的侧面

为此,我使用下面的代码:

library(ggplot2) 
library(tidyverse) 
set.seed(10) 
df<-data.frame(Meas = runif(1000,0,10), 
       Prop1 = sample(x = LETTERS[1:3],1000,replace=TRUE), 
       Prop2 = sample(x = letters[1:5],1000,replace=TRUE), 
       Prop3 = sample(x=c("monkey","donkey","flipper"),1000,replace=TRUE))%>% 
    gather(Prop,Propvalue,-Meas) 

ggplot(df,aes(x = Propvalue,y=Meas))+ 
    geom_boxplot()+ 
    facet_wrap(~Prop,ncol=2,scales="free_y")+ 
    coord_flip() 

我相信如果右图上的y-ticks出现在右边(对于左边的图表,y-ticks应该保持在原来的位置,但是右边应该出现脚蹼和驴子以避免左边和右边的面板之间的差距),但我找不到一种方法来做到这一点。

回答

1

下面是利用ggplot的sec.axis参数,它创建了一个次级轴的主轴线&相反必须是它的一个一对一映射一劈。我称之为黑客攻击,因为这只适用于连续轴,所以我们需要将分类Propvalue映射到数值。

注意:在本例中,我假定您想在左边找到所有奇数编号的PropX构面标签,即&偶数编号的PropX构面标签。您还可以调整其他变体的选项。

library(ggplot2) 
library(tidyverse) 

# generate data 
set.seed(10) 
df<-data.frame(Meas = runif(1000,0,10), 
       Prop1 = sample(x = LETTERS[1:3],1000,replace=TRUE), 
       Prop2 = sample(x=c("monkey","donkey","flipper"),1000,replace=TRUE), 
       Prop3 = sample(x = letters[1:5],1000,replace=TRUE))%>% 
    gather(Prop,Propvalue,-Meas) 

# map Propvalue to integers, primary axis contents, & secondary axis contents. 
df2 <- df %>% 
    mutate(Propvalue.int = as.integer(factor(Propvalue, 
              levels = df %>% select(Prop, Propvalue) %>% 
              arrange(Prop, Propvalue) %>% unique() %>% 
              select(Propvalue) %>% unlist())), 
     facet.column = ifelse(as.integer(str_extract(Prop, "[0-9]")) %% 2 == 0, 2, 1), 
     Propvalue.left = ifelse(facet.column == 1, Propvalue, ""), 
     Propvalue.right = ifelse(facet.column == 2, Propvalue, "")) 

# create mapping table 
integer2factor <- df2 %>% 
    select(Propvalue.int, Propvalue.left, Propvalue.right) %>% 
    unique() %>% arrange(Propvalue.int) 

ggplot(df2,aes(x = Propvalue.int, y=Meas, 
       group = Propvalue.int))+ 
    geom_boxplot() + 
    scale_x_continuous(breaks = integer2factor$Propvalue.int, 
        labels = integer2factor$Propvalue.left, 
        name = "Propvalue", 
        sec.axis = dup_axis(breaks = integer2factor$Propvalue.int, 
             labels = integer2factor$Propvalue.right, 
             name = "")) + 
    facet_wrap(~Prop,ncol=2,scales="free")+ 
    coord_flip() + 
    theme(axis.ticks.y = element_blank()) 

facet wrap plot

1

我相信这会做到这一点。

library(ggplot2) 
library(tidyverse) 
library(tidyr) 

set.seed(10) 
df <-data.frame(Meas = runif(1000,0,10), 
       Prop1 = sample(x = LETTERS[1:3],1000,replace=TRUE), 
       Prop2 = sample(x = letters[1:5],1000,replace=TRUE), 
       Prop3 = sample(x=c("monkey","donkey","flipper"),1000,replace=TRUE))%>% 
    gather(Prop,Propvalue,-Meas) 

ggplot(df,aes(x = Propvalue,y=Meas))+ 
    geom_boxplot()+ 
    facet_wrap(~Prop,ncol=2,scales="free_y")+ 
    coord_flip() 


    p.list = lapply(sort(unique(df$Prop)), function(i) { # i <- "Prop1" 
    ggplot(df[df$Prop==i,],aes(x = Propvalue, y=Meas))+ 
    geom_boxplot()+ 
    facet_wrap(~Prop,scales="free_y")+ 
    coord_flip() 
}) 


    p.list[[2]] <- p.list[[2]] + scale_x_discrete(position = "top") 


library(gridExtra) 
do.call(grid.arrange, c(p.list, nrow=2)) 

enter image description here

+0

谢谢你的解决方案,但在我看来,它会在解决我有问题,新的美学问题:图形的面积不相等,对我来说是一个真正的缺点。我希望在ggplot中有一个解决方案,以保持它的好处。 – Dries

+0

我明白,但是你可以通过更多的参数,比如图形的大小,以满足你的审美欲望。 –