使用 R 的 ggplot2 绘制淡化线条的意大利面条线图
2021 年 4 月 12 日
如果有人告诉我他们上个月的销售额是 1000 万美元,我该怎么理解?仅仅依靠这个数字,我无法得出任何结论。为了理解这个数字,我需要一些背景信息,例如时间跨度或与同类公司的比较。使用数据可视化可以帮助我将数字置于一个可以理解的背景中。
时间跨度是一种特别有用的背景信息。今天的数据与过去一段时间的数据相比如何?将数据绘制成时间线图可以帮助我了解这一点。
这里有一个比销售额更令人沮丧的例子,即马萨诸塞州每 10 万人因新冠肺炎死亡的人数。
这很有价值,因为我现在可以将今天的数据放在历史背景中,将最近的数据与过去两次高峰时期的数据进行比较。在 R 中绘制此图表也非常容易,只需要几行代码。
death_pp %>%
filter(state == "MA") %>%
ggplot(aes(date, death_pm_rm)) +
labs(y = "deaths per 100,000") +
geom_line(color = "blue")
显示加载 death_pp 的代码
# cdc covid data records New York City seperately from New York state
cdc_pops <- pops %>%
mutate(pop = if_else(state == "NY", pop - 8400000, pop)) %>%
add_row(name = "New York City", state = "NYC", pop = 8400000)
# http -d "https://data.cdc.gov/api/views/9mfq-cb36/rows.csv" > cdc_cases.csv
cdc_cases <- read_csv("cdc_cases.csv") %>%
select(state, submission_date, new_death, tot_death) %>%
mutate(date = mdy(submission_date)) %>%
arrange(date) %>%
group_by(state)
death_pp <- cdc_cases %>%
left_join(cdc_pops, by = "state") %>%
drop_na(pop) %>%
mutate(death_pm = new_death * 1000000 / pop) %>%
mutate(death_pm_rm = rollmean(death_pm, 7, fill=NA, align="right"))
但我可以展示比时间跨度更多的背景信息。为了更好地了解马萨诸塞州的疫情发展,我可以将其与其他州的情况进行比较。一个好方法是将其他所有美国州的线图作为淡化背景显示。
据我所知,这种类型的图表没有普遍接受的术语。在折线图中绘制多条线有时被称为意大利面条线图。因此,我将此称为淡化意大利面条图。
在 R 中,绘制此图非常容易,关键是将另一个 geom_line 与不同的数据源一起绘制,作为我们要查看的主要线。
death_pp %>%
filter(state == "MA") %>%
ggplot(aes(date, death_pm_rm)) +
labs(y = "deaths per 100,000") +
geom_line(data = death_pp, aes(group = state), color = "grey", size = 1, alpha = 0.5) +
geom_line(aes(y = death_pm_rm), color = "blue")
请注意,我在绘制前景线之前绘制背景,以确保前景线清晰地显示在顶部。
使用网格(分面)实现
用一个州展示这一点很好,但通常需要能够以这种方式查看多个州。ggplot2 提供了非常方便的 facet_wrap 命令,可以为集合中的每个值绘制一个折线图,但需要一些技巧才能使其与这种淡化意大利面条背景一起使用。
技巧在于我需要指定意大利面条的分组方式。
death_pp %>%
filter(state %in% c("MA", "VT", "CT", "RI", "NH")) %>%
ggplot(aes(date, death_pm_rm)) +
labs(y = "deaths per 100,000") +
geom_line(data = death_pp %>% rename(s = state),
aes(group = s), color = "grey", size = 1, alpha = 0.5) +
geom_line(color = "blue") +
facet_wrap(~state, ncol = 3)
通过重命名分组列,ggplot 仅对主要线进行分面,并在每个分面上绘制意大利面条。 [1]
脚注
1: 我花了很长时间进行实验和网络搜索,才找到如何在分面上实现这一点。最终,我在 from data to viz 上找到了答案

