R,ggvis 从两个数据帧中绘制图形,这两个数据帧都需要分组

R, ggvis graphing from two data frames that both need to be grouped by

我正在创建一个包含多条水平线 运行 的堆叠条形图。这是在 Shiny 应用程序中完成的。用户选择一个选项,根据选项的不同,可能会有 2 条或 3 条水平线。

这是一个最小的可重现示例:

df1 <- data.frame(a=as.factor(rep(1:10,2)), 
                  b=sample(1:5,20, replace=T),
                  c=c(rep("apple",10), rep("banana",10)) )
df1 <- df1[order(df1$a, df1$c),]
df2 <- data.frame(a=as.factor(rep(1:10,2)),
                  i=c(rep(3,10),rep(4,10)),
                  j=c(rep("red",10), rep("green",10))  )

> df1
    a b      c
1   1 5  apple
11  1 2 banana
2   2 3  apple
12  2 3 banana
3   3 1  apple
13  3 2 banana
4   4 3  apple
14  4 1 banana
5   5 4  apple
15  5 3 banana
6   6 4  apple
16  6 2 banana
7   7 3  apple
17  7 4 banana
8   8 5  apple
18  8 1 banana
9   9 5  apple
19  9 2 banana
10 10 1  apple
20 10 3 banana
> df2
    a i     j
1   1 3   red
2   2 3   red
3   3 3   red
4   4 3   red
5   5 3   red
6   6 3   red
7   7 3   red
8   8 3   red
9   9 3   red
10 10 3   red
11 11 3   red
12  1 4 green
13  2 4 green
14  3 4 green
15  4 4 green
16  5 4 green
17  6 4 green
18  7 4 green
19  8 4 green
20  9 4 green
21 10 4 green
22 11 4 green

ggvis(data=df1, x=~a, y=~b) %>%
    group_by(c) %>%
    layer_bars(fill=~c) %>%
    layer_paths(data=df2, x=~a, y=~i, strokeWidth:=2)

这给了我下图(由于 sample() 每次看起来都不一样)。

但我不想要中间的反 Z。我想要的是按 df2$j 分组的两条平行线。但是我不确定如何在我的 ggvis 中使用两个数据框来解决这个问题。

我使用长格式的 df2 的原因是用户可以选择一个选项来创建超过 2 条水平线。我不想使用 if 和 else 来控制它。在我的实际代码中,df1 和 df2 都是反应式的。

提前感谢您的帮助。

您可以给 layer_paths 一个根据您的 y 变量分组的数据集,以便为每个组分别绘制水平线。

为此,您可以使用 data = group_by(df2, i) 而不是 data = df2

你的代码和情节看起来像:

ggvis(data=df1, x=~a, y=~b) %>%
    group_by(c) %>%
    layer_bars(fill=~c) %>%
    layer_paths(data = group_by(df2, i), x = ~a, y = ~i, strokeWidth:=2)