【问题标题】:R ggplot facet_wrap y ticks on different sidesR ggplot facet_wrap y 在不同的侧面打勾
【发布时间】:2017-08-25 09:40:07
【问题描述】:

出于某种原因,我必须制作一个看起来或多或少像这样的情节:

为此,我使用以下代码:

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 应该保持在原来的位置,但鳍状肢和驴应该出现在右侧侧以避免左右面板之间的间隙),但我找不到这样做的方法。

【问题讨论】:

    标签: r ggplot2 facet-wrap


    【解决方案1】:

    这是一个利用 ggplot 的 sec.axis 参数的 hack,它创建了一个与主轴相反的辅助轴,并且必须是它的一对一映射。我称之为 hack,因为这仅适用于连续轴,因此我们需要将分类 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())
    

    【讨论】:

      【解决方案2】:

      我相信这会成功。

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

      【讨论】:

      • 感谢您的解决方案,但在我看来,它在解决我遇到的问题时产生了新的美学问题:图形区域不相等,对我来说是一个真正的缺点。我希望在 ggplot 中找到一个解决方案,以保留其中的所有优点。
      • 我明白,但是您可以传递更多参数,例如图表的大小,以满足您的审美需求。
      猜你喜欢
      • 2016-03-12
      • 2021-07-05
      • 1970-01-01
      • 2019-05-09
      • 2020-11-09
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多