ggplot2:重塑数据以绘制每个 X 值的多个 Y 值

ggplot2: Reshaping data to plot multiple Y values for each X Value

我有一个数据框,其中包含 2 周的数据,指示每天有多少乘客乘坐火车。每个观察包含 3 个值,日期、乘客数量和星期几。我想比较上周到本周(周一到周一,周二到周二等)每天的乘客。这是数据:

structure(list(total = structure(c(17455, 17456, 17457, 17458, 
17459, 17460, 17461, 17462, 17463, 17464, 17465, 17466, 17467, 
17468), class = "Date"), passengers = c(9299L, 9166L, 10234L, 
10176L, 10098L, 2867L, 5416L, 9312L, 10555L, 10858L, 10169L, 
9515L, 2679L, 5490L), dow = c("Monday", "Tuesday", "Wednesday", 
"Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", 
"Wednesday", "Thursday", "Friday", "Saturday", "Sunday")), .Names = 
c("total", "passengers", "dow"), class = "data.frame")

(创建报告的自动化系统使用术语 "total" 表示日期,我觉得有必要指出这一点,因为它可能会造成混淆)。

当我创建一个 ggplot 时,它只为条形图映射 1 个 y 值,而不是并排映射 2 个:

ggplot(x, aes(x=dow, y=passengers), fill=variable) + 
  geom_bar(stat = "identity", position = "dodge")

我曾看到 reshape 用于融化数据,例如这样的实例,但是当我使用星期几作为 id.vars 值融化时,日期被转换为科学记数法(小问题)但是 ggplot 找不到乘客变量(大问题)。

需要解决的一些问题:

  1. 您指定了 fill = variable,但您的数据框中没有名为 "variable" 的变量;
  2. 您希望 2 个并排的闪避条,但没有指示如何进行闪避。

我会先处理数据框:

library(dplyr)

df <- x %>%
  mutate(week = format(total, "%V"),
         dow = factor(dow, levels = c("Monday", "Tuesday", "Wednesday", "Thursday",
                                      "Friday", "Saturday", "Sunday")))

> head(df)
       total passengers       dow week
1 2017-10-16       9299    Monday   42
2 2017-10-17       9166   Tuesday   42
3 2017-10-18      10234 Wednesday   42
4 2017-10-19      10176  Thursday   42
5 2017-10-20      10098    Friday   42
6 2017-10-21       2867  Saturday   42

这会添加一个 "week" 变量,前 7 个值的值为 42,接下来的 7 个值的值为 43。星期几现在也按从周一到周日的顺序排列。

ggplot(df, 
       aes(x = dow, y = passengers, fill = week)) + 
  geom_col(position = "dodge")

geom_col() 等同于 geom_bar(stat = "identity"),但需要更少的输入。