首页 文章

“错误:美学必须是长度1或与数据相同(1148)......”为什么?

提问于
浏览
0

Wickham(2009:164-6)给出了同时绘制多个时间序列的例子 . 以下代码复制了他的示例:

range01 <- function(x) {
      rng <- range(x, na.rm = TRUE)
      (x - rng[1])/diff(rng)
  }

  emp <- subset(economics_long, variable %in% c("uempmed", "unemploy"))
  emp2 <- ddply(emp, .(variable), transform, value = range01(value))
  qplot(date, value, data = emp2, geom = "line", color = variable, linetype =     variable)
  # Produces a plot that looks like the one on p. 166 of the ggplot2 book.

这里,range01用于将变量重新编码为[0,1]内的值,因此可以在相同的比例上绘制具有不同数量级的序列 . Wickham的原始版本也从ggplot2提供的 employment 数据开始,并将其融入长格式,但在这里我采用了从 employment_long 版本开始的快捷方式 .

但Wickham(p.27)也指出,点击ggplot2的"full power"需要使用 ggplot() 函数按层手动构建绘图 . 这是他的例子,但使用 ggplot() 而不是 qplot()

# Now do the same thing using ggplot commands only
ggplot(data = emp2, aes(x = date)) +
  geom_line(aes(y = value, group = variable, color = variable, linetype = variable))
# Get the same results

这两个示例都利用了 ggplot2 的默认设置 . 但是假设我们想要更好地控制美学 . 也许一些变量适合于特定的配色方案(例如,绿色可能用于环保变量,黑色用于有害颜色);或许在一本有很多情节的长篇专着中,我们只想确保一致性 . 此外,如果图表将在演示文稿和打印的黑白文本中使用,我们可能还希望将特定行类型与特定系列相关联;如果我们关注有色盲的 Spectator ,情况也可能如此 . 最后,变量名称通常是变量实际上的描述不佳,因此我们希望将变量标签与各个时间序列相关联 .

因此,我们为经济学数据集定义以下内容:

# Try to control the look a bit more
economics_colors = c("pce" = "red", "pop" = "orange", "psavert" = "yellow",
    "uempmed" = "green", "unemploy" = "blue")
economics_linetypes = c("pce" = "solid", "pop" = "dashed", "psavert" = "dotted",
    "uempmed" = "dotdash", "unemploy" = "longdash")
economics_labels = c(
    "pce" = "Personal consumption expenditures",
    "pop" = "Total population",
    "psavert" = "Personal savings rate",
    "uempmed" = "Median duration of unemployment",
    "unemploy" = "Number of unemployed"
)

现在通过为每个变量添加单独的图层(Wickham 2009:164-5)来构建图表:

# First do it line-by-line
employment.plot <- ggplot(emp2) + aes(x = date)  +
  scale_linetype_manual(values = economics_linetypes, labels = economics_labels)
employment.plot <- employment.plot +
  geom_line(data = subset(emp2, variable == "uempmed"),
      aes(y = value, linetype = "uempmed"), color = economics_colors["uempmed"])
employment.plot <- employment.plot +
  geom_line(data = subset(emp2, variable == "unemploy"),
            aes(x = date, y = value, linetype = "unemploy"), color = economics_colors["unemploy"])
employment.plot
# Except for the specific line colors, produces the same plot as before.

注意这里有两件事 . 首先,线型是 mapped ,但颜色是 set (参见Wickham 2009:47-49) . 这会产生单个图例的所需结果,每个系列都有不同的颜色 - 线型组合 .

其次,即使数据以"long"格式组织,我们也使用 subset 来选择单个系列 . 这不是最好的解决方案 . 正如威克姆(164-5)所说:

...更好的选择是将数据融合成长格式,然后将其可视化 . 在熔融数据中,时间序列将其值存储在值变量中,我们可以使用变量变量区分它们 .

那么让我们尝试这种方法:

# Now try it the automatic way
employment.plot <- ggplot(data = emp2, aes(x = date))  +
  scale_linetype_manual(values = economics_linetypes, labels = economics_labels)
employment.plot <- employment.plot +
  geom_line(aes(y = value, group = variable, linetype = economics_linetypes), color = economics_colors)
employment.plot
# Throws "Error: Aesthetics must be either length 1 or the same as the data (1148) ..."

正如评论所指出的,这段代码引发了关于美学的错误 . 为什么?

此外,还有另一种方法可以实现使用融合数据的多个目标,单个 variable 变量触发单独的行,控制哪些颜色和线类型与每个系列相关联,并使用代码在多个图中标准化这些约定?

参考文献

威克姆,哈德利 . 2009. ggplot2:优雅的数据分析图形 . 斯普林格 .

1 回答

  • 1

    美学应始终映射到数据集的维度 .

    你在上一个命令中说的是:“对于每个'data point'(或在这种情况下为组),指定一个等于 economics_linetypes 的线型 . ”

    但是,还没有关于如何将每个记录(组)映射到 economics_linetypes 中的任何值的信息 . 所以它正确地返回错误 .

    您应该做的是将 linetype 映射到控制它的维度 . 即:“对于此维度中的每个值,使用不同的 linetype 值”,即:

    geom_line(aes(y = value, group = variable, linetype = variable)
    

    一旦我们有了这个定义,我们可以使用比例的定义将变量的值映射到特定的 linetype

    scale_linetype_manual(values = economics_linetypes, labels = economics_labels)
    

    所有这些当然也适用于颜色,所以最后我们有:

    employment.plot <- ggplot(data = emp2, aes(x = date))  +
        geom_line(aes(y = value, group = variable, linetype = variable, color = variable)) +
        scale_linetype_manual(values = economics_linetypes, labels = economics_labels) +
        scale_color_manual(values = economics_colors, labels = economics_labels)
    

    enter image description here

    希望这很清楚 .

相关问题