[R語言圖表]用ggplot畫直方圖 histogram
0Last Updated on 2023-10-31
你想畫直方圖(histogram)嗎?用 ggplot2 帶你畫!
想畫折線圖(histogram),但是不知道怎麼在R語言中使用相關函數嗎?什麼時候該用直方圖?想調整直方圖的寬度怎麼辦?
我會在這篇文章介紹如何活用R語言的套件ggplot2,配上實際程式碼,帶你畫直方圖。
直方圖 histogram 是什麼?
直方圖(histogram)是一種用來展示變數分布(distribution)的簡單但非常強大的圖表工具。與直方圖(density plot)不同,直方圖的焦點在於將數據分組成特定的區間或「箱」(bins),接著計算每個區間內有多少資料點。例如,如果我們看人口年齡分布,我們可能會將年齡分為0-9歲、10-19歲、20-29歲等等,然後數算每個年齡組有多少人。
直方圖因為計算簡單和易於理解而受到廣泛的使用。實際上,你只需要一張紙和一支筆就能快速地畫出一個直方圖。這使得它成為初步數據分析和探索的理想工具。在電腦普及的今天,直方圖提供了更平滑的曲線來表示變量分布,但直方圖仍有其獨特的優勢。它的簡單性使得人們可以快速瞭解數據集的「形狀」,並且容易識別出數據中的異常值或模式。
畫直方圖時,我們通常會將想要了解的變數映射到 x 軸,而 y 軸則表示每個「箱」中的數據點數量。不同於直方圖,直方圖需要我們指定「箱」的大小和數量,這個參數叫做「bin width」。「箱」的大小和數量會影響最終圖形的解釋性;選擇太多或太少的「箱」都可能會模糊真實的資料分布。
總結一下,直方圖是一個簡單但功能強大的工具,適用於各種不同的資料分析場景。它提供了一個直觀的方式來理解單一變量的分布,並且是初步資料探索的好選擇。
在 R 語言中,我們可以快速地利用 ggplot2
套件輕鬆簡單的畫出直方圖。底下會一步一步帶大家實作。
實作篇
資料長相
我們先來匯入資料。從底下的表格可以看到,這份資料2022年九合一選舉中議員候選人的基本資料,欄位有選區、姓名、政黨、性別、生日、年齡、年齡組等。
library(tidyverse)
df_council_candidate_age <- read_csv("../data/ggplot-density-plot.csv")
df_council_candidate_age
#> # A tibble: 1,018 × 7
#> areaName name party gender birth age age_group
#> <chr> <chr> <chr> <chr> <date> <dbl> <dbl>
#> 1 連江縣第1選舉區 曹丞君 中國國民黨 女 1976-07-23 46.3 40
#> 2 連江縣第1選舉區 劉浩晨 民主進步黨 男 1991-08-21 31.3 30
#> 3 連江縣第1選舉區 陳書建 中國國民黨 男 1957-12-20 64.9 60
#> 4 連江縣第1選舉區 林明揚 中國國民黨 男 1963-10-31 59.1 50
#> 5 連江縣第1選舉區 楊清宇 中國國民黨 男 1974-06-16 48.4 40
#> 6 連江縣第2選舉區 周瑞國 中國國民黨 男 1969-04-05 53.6 50
#> 7 連江縣第2選舉區 陳如嵐 中國國民黨 男 1970-12-01 52.0 50
#> 8 連江縣第2選舉區 陳玉發 中國國民黨 男 1960-11-05 62.1 60
#> 9 連江縣第3選舉區 陳貽斌 中國國民黨 男 1969-11-16 53.0 50
#> 10 連江縣第4選舉區 張永江 中國國民黨 男 1960-06-23 62.4 60
#> # ℹ 1,008 more rows
從直方圖開始
接著,我們利用library(ggplot2)
開始畫圖。這張圖想呈現的是台灣議員候選人的年齡分布,年齡映射到 x 軸,分布密度或者次數則映射到 y 軸,所以我們在 ggplot()
裡面代表美學(aesthetics)的aes()
中放入年齡(age
)作為 x 軸即可。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram()
最基礎的直方圖長相就是這樣。我們可以調整 binwidth、變換顏色,同時也可以加上外框, 讓 bin 看起來更加明顯些。
調整顏色
我們先從調整顏色開始。fill
代表要填入直條的顏色,color
則是外框的顏色。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black")
調整箱寬
接著,我們來試試看不同的 binwidth。首先來試試看把 binwitdh 調整到 3。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 3)
下一步,則是調得更細,變成 binwidth 為 1 就好。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 1)
輔助線
為了讓圖表更有意義,不只有密度曲線而已,我們額外補上四分位數(quartile)的輔助線,讓讀者可以知道年齡的第一四分位數、第二四分位數(也就是中位數)、第三四分位數位置落在哪裡。
vector_quartile <- unname(quantile(df_council_candidate_age$age))
vector_quartile
#> [1] 24.44384 40.37740 49.54247 59.07466 79.84384
得到四分位數的值以後,我們利用 geom_vline()
加上垂直線,vline
的 v 就是指 vertical,因此需要加上參數 xintercept
。大家應該可以想像,若要加上水平線,則使用的函數與參數分別為 geom_vline()
和 yintercept
。不過,這樣看起來不是很好看,要再想辦法調整。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 3) +
geom_vline(aes(xintercept = vector_quartile[3]), color = "blue", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[2]), color = "darkblue", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[4]), color = "darkblue", linetype = "dashed")
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 3) +
geom_vline(aes(xintercept = vector_quartile[3]), color = "grey", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[2]), color = "white", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[4]), color = "white", linetype = "dashed")
細部繪圖調整
我們再利用 theme_clean()
調整繪圖上的細節,將背景變成白色、修改座標軸顏色,讓結果變得更加清晰。
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 3) +
geom_vline(aes(xintercept = vector_quartile[3]), color = "grey", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[2]), color = "white", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[4]), color = "white", linetype = "dashed") +
ggthemes::theme_clean()
加上座標軸名稱
最後,我們再利用 labs()
補上 x 軸與 y 軸的名稱,就大功告成!
df_council_candidate_age %>%
ggplot(aes(x = age)) +
geom_histogram(fill = "darkred", color = "black", binwidth = 3) +
geom_vline(aes(xintercept = vector_quartile[3]), color = "grey", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[2]), color = "white", linetype = "dashed") +
geom_vline(aes(xintercept = vector_quartile[4]), color = "white", linetype = "dashed") +
ggthemes::theme_clean() +
labs(x = "議員年齡", y = "人數") +
theme(axis.title = element_text(family = "Noto Sans TC Regular"))
小結
在這篇文章中,我們嘗試畫了一張直方圖(histogram),逐步加上顏色、輔助線、調整帶寬等。希望你喜歡這篇文章,也能夠增添對於 ggplot2
的認識,並且學到東西。
No Comments