R の ggplot2 を使用したトーンダウンしたスパゲッティラインチャート

2021年4月12日

誰かが先月の売上は1,000万ドルだったと私に言ってきたら、私はどう捉えるべきなのだろうか。その単独の数字だけを見ると、何を考えてよいかわかりません。その数字を理解するためには、時間経過や、比較可能な企業との比較などのコンテキストが必要になります。データビジュアライゼーションを使用すると、数字を理解できるコンテキストに入れるのに役立てることができます。

特に役立つコンテキストの形式の1つは時系列のコンテキストです。今日の値は時間の経過とともにどのように変化したか?時系列に沿ってプロットされた折れ線グラフは、これを見るのに役立ちます。

以下に売上収入よりもやや深刻な例として、マサチューセッツ州におけるコロナによる10万人の人口あたりの死亡者数を示します。

これは価値のある情報です。これで今日の数字を過去の文脈に配置し、最近の数字を過去2回のピーク時の数字と比較することができます。また、このグラフは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")

前面の線を確実に明確に表示するために、背景を前面の線の前にプロットすることに注意してください。

グリッド(ファセット)を使用して行う

1つの州でこれを表示するのは良いことですが、この方法で複数の州を調べられるとよくあります。 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: ファセットを使用してこれを行う方法を見つけるために、長年実験したり、ウェブを検索したりしました。最終的にデータからビジュアライゼーションへで答えを見つけました。