2017-07-14 91 views
0

我想循環使用ggplot2和purrr :: map()與split()結合的許多圖。我可以讓這些圖很好地工作,但是我無法提取分割值作爲標題。ggplot2和purrr:使用split()循環並引用索引值

令牌數據:

y=tibble(SplitVar=rep(c('A','B','C'),3), 
     Variable=c(rep('A',3),rep('B',3),rep('C',3)), 
     Value=runif(n=9)) 

我想要的曲線是由產生:

y%>%split(y$SplitVar)%>%map(~ggplot(.,aes(Variable,Value,fill=Variable))+ 
          geom_col(position='dodge')) 

Sample Output Plot

,但我無法弄清楚如何獲得SplitVar值 'A' ,'B','C'被提取以用作:

...+labs(title=...) 

我可以直接提取值:

y%>%split(y$SplitVar)%>%names(.) 
[1] "A" "B" "C" 

但是當我試圖把它添加到地塊,

y%>%split(y$SplitVar)%>%map(~ggplot(.,aes(Variable,Value,fill=Variable))+ 
          geom_col(position='dodge')+ 
          labs(title=names(.))) 

我得到: 與變量的名稱,而不是

編輯: 我的A的數據值實際上嵌套了第二個拆分值。我現在可以獲取我需要的標籤,但是我無法獲得一個映射函數來爲第一個值插入嵌套循環並生成繪圖,然後退出其他因素。修改後的輸入如下:

y%>%split(y$Split1)%>%map(~if(.$Split1=='A') split(.,.$Split2,drop=TRUE) else .) 

但我能拿出最好單獨定義兩個程序:

y[[1]]%>%map(~ggplot(.,aes(Variable,Value,fill=Variable))+ 
      geom_col(position='dodge')+ 
      labs(title=unique(.x$Split2))) 

y2=y%>%filter(Split1!='A') 
y2%>%split(y2$Split1,drop=TRUE)%>%map(~ggplot...) 

y=tibble(Split1=c(rep('A',9),rep('B',3),rep('C',3)), 
    Split2=c(rep(c('A','B','C'),3),rep('D',3),rep('E',3)), 
    Var=c(rep('A',3),rep('B',3),rep('C',3),rep(c('A','B','C'),2)), 
    Value=runif(15) 
    ) 

我可以用tibble拆分成相應的嵌套列表

回答

1

這對我有用:

y %>% 
    split(y$SplitVar) %>% 
    map(~ggplot(.,aes(Variable,Value,fill=Variable))+ 
         geom_col(position='dodge')+ 
         labs(title=unique(.x$SplitVar))) 
+0

非常好,謝謝你的快速回復。我不熟悉.x和.y語法,所以我會做一些閱讀和實驗! – scs217

+1

如果您想在'map'語句中引用數據本身,請使用'.x'。你也可以使用'map2',比如@Aurele,在這種情況下數據仍然是'.x',第二個變量'names(。)'被'.y'引用。 – CPak

+0

我通過我的應用程序工作,發現一個複雜:y $ SplitVar [1]實際上有自己的水平SplitVar2,但它是唯一一個這樣的方式。 我已經得到代碼來創建一個嵌套爲'A'的列表,但我找不到一個乾淨的方法只有'A'的map()步驟進入嵌套列表,然後退出並繪製爲通常用於其他例子。 我已經花了最近2個小時的時間進行調試,只要有機會,我會盡快更新樣本數據。 – scs217

0

也許這樣做:

y %>% 
    split(y$SplitVar) %>% 
    map2(
    names(.), 
    ~ ggplot(.x,aes(Variable,Value,fill=Variable))+ 
     geom_col(position='dodge')+ 
     labs(title= .y))