2015-08-17 26 views
4

我查過了,所以請原諒我,如果我失去了一些東西。R ggvis單個數據幀的多個圖

假設包含姓名,日期,卡路里,熱量食物是那個人的那一天消耗的卡路里總數數據幀。

Name Date Calories 
Amy  1/1/01 1500 
Amy  1/2/01 1600 
Amy  ...  ... 
Sue  1/1/01 1450 
Sue  1/1/02 1500 
Sue  ...  ... 
Jim  ...  ... 

我想要做的是使用ggvis來繪製每個人(名稱)的卡路里。 我知道我可以使用dplyr的group_by,並將它放在一張圖上,但那樣太忙了。而且我知道我可以使用dplyr的過濾器並過濾掉每個人,併爲每個人製作圖表,但這並不能縮放。

有沒有辦法有ggvis吐出的卡路里每天自動每個人的陰謀?

請注意,我試圖創造一個像下面的函數:

makeCharts <- function(myName){ 
    myTbl %>% filter(Name == myName) %>% ggvis(~Date, ~Calories) 
} 

它的偉大工程,當你手動調用它:

makeCharts("Amy") 

但是,當你通過sapply叫它:

sapply(levels(myTbl$Name), makeCharts) 

輸出看起來是這樣的:

  Amy Sue Jim John Sally Frank Sandy etc...  
marks  List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
data  List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 
props  List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 List,1 
reactives List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
scales  List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
axes  List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
legends List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
controls List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
connectors List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
handlers List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
options List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 List,0 
cur_data ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  
cur_props List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 List,2 
cur_vis NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 
+0

我不是很熟悉ggvis,但只有ggplot2,它有facet_ *函數 - 如果我理解正確 - 做你想做的事(http://www.cookbook-r.com/Graphs/Facets_%28ggplot2%29 /)。根據Jim Hester的ggplot2-to-ggvis頁面(http://www.jimhester.com/ggplot2ToGgvis/),這個確切的功能似乎還沒有在ggvis中實現......可能還有另一種解決方案。 – maj

+0

是的,我看到ggplot有小面,看起來不錯,我也看到哈德利帖子說它來到ggvis,但我認爲它還沒有。我真的希望學習如何用ggvis來做這件事,因爲我是R的新手,並且在繼續學習之前(dplyr和ggvis)要真正學習一些軟件包。我相信R足夠強大,可以讓我以某種方式做到這一點。 –

回答

4

一種選擇是使用do。從dplyrdo功能可用於返回對象這樣的功能,讓您輕鬆做一些分組變量的每個級別獨立的情節。

爲您簡單的例子,你只需要與期望的情節,但與數據集作爲唯一的參數編輯您的功能。

makeCharts = function(dat) { 
    dat %>% ggvis(~Date, ~Calories) 
} 

然後對您的數據集進行分組,並通過do對每組進行繪圖。 .指的是每個組的數據集。我將輸出列命名爲plots

allplots = myTbl %>% 
    group_by(Name) %>% 
    do(plots = makeCharts(.)) 

最終的目標是這樣的:

Source: local data frame [2 x 2] 
Groups: <by row> 

    Name  plots 
1 Amy <S3:ggvis> 
2 Sue <S3:ggvis> 

要打印的所有地塊的繪圖窗口一排,你只需要運行allplots$plots。您可以通過例如allplots$plots[[1]]來提取一個圖。

編輯

您可以通過.參照數據集內do使用任何從數據集。例如,如果你想與組名添加標題像this answer展示瞭如何做,你可以做一個新的功能與第二個參數,包括這個:

makeCharts2 = function(dat, group) { 
    dat %>% ggvis(~Date, ~Calories) %>% 
      add_axis("x", title = "Date") %>% 
      add_axis("x", orient = "top", ticks = 0, title = paste("Plot for", group), 
         properties = axis_props(
           axis = list(stroke = "white"), 
           labels = list(fontSize = 0))) 
} 

然後,只需添加組名稱爲函數的第二個參數。一種方法是通過unique

allplots2 = myTbl %>% 
    group_by(Name) %>% 
    do(plots = makeCharts2(., unique(.$Name))) 
+0

儘管R對使用=進行賦值的褻瀆行爲,但它工作得很完美。 =) –

+0

好吧,這工作,但我如何訪問唯一的名稱?我可以創建allplots變量,並按照您所說的打印它,但是我想在每個圖表上放置一個標題。沒有看到如何訪問該名稱以將其列爲每個圖表的標題? –

+0

@JohnTarr請參閱編輯。 – aosmith

相關問題