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

时间:2016-04-19 19:33:16

标签: r ggvis

我正在创建一个堆叠的条形图,其中有多条水平线穿过它。这是在一个闪亮的应用程序中完成的。用户选择一个选项,根据它的不同,可以有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(),它每次看起来都不同)。

enter image description here

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

我有一个长形式的df2的原因是因为用户可以选择一个可以创建2个以上水平线的选项。我不想使用if和else来控制它。在我的实际代码中,df1和df2都是被动的。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以在{y}变量上分组layer_paths数据集,以便为每个组分别绘制水平线。

为此,您可以使用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)

enter image description here