[R語言圖表]用ggplot畫箱形圖與小提琴圖 boxplot and violin plot
0![[R語言圖表]用ggplot畫箱形圖與小提琴圖 boxplot and violin plot](https://i0.wp.com/r-lover.com/wp-content/uploads/2023/04/boxplot_text-1.png?fit=1300%2C803&ssl=1)
Last Updated on 2023-10-31
你想畫箱形圖(boxplot)與小提琴圖(violin plot)嗎?用 ggplot2 帶你畫!
想畫箱形圖(boxplot)與小提琴圖(violin plot),但是不知道怎麼在R語言中使用相關函數嗎?什麼時候該用折線圖?想讓箱形圖變得更清楚該怎麼處理?又應該怎麼挑選類別變數?
我會在這篇文章介紹如何活用R語言的套件ggplot2,配上實際程式碼,帶你畫箱形圖與小提琴圖。
箱形圖boxplot 和小提琴圖 violin plot 是什麼?
箱形圖(boxplot)和小提琴圖(violin plot)兩者,同樣用來描述資料的分布情況。
箱形圖是一種用五個數值(最小值、第一四分位數、中位數、第三四分位數、最大值)來描述資料分布情況的圖表。稍微介紹一下這五個數值,最小/最大值就是所有資料點中值最小/大的,中位數則是將所有數值由小排到大,大小恰為正中間的值,四分位數(quantile)是統計中用來描述資料分布離散與集中程度的指標,第一四分位數和第三四分位數分別指第25%和第75%的值,可以用PR25和PR75來理解。
小提琴圖可以說是核密度圖和箱形圖的合體,以箱形圖為基底,所以可以看出資料分布的位置與離散程度,但又有密度,所以很適合用來比較不同類別的資料分布差異。
比較箱形圖和小提琴圖,兩者都可以看出資料的分布,差別在於前者更強調數據的位置(例如第一四分位數的值)和離散程度(例如看四分位距),後者則可以凸顯數據的密度(因為有寬度)。

以箱型圖呈現氣溫變化
繪製箱形圖和小提琴圖的時候,我們想檢視的類別變數會映射(mapping,指的是想呈現的變量對應到圖表中的表示方法)到x軸,具體想查看的變數則映射到y軸,舉例來說,我們想比較某縣市歷年每個月的最高溫分布,月份在這個例子中屬於要比較的類別、氣溫則是我們想查看的變數,因此前者映射到x軸,後者則映射到y軸。
不過,在此要特別強調,到底想透過圖表呈現什麼重點,會影響繪圖的規劃。以上面某縣市歷年每個月的最高溫分布的例子來說,不用畫圖也可以猜想,台灣的七八月最熱、十二月一月最冷,所以箱形圖中七八月的箱子會在相對上面、十二月一月則在相對下面,這樣來看,此圖表的意義並不大。
若改成查看某縣市每年的最高溫分布,或許會較有意思一些,變成將年份映射到x軸、氣溫映射到y軸,這時與前一張圖的意義就大不相同了。當然,還是要配合你的繪圖目的去決定到底該怎麼呈現,你想探討的是氣溫逐年上升嗎?還是台灣某個縣市竟然不是慣常的以七八月出現最高溫呢?這邊就交給你了!
在 R 語言中,我們可以快速地利用 ggplot2
套件輕鬆簡單的畫出箱形圖和小提琴圖。底下會一步一步帶大家實作。
實作篇
資料長相
我們先來匯入資料。從底下的表格可以看到,這份資料中包含了年份、月份、月份對應的英文縮寫、測量到最高溫。
library(tidyverse)
df_temperature <- read_csv("data/data_pintung.csv")
df_temperature
#> # A tibble: 252 × 4
#> year month max month.abb
#> <dbl> <dbl> <dbl> <chr>
#> 1 2000 1 29.4 Jan
#> 2 2000 2 30.4 Feb
#> 3 2000 3 30.4 Mar
#> 4 2000 4 32.9 Apr
#> 5 2000 5 34.7 May
#> 6 2000 6 35.1 Jun
#> 7 2000 7 34.2 Jul
#> 8 2000 8 34.5 Aug
#> 9 2000 9 32.6 Sep
#> 10 2000 10 33.4 Oct
#> # … with 242 more rows
繪製箱形圖與小提琴圖
處理完資料後,我們可以開始繪製箱形圖。在此,我們將會使用geom_boxplot()
與 geom_violin()
繪圖。這張圖想呈現的是屏東縣每個月的最高溫分佈,月份映射到x軸,最高溫映射到y軸。我們在ggplot()
裡面代表美學(aesthetics)的aes()
中放入年齡(year
)作為x軸、立場的百分比(n
)作為y軸,認同的類型(type
)則填入color當中。
df_temperature %>%
ggplot(aes(x = month.abb, y = max)) +
geom_boxplot() +
theme(legend.position="none") +
theme(panel.grid.major.x = element_line(colour = "gray", linetype = "dotted")) +
theme(title = element_text(family = "Noto Sans CJK TC Regular", size = 24),
axis.text = element_text(family = "Noto Sans CJK TC Regular", size = 18))
第二章則是改成繪製小提琴圖。
df_temperature %>%
mutate(month.abb = as_factor(month.abb)) %>%
mutate(month.abb = fct_reorder(month.abb, month)) %>%
ggplot(aes(x = month.abb, y = max)) +
geom_violin() +
theme(legend.position="none") +
theme(panel.grid.major.x = element_line(colour = "gray", linetype = "dotted")) +
theme(title = element_text(family = "Noto Sans CJK TC Regular", size = 18),
axis.text = element_text(family = "Noto Sans CJK TC Regular", size = 12))
示範補上文字的版本:
df_temperature %>%
ggplot(aes(x = month.abb, y = max)) +
geom_boxplot() +
labs(x= "",y= "",
title = "七月平均最熱,但八月的熱度變異程度較小",
subtitle = "屏東縣每年每月各氣象測站測得之氣溫最大值, 2000 - 2020",
caption = "資料來源:中央氣象局") +
theme(legend.position="none") +
theme(panel.grid.major.x = element_line(colour = "gray", linetype = "dotted")) +
theme(title = element_text(family = "Noto Sans CJK TC Regular", size = 18),
axis.text = element_text(family = "Noto Sans CJK TC Regular", size = 12))
有時候可以考慮把原始的資料點也加上!這時候除了使用 geom_point()
以外,也可以利用加入隨機變異的 geom_jitter()
,效果會比較好喔。
df_temperature %>%
mutate(month.abb = as_factor(month.abb)) %>%
mutate(month.abb = fct_reorder(month.abb, month)) %>%
ggplot(aes(x = month.abb, y = max)) +
geom_boxplot() +
geom_jitter(width = 0.25) +
theme(legend.position="none") +
theme(panel.grid.major.x = element_line(colour = "gray", linetype = "dotted")) +
theme(title = element_text(family = "Noto Sans CJK TC Regular", size = 18),
axis.text = element_text(family = "Noto Sans CJK TC Regular", size = 12))
小結
在這篇文章中,我們介紹了R語言中常用的兩種圖表,分別是箱形圖與小提琴圖。
箱形圖用來檢視資料分布情況,可以用來比較不同種類資料之間的差異,也能查看單一種類資料分布的情形,例如中位數、四分位數、極端值等。
至於小提琴圖,功能類似,但它額外呈現密度,所以可以看到更多資料分布的細節。
在實作篇中,我們使用了R語言中的ggplot2
套件來繪製箱形圖與小提琴圖,並且介紹了如何調整圖表的顏色、字體、標題等屬性來美化圖表。希望你喜歡這篇文章,也能夠增添對於ggplot2
的認識,並且學到東西。
No Comments