【问题标题】:Can someone explain the behaviour of named vectors in manual ggplot scales?有人可以解释手动 ggplot 尺度中命名向量的行为吗?
【发布时间】:2016-11-04 15:41:55
【问题描述】:

在ggplot2中使用命名向量手动设置颜色时,如果使用变量作为名称之一,颜色将不会出现在最终绘图中。

library(ggplot2)

first_species <- 'setosa'
colours <- c(first_species = 'black',
             'versicolor'  = 'cadetblue',
             'virginica'   = 'hotpink')

ggplot(iris) +
  aes(x = Petal.Length, y = Petal.Width, colour = Species) +
  geom_point() +
  scale_colour_manual(values = colours)

但是,如果我使用名称创建命名向量,则绘图会按预期显示:

colours <- c('black', 'cadetblue', 'hotpink')
names(colours) <- c(first_species, 'versicolor', 'virginica')

ggplot(iris) +
  aes(x = Petal.Length, y = Petal.Width, colour = Species) +
  geom_point() +
  scale_colour_manual(values = colours)

谁能向我解释这种行为?我怀疑它与非标准评估有关(ggplot2 使用的是名称而不是值?)。

建议在手动比例设置功能中使用变量的最佳方法,将不胜感激!

【问题讨论】:

  • 在第一个示例中,在颜色
  • 如果您想要一行代码来设置名称,而不是使用两行 names,您可以使用 setNames,这是一种方便的功能。

标签: r ggplot2 nse


【解决方案1】:

当您执行以下操作时:

c(n=1)

就像在做:

runif(n=10)

n 在这里是一个名称,不会像变量一样被评估。它是一个命名参数。您可以引用 runif("n"=10) 之类的名称是解析器的一项功能,它允许您将无法解析的名称作为参数:

list("this has spaces" = 99) # works, list(this has spaces=99) fails

【讨论】:

  • 好的,这是有道理的。确认:命名向量中的名称与字符不同?
  • 我认为我的部分困惑是is.character(names(colours)) 是真的。但我假设 names 函数转换为字符。
  • 啊,我没有意识到你可以这样做:c(is = 4, a = 5, thing = 8)。我想我认为c() 的工作方式与其他采用命名参数的函数不同。好的,这是有道理的!
【解决方案2】:

正如其他人所提到的,如果您查看您创建的命名向量 colours,您会发现它没有评估 first_species,它只是将其分配为名称。

first_species <- 'setosa'
colours <- c(first_species = 'black',
             'versicolor'  = 'cadetblue',
             'virginica'   = 'hotpink')

colours
# first_species    versicolor     virginica 
#       "black"   "cadetblue"     "hotpink"

您可以通过使用 setNames 调用 R 来评估该变量:

colours <- setNames(c("black", "cadetblue", "hotpink" ), 
                    c(first_species, "versicolor", "virginica"))

colours
#      setosa  versicolor   virginica 
#     "black" "cadetblue"   "hotpink" 

现在你得到了想要的情节:

ggplot(iris) +
  aes(x = Petal.Length, y = Petal.Width, colour = Species) +
  geom_point() +
  scale_colour_manual(values = colours)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2022-12-16
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多