【问题标题】:"Error: Aesthetics must be either length 1 or the same as the data" Why?“错误:美学必须是长度 1 或与数据相同”为什么?
【发布时间】:2017-03-28 13:29:43
【问题描述】:

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(第 27 页)还指出,利用 ggplot2 的“全部功能”需要使用 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 的默认设置。但是假设我们想要更好地控制美学。也许某些变量适合特定的配色方案(例如,绿色可能用于环保变量,黑色可能用于有害变量);或者也许在一个有很多情节的长篇专着中,我们只是想确保一致性。此外,如果图表将用于演示文稿和打印的黑白文本,我们可能还希望将特定线型与特定系列相关联;如果我们担心有色盲的观众,情况也可能如此。最后,变量名称通常不能很好地描述变量的真实含义,因此我们希望将变量标签与各个时间序列相关联。

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

# 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.

请注意这里的两件事。首先,线型是映射,但颜色是设置(参见 Wickham 2009: 47-49)。这会产生单个图例的预期结果,每个系列都有不同的颜色线型组合。

其次,即使数据是以“长”格式组织的,我们还是使用 subset 来选择单个系列。这不是最好的解决方案。正如 Wickham (164-5) 所说:

...更好的选择是将数据融合为长格式并 然后形象化。在熔融数据中,时间序列有它们的 值存储在 value 变量中,我们可以区分 使用 variable 变量。

那么让我们试试这个方法:

# 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:用于数据分析的优雅图形。斯普林格。

【问题讨论】:

    标签: r ggplot2 time-series timeserieschart


    【解决方案1】:

    美学应该始终映射到数据集的一个维度。

    您对最后一个命令的意思是:“为每个‘数据点’(或本例中的组)分配一个等于其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)
    

    希望这已经足够清楚了。

    【讨论】:

    • 如果它确实回答了您的问题,请考虑支持并接受答案
    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 2017-11-04
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多