R ggvis来自单个数据框的多个图

R ggvis multiple plots from single data frame

我已经搜索过了,如有遗漏请见谅

假设一个包含姓名、日期、卡路里的数据框,其中卡路里是该人当天消耗的卡路里总数。

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  

一种选择是使用 dodplyr 中的 do 函数可用于 return object 这样的函数,并允许您轻松地为每个函数绘制单独的图一些分组变量的水平。

对于您的基本示例,您只需使用所需的绘图编辑您的函数,但将数据集作为唯一参数。

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

然后将您的数据集分组,并通过 do 每组绘制一个图。 . 指的是每个组的数据集。我将包含绘图列表的输出列命名为 plots

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

结果 object 如下所示:

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

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

要连续打印所有绘图到绘图window,您只需要运行 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)))