使用 R 的 ggplot2 製作柔和的義大利麵條線形圖
2021 年 4 月 12 日
如果有人告訴我他們上個月的銷售額為 1000 萬美元,我該怎麼想?僅憑這個數字,我不知道該怎麼想。要了解這個數字,我需要背景,可能是隨著時間推移,也可能是與相容的公司相比。使用資料視覺化可以幫助我將數字放入一個背景中,讓我了解它的意義。
一種特別有用的背景是時間背景。今天的數字與過去的數字相比如何?根據時間繪製的折線圖可以幫助我看到這一點。
以下是一個比銷售收入更為嚴肅的例子,麻薩諸塞州因新冠肺炎每 100,000 人的死亡人數。

這很有價值,因為我現在可以將今天的數字放在歷史背景中,將最近的數字與過去兩個高峰期的數字進行比較。在 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 找到答案