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 找不到乘客变量(大问题)。
需要解决的一些问题:
- 您指定了
fill = variable
,但您的数据框中没有名为 "variable" 的变量;
- 您希望 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")
,但需要更少的输入。
我有一个数据框,其中包含 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 找不到乘客变量(大问题)。
需要解决的一些问题:
- 您指定了
fill = variable
,但您的数据框中没有名为 "variable" 的变量; - 您希望 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")
,但需要更少的输入。