如何在 ggplot2 中的 fct_reorder() 中使用 NSE
How to user NSE inside fct_reorder() in ggplot2
我想知道如何在 ggplot2
中的 fct_reorder()
中使用 NSE(非标准评估)表达式来复制不同数据帧的图表。
这是我用来绘制图表的数据框示例:
travel_time_br30 travel_time_br30_int time_reduction shift not_shift total
1 0-30 0 10 2780 3268 6048
2 0-30 0 20 2779 3269 6048
3 0-30 0 30 2984 3064 6048
4 0-30 0 40 3211 2837 6048
5 30-60 30 10 2139 2007 4146
6 30-60 30 20 2159 1987 4146
7 30-60 30 30 2363 1783 4146
8 30-60 30 40 2478 1668 4146
9 60-90 60 10 764 658 1422
10 60-90 60 20 721 701 1422
11 60-90 60 30 782 640 1422
12 60-90 60 40 801 621 1422
13 90-120 90 10 296 224 520
14 90-120 90 20 302 218 520
15 90-120 90 30 317 203 520
16 90-120 90 40 314 206 520
17 120-150 120 10 12 10 22
18 120-150 120 20 10 12 22
19 120-150 120 30 10 12 22
20 120-150 120 40 13 9 22
21 150-180 150 10 35 21 56
22 150-180 150 20 40 16 56
23 150-180 150 30 40 16 56
24 150-180 150 40 35 21 56
share
1 45.96561
2 45.94907
3 49.33862
4 53.09193
5 51.59190
6 52.07429
7 56.99469
8 59.76845
9 53.72714
10 50.70323
11 54.99297
12 56.32911
13 56.92308
14 58.07692
15 60.96154
16 60.38462
17 54.54545
18 45.45455
19 45.45455
20 59.09091
21 62.50000
22 71.42857
23 71.42857
24 62.50000
这些是从上面的数据框绘制图表的脚本:
g.var <- "travel_time_br30"
go.var <- "travel_time_br30_int"
test %>% ggplot(.,aes_(x=as.name(x.var),y=as.name("share"),group=as.name(g.var))) +
geom_line(size=1.4, aes(
color=fct_reorder(travel_time_br30,order(travel_time_br30_int))))
因为我有几个数据框,它们具有不同的字段,例如 access_time_br30
、access_time_br30_int
而不是数据框中的 travel_time_br30
和 travel_time_br30_int
,我设置了两个变量(g.var
和 go.var
)在同一脚本中轻松复制多个字符。
因为我需要对因子组进行数字重新排序,特别是将 travel_time_br30
的顺序更改为 travel_time_br30_int
,我在 ggplot2(., aes_(...))
中使用 fct_reorder
函数。但是,如果我在 geom_line()
中使用 aes_
和 fct_reorder()
,如以下脚本中的示例所示,它会 returns 显示 Error:
fmust be a factor (or character vector)
.
geom_line(size=1.4, aes_(color=fct_reorder(as.name(g.var),order(as.name(go.var)))))
Fct_reorder()
似乎没有像 fct_reorder_()
这样的 NSE 版本。
在一系列脚本中不能同时使用 aes_ 和 fct_reorder() 还是有其他解决方案?
根据我对 tidy-eval 的新手工作知识,您可以在将数据传递到 ggplot()
之前转换 mutate()
中的因子顺序并获得结果。
抱歉,由于 return 行,我无法轻松阅读上面的 table,所以我从 mtcars
中创建了一个新示例,我认为它抓住了您的意图。 (如果没有,请告诉我)
mtcars2 <- mutate(mtcars,
gear_int = 6 - gear,
gear_intrev = rev(gear_int)) %>%
mutate_at(vars(cyl, gear), as.factor)
library(rlang)
gg_reorder <- function(data, col_var, col_order) {
eq_var <- sym(col_var) # sym is flexible and my novice preference
eq_ord <- sym(col_order)
data %>% mutate(!!quo_name(eq_var) := fct_reorder(!!eq_var, !!eq_ord) ) %>%
ggplot(aes_(~mpg, ~hp, color = eq_var)) +
geom_line()
}
现在将其用于绘图...
gg_reorder(mtcars2, "gear", "gear_int")
gg_reorder(mtcars2, "gear", "gear_intrev")
我没有将所有 aes_()
变量指定为字符串,但您可以将它们作为文本传递并使用 as.name()
模式。如果你想要更多 tidy-eval
模式 Edwin Thoen wrote up a bunch of common cases.
我想知道如何在 ggplot2
中的 fct_reorder()
中使用 NSE(非标准评估)表达式来复制不同数据帧的图表。
这是我用来绘制图表的数据框示例:
travel_time_br30 travel_time_br30_int time_reduction shift not_shift total
1 0-30 0 10 2780 3268 6048
2 0-30 0 20 2779 3269 6048
3 0-30 0 30 2984 3064 6048
4 0-30 0 40 3211 2837 6048
5 30-60 30 10 2139 2007 4146
6 30-60 30 20 2159 1987 4146
7 30-60 30 30 2363 1783 4146
8 30-60 30 40 2478 1668 4146
9 60-90 60 10 764 658 1422
10 60-90 60 20 721 701 1422
11 60-90 60 30 782 640 1422
12 60-90 60 40 801 621 1422
13 90-120 90 10 296 224 520
14 90-120 90 20 302 218 520
15 90-120 90 30 317 203 520
16 90-120 90 40 314 206 520
17 120-150 120 10 12 10 22
18 120-150 120 20 10 12 22
19 120-150 120 30 10 12 22
20 120-150 120 40 13 9 22
21 150-180 150 10 35 21 56
22 150-180 150 20 40 16 56
23 150-180 150 30 40 16 56
24 150-180 150 40 35 21 56
share
1 45.96561
2 45.94907
3 49.33862
4 53.09193
5 51.59190
6 52.07429
7 56.99469
8 59.76845
9 53.72714
10 50.70323
11 54.99297
12 56.32911
13 56.92308
14 58.07692
15 60.96154
16 60.38462
17 54.54545
18 45.45455
19 45.45455
20 59.09091
21 62.50000
22 71.42857
23 71.42857
24 62.50000
这些是从上面的数据框绘制图表的脚本:
g.var <- "travel_time_br30"
go.var <- "travel_time_br30_int"
test %>% ggplot(.,aes_(x=as.name(x.var),y=as.name("share"),group=as.name(g.var))) +
geom_line(size=1.4, aes(
color=fct_reorder(travel_time_br30,order(travel_time_br30_int))))
因为我有几个数据框,它们具有不同的字段,例如 access_time_br30
、access_time_br30_int
而不是数据框中的 travel_time_br30
和 travel_time_br30_int
,我设置了两个变量(g.var
和 go.var
)在同一脚本中轻松复制多个字符。
因为我需要对因子组进行数字重新排序,特别是将 travel_time_br30
的顺序更改为 travel_time_br30_int
,我在 ggplot2(., aes_(...))
中使用 fct_reorder
函数。但是,如果我在 geom_line()
中使用 aes_
和 fct_reorder()
,如以下脚本中的示例所示,它会 returns 显示 Error:
fmust be a factor (or character vector)
.
geom_line(size=1.4, aes_(color=fct_reorder(as.name(g.var),order(as.name(go.var)))))
Fct_reorder()
似乎没有像 fct_reorder_()
这样的 NSE 版本。
在一系列脚本中不能同时使用 aes_ 和 fct_reorder() 还是有其他解决方案?
根据我对 tidy-eval 的新手工作知识,您可以在将数据传递到 ggplot()
之前转换 mutate()
中的因子顺序并获得结果。
抱歉,由于 return 行,我无法轻松阅读上面的 table,所以我从 mtcars
中创建了一个新示例,我认为它抓住了您的意图。 (如果没有,请告诉我)
mtcars2 <- mutate(mtcars,
gear_int = 6 - gear,
gear_intrev = rev(gear_int)) %>%
mutate_at(vars(cyl, gear), as.factor)
library(rlang)
gg_reorder <- function(data, col_var, col_order) {
eq_var <- sym(col_var) # sym is flexible and my novice preference
eq_ord <- sym(col_order)
data %>% mutate(!!quo_name(eq_var) := fct_reorder(!!eq_var, !!eq_ord) ) %>%
ggplot(aes_(~mpg, ~hp, color = eq_var)) +
geom_line()
}
现在将其用于绘图...
gg_reorder(mtcars2, "gear", "gear_int")
gg_reorder(mtcars2, "gear", "gear_intrev")
我没有将所有 aes_()
变量指定为字符串,但您可以将它们作为文本传递并使用 as.name()
模式。如果你想要更多 tidy-eval
模式 Edwin Thoen wrote up a bunch of common cases.