如何告诉ggplot选择一个用``引用的列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何告诉ggplot选择一个用``引用的列相关的知识,希望对你有一定的参考价值。

我要做的是告诉ggplot geom_line一个用``引用的tibble列。

例如,如果我按字面意思写出它工作的列的“名称”:

这是生成的tibble:

Q <- as_tibble(data.frame(series = rep(c("diax","diay"),3),
                          value = c(3.25,3.30,3.31,3.36,3.38,3.42),
                          year = c(2018,2018,2019,2019,2020,2020))) %>%
  select(year, series, value) %>% spread(key = "series", value = "value") %>%
  rename(`2018-01-01` = diax, `2017-01-01` = diay)

这是ggplot命令:

ggplot(Q, aes(x = year)) + 
  geom_line(aes(y = `2018-01-01`), col = "red", size = 2, linetype = "dotdash") +
  geom_line(aes(y = `2017-01-01`), col = "orange", size = 2, linetype = "dashed")

上面的代码工作得很好。

但是,如果我有一个带有列名称的字符串向量,我根本无法复制调用向量的先前结果。

也就是说,假设我有一个这样的向量:

nomes <- c("2018-01-01","2017-01-01")

然后我想ggplot这样的东西:

ggplot(Q, aes(x = year)) + 
  geom_line(aes(y = nomes[1]), col = "red", size = 2, linetype = "dotdash") +
  geom_line(aes(y = nomes[2]), col = "orange", size = 2, linetype = "dashed")

我知道这不会起作用,但作为一个初学者,我猜想下面的行可以正常工作,但他们不会

ggplot(Q, aes(x = year)) + 
  geom_line(aes(y = !!quo(nomes[1])), col = "red", size = 2, linetype = "dotdash") +
  geom_line(aes(y = !!quo(nomes[2])), col = "orange", size = 2, linetype = "dashed")

我意识到quo(nomes [1])并没有在向量的位置内提供名称,而我无法得到我想要尝试的一些替代方案。

答案

你可以as.name

nomes <- c("2018-01-01","2017-01-01");
ggplot(Q, aes(x = year)) +
    geom_line(aes(y = !!as.name(nomes[1])), col = "red", size = 2, linetype = "dotdash") +
    geom_line(aes(y = !!as.name(nomes[2])), col = "orange", size = 2, linetype = "dashed");

enter image description here

或者使用rlang::sym

ggplot(Q, aes(x = year)) +
    geom_line(aes(y = !!rlang::sym(nomes[1])), col = "red", size = 2, linetype = "dotdash") +
    geom_line(aes(y = !!rlang::sym(nomes[2])), col = "orange", size = 2, linetype = "dashed");

说明:我们将字符串转换为带有as.namerlang::sym的符号,然后使用!!计算当前周围上下文中的符号。

另一答案

据我所知,这与您正在寻找的相同,但没有命名麻烦。您可以将数据保存为长格式,并将颜色和线型映射到series列。我使用来自fct_recodeforcats(作为tidyverse的一部分)来改变series的因子水平,但你也可以改变基数R的水平。

或者,你可以保持series水平(diax,diay),只需改变它们出现在scale_color_manualscale_linetype_manual的图例中的标签。

library(tidyverse)

df <- as_tibble(data.frame(series = rep(c("diax","diay"),3),
                 value = c(3.25,3.30,3.31,3.36,3.38,3.42),
                 year = c(2018,2018,2019,2019,2020,2020))) %>%
    mutate(series = fct_recode(series, "2018-01-01" = "diax", "2017-01-01" = "diay"))

ggplot(df, aes(x = year, y = value, color = series, linetype = series)) +
    geom_line(size = 2) +
    scale_color_manual(values = c("2018-01-01" = "red", "2017-01-01" = "orange")) +
    scale_linetype_manual(values = c("2018-01-01" = "dotdash", "2017-01-01" = "dashed"))

reprex package创建于2018-05-07(v0.2.0)。

以上是关于如何告诉ggplot选择一个用``引用的列的主要内容,如果未能解决你的问题,请参考以下文章

未解决的对“片段”部分中的符号“”的引用

如何在sum()语句中通过其位置引用data.table的列

如何告诉ggplot避免绘制丢失的日期

在 ggplot2-R 中编辑和格式化箱形图(删除时间序列图中的列和箱宽)

用亲身经历告诉你,在你的并发程序代码块中,最好最好不要有引用类型

选择了未定义的列(贝叶斯分析)