[R語言圖表]用ggplot畫箱形圖與小提琴圖 boxplot and violin plot

0

Last Updated on 2023-10-31

Home » R語言教學 » 資料視覺化 » [R語言圖表]用ggplot畫箱形圖與小提琴圖 boxplot and violin plot

你想畫箱形圖(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

Leave a Reply