【问题标题】:How to put multiple graphs in one plot with ggvis如何使用ggvis将多个图形放在一个图中
【发布时间】:2014-07-25 00:35:57
【问题描述】:

样本数据:

y1 = c(1,2,3,4)
y2 = c(6,5,4,3)
x  = c(1,2,3,4)
df = data.frame(x,y1,y2)

我的问题:

我想将以下两张图合二为一,使用ggvis

df %>% ggvis(~x,~y1) %>% layer_paths()
df %>% ggvis(~x,~y2) %>% layer_paths()

但是,以下方法不起作用:

df %>% ggvis(~x,~y1) %>% layer_paths() %>% ggvis(~x,~y2) %>% layer_paths()

【问题讨论】:

    标签: r ggvis


    【解决方案1】:

    您可以参考原始数据并添加一个图层:

    df %>% ggvis(~x,~y1) %>% layer_paths()%>%
      layer_paths(data = df, x = ~x, y = ~y2)
    

    您可以删除对数据的引用,它将被推断:

    df %>% ggvis(~x,~y1) %>% layer_paths()%>%
    +     layer_paths(x = ~x, y = ~y2)
    

    【讨论】:

    • 谢谢,这行得通,但很遗憾你不能使用管道语言来做到这一点。
    • 例如我希望下面的工作,但它没有:df %>% ggvis(~x,~y1) %>% layer_paths() %>% { df %>% ggvis(~x,~y2) %>% layer_paths() }
    • 您可以删除对数据的引用,它将被推断出来。我认为您所写的内容既不清晰也不直观,您将一个列表传递到一个列表并期待吗?
    • 好的,好多了,谢谢! :) 至于“你正在将一个列表传递给一个列表并期待”,我理解管道的方式是一个接一个发生的运算符的逻辑序列。从我的角度来看,我可视化管道操作的方式是明智的。
    • 所以一对 x,y 进入 ggvis,另一对进入 layer_path()。这是糟糕的 api 设计的一个很好的例子
    【解决方案2】:

    可以通过将它们的每个组件合并在一起来合并两个 ggvis:

    p1 <- df %>% ggvis(~x,~y1) %>% layer_paths()
    p2 <- df %>% ggvis(~x,~y2) %>% layer_paths()
    
    pp <- Map(c, p1, p2) %>% set_attributes(attributes(p1))
    

    我不知道它是否适用于所有情况,但它至少适用于简单的情节。

    这里有一个函数可以为你做这件事:

    merge_ggvis <- function(...) {
      vis_list <- list(...)
      out <- do.call(Map, c(list(`c`), vis_list))
      attributes(out) <- attributes(vis_list[[1]])
      out
    }
    

    您可以将它与包含绘图的对象一起使用:

    merge_ggvis(p1, p2)
    

    或在管道中:

    df %>%
      ggvis(~x, ~y1) %>% layer_paths() %>%
      merge_ggvis(
        df %>% ggvis(~x, ~y2) %>% layer_paths()
      )
    

    【讨论】:

    • 谢谢。是否可以处理不同轴的​​情况,所以 p1 是 y=y 和轴方向 = 左的 layer_points; p2 是 y=log(y) 且轴向右的 layer_lines。我可能需要发布单独的问题
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多