2016-04-19 24 views
1

分組。我正在創建一條堆疊的條形圖,其中有多條水平線穿過它。這是在一個Shiny應用程序中完成的。用戶選擇一個選項,根據它是什麼,可能有2條或3條水平線。R,ggvis從兩個數據幀繪製圖形,這兩個數據幀都需要按照

這裏是一個最小的可重複的例子:

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) 

這給了我下面的圖(它會每次都看,因爲樣本的不同())。

enter image description here

但我不想在中間的逆ž。我想要的是由df2 $ j分組的兩條平行線。但我不知道如何在我的ggvis中使用兩個數據框。

我有一個長形式的df2的原因是因爲用戶可以選擇一個可以創建2條以上水平線的選項。我不想用if和else來控制。在我的實際代碼中,df1和df2都是反應。

非常感謝您的幫助。

+0

好像你需要給'layer_paths'在'y'變量分組的數據集。 'layer_paths(data = group_by(df2,i),x =〜a,y =〜i,strokeWidth:= 2)'做你想做的事情嗎? – aosmith

+0

是的!謝謝。不知道你可以用那種方式使用group_by。很有用! – chungkim271

回答

1

您可以給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) 

enter image description here