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)
我正在创建一个包含多条水平线 运行 的堆叠条形图。这是在 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)