2016-04-19 8 views
1

私は、複数の水平線が走っている積み重なった棒グラフを作成しています。これは、シャイニーのアプリで行われます。ユーザーはオプションを選択し、それが何であるかに応じて、2本または3本の水平線があります。ここ R、ggvisは両方とも2つのデータフレームからグループ化する必要があります。

が最小再現可能な例である:

私に次のグラフを与える
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

しかし、私は途中で逆Zを望んでいません。私が望むのは、df2 $ jでグループ化された2つの平行な線です。しかし、私はggvisで2つのデータフレームでそれについてどうやって行くのか分かりません。

長いフォームでdf2を使用している理由は、2つ以上の水平線を作成するオプションをユーザーが選択できるためです。私はそれを制御するためにifとelseを使いたくありません。私の実際のコードでは、df1とdf2はどちらも反応です。

ありがとうございます。

+0

は思えます。 'layer_paths(data = group_by(df2、i)、x =〜a、y =〜i、strokeWidth:= 2)'あなたは何をしたいのですか? – aosmith

+0

はい!ありがとうございました。あなたはそのようにgroup_byを使うことができるか分からなかった。非常に便利! – chungkim271

答えて

1

layer_pathsデータセットをy変数にグループ化すると、水平ラインがグループごとに個別に描画されるようになります。

これを行うにはdata = df2の代わりにdata = group_by(df2, i)を使用できます。

そして、あなたのコードと、プロットは次のようになります。あなたが `y`変数にグループ化されたデータセットをlayer_paths``与える必要があるよう

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