【问题标题】:How to user NSE inside fct_reorder() in ggplot2如何在 ggplot2 中的 fct_reorder() 中使用 NSE
【发布时间】:2018-05-04 08:41:05
【问题描述】:

我想知道如何在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_br30access_time_br30_int 而不是数据框中的 travel_time_br30travel_time_br30_int,因此我将两个变量(g.vargo.var)设置为在同一个脚本中轻松复制多个字符。

由于我需要以数字方式重新排序因子组,特别是通过travel_time_br30_int 更改travel_time_br30 的顺序,我在ggplot2(., aes_(...)) 中使用fct_reorder 函数。但是,如果我在geom_line() 中使用aes_fct_reorder(),如以下脚本中的示例所示,则会返回错误消息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() 还是有其他解决方案?

【问题讨论】:

  • 在我们调用 ggplot() 之前执行 fct_reorder 对你有用吗?假设它仍然在函数/循环和 NSE..
  • 它适用于以下脚本:test %&gt;% mutate(order=fct_reorder(travel_time_br30, travel_time_br30_int)) 但是,如果我将变量与 NSE ('mutate_') 一起使用,而不是将字段名称直接放入脚本中,则它不起作用:mutate_(order=fct_reorder(as.name(g.var),as.name(go.var)))跨度>

标签: r ggplot2 nse non-standard-evaluation


【解决方案1】:

根据我对 tidy-eval 的新手工作知识,您可以在将数据传递到 ggplot() 之前转换 mutate() 中的因子顺序并获得结果。

抱歉,由于换行的原因,我无法轻松地阅读您上面的表格,所以我从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

【讨论】:

  • 仅供参考,您现在可以使用 tidyevalggplot2(开发版)。 Here is an example
  • 亲爱的 Nate:非常感谢您的建议!虽然我在 dplyr 的管道操作过程中遇到了很多错误,但我可以根据您的想法做出想要的结果。
  • 亲爱的董:解决操作中的错误也帮了我很大的忙。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多