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 回答
美学应始终映射到数据集的维度 .
你在上一个命令中说的是:“对于每个'data point'(或在这种情况下为组),指定一个等于
economics_linetypes
的线型 . ”但是,还没有关于如何将每个记录(组)映射到
economics_linetypes
中的任何值的信息 . 所以它正确地返回错误 .您应该做的是将
linetype
映射到控制它的维度 . 即:“对于此维度中的每个值,使用不同的linetype
值”,即:一旦我们有了这个定义,我们可以使用比例的定义将变量的值映射到特定的
linetype
:所有这些当然也适用于颜色,所以最后我们有:
希望这很清楚 .