前面的啰嗦
本教程對繪圖所需數(shù)據(jù)和繪圖過程進(jìn)行了一步步的解釋,稍顯啰嗦,沒時(shí)間細(xì)看或不想一步步看的朋友可以直接點(diǎn)擊目錄最后一節(jié):
箱線圖完整版代碼
繪圖數(shù)據(jù)說明
用到的數(shù)據(jù)是mpg數(shù)據(jù)集,這是ggplot2包自帶的數(shù)據(jù)集,可以使用以下代碼查看該數(shù)據(jù)集的基本情況:
library(ggplot2)
?mpg # 或者h(yuǎn)elp(mpg)
從幫助文檔中可以看出這是一個(gè)234x11的數(shù)據(jù)框,它記錄了美國1999年和2008年部分汽車的制造廠商,型號,類別,驅(qū)動(dòng)程序和耗油量等信息。
下面看一下這11列的情況:
library(ggplot2)
# str查看數(shù)據(jù)集的基本情況
str(mpg)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
每一列的解釋如下:
- model: model name
- displ: 發(fā)動(dòng)機(jī)排量(engine displacement, in litres)
- year: 發(fā)行時(shí)間,僅有1999和2008
- cyl: 汽缸數(shù)目(number of cylinders)
- trans: 變速器類型(type of transmission)
- drv: 表示驅(qū)動(dòng)程序,是一個(gè)分類變量,詳細(xì)解釋為:the type of drive
train, where f = front-wheel drive, r = rear wheel drive, 4 = 4wd - cty: city miles per gallon,每加侖城市里程,耗油量的一種計(jì)量方式。
- hwy: highway miles per
gallon,每加侖公路行駛里程,也是耗油量的一種計(jì)量方式。
基本箱線圖
下面對hwy繪制箱線圖,查看這些汽車的耗油量分布情況。
library(ggplot2)
ggplot(data=mpg, aes(x="", y=hwy)) +
geom_boxplot()

可以看到耗油量的中位數(shù)在25附近,其中有兩個(gè)離群點(diǎn),這兩輛汽車的耗油量很大。
這里繪制的圖是一個(gè)橫向的箱線圖,如果要繪制縱向的箱線圖(即上圖順時(shí)針旋轉(zhuǎn)90度),只需要改一下代碼中aes的參數(shù),設(shè)置為x=hwy即可,如下所示:
ggplot(data=mpg, aes(x=hwy, y="")) +
geom_boxplot()

分組箱線圖
下面繪制一下分組箱線圖,看一下不同驅(qū)動(dòng)程序的汽車的耗油量分布,其中驅(qū)動(dòng)程序是mpg數(shù)據(jù)集中的drv變量,這是一個(gè)分類變量
class(mpg$drv)
## [1] "character"
table(mpg$drv)
##
## 4 f r
## 103 106 25
ggplot(data=mpg, aes(x=factor(drv), y=hwy, fill=factor(drv))) +
geom_boxplot()

由于mpg$drv的類別是character,而ggplot繪圖進(jìn)行分組所需要的變量類型是factor,因此需要將drv變量轉(zhuǎn)為factor類別,但這里存在一個(gè)問題,就是橫坐標(biāo)軸標(biāo)題出現(xiàn)了factor字樣,圖例的標(biāo)題中也出現(xiàn)了factor字樣,不是很美觀,這個(gè)問題的解決方法有兩個(gè):
- 直接對數(shù)據(jù)框的drv變量進(jìn)行修改,將其改為factor類別:
mpg_new <- mpg
mpg_new$drv <- as.factor(mpg_new$drv)
ggplot(data=mpg_new, aes(x=drv, y=hwy, fill=drv)) +
geom_boxplot()

- 修改坐標(biāo)軸與圖例的標(biāo)題,將其修改為drv:
ggplot(data=mpg, aes(x=factor(drv), y=hwy, fill=factor(drv))) +
geom_boxplot() +
scale_fill_discrete(name='drv') +
labs(x="drv") # x表示橫坐標(biāo)軸的標(biāo)題

# scale_一系列的函數(shù)都是用來配置圖例的,scale_fill_discrete指的是修改fill的圖例,和aes中的fill相對應(yīng)。
美化分組箱線圖
上面的箱線圖存在一些地方不是很好看,主要有以下幾點(diǎn):
- 圖例的顏色與橫坐標(biāo)軸的三個(gè)標(biāo)簽信息是一致的,存在冗余,因此可以去掉圖例,去掉圖例的代碼為
guides(fill=FALSE) - 沒有添加標(biāo)題,可以在labs函數(shù)中添加標(biāo)題
- 所用主題可以優(yōu)化,可以使用theme_系列函數(shù)
下面使用mpg_new數(shù)據(jù)框進(jìn)行操作,避免不停的對drv列進(jìn)行操作。
mpg_new <- mpg
mpg_new$drv <- as.factor(mpg_new$drv)
ggplot(data=mpg_new, aes(x=drv, y=hwy, fill=drv)) +
geom_boxplot() +
guides(fill=FALSE) + # fill指的是圖例中的fill,和aes中對應(yīng)
labs(title="Boxplot of highway miles per gallon") +
theme_minimal() +
theme(plot.title=element_text(hjust=0.5)) # 這一句讓標(biāo)題居中,ggplot2默認(rèn)的標(biāo)題是左對齊的
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

這里有一個(gè)warning,表示guides(<scale> = FALSE)這種用法已經(jīng)廢棄,這種用法是舊版本ggplot2的用法,新版本的應(yīng)使用guides(<scale> = "none")(我的ggplot2版本是3.3.5),修改后的代碼如下:
ggplot(data=mpg_new, aes(x=drv, y=hwy, fill=drv)) +
geom_boxplot() +
guides(fill="none") + # fill指的是圖例中的fill,和aes中對應(yīng)
labs(title="Boxplot of highway miles per gallon") +
theme_minimal() +
theme(plot.title=element_text(hjust=0.5)) #這一句讓標(biāo)題居中,ggplot2默認(rèn)的標(biāo)題是左對齊的

這里有一點(diǎn)需要注意的是theme_minimal和theme兩個(gè)函數(shù)的順序,由于theme_minimal是一種簡化式的主題設(shè)置,ggplot2遵循圖層疊加的原理,如果將theme_minimal放在theme后面,那么圖標(biāo)標(biāo)題仍然是左對齊,而不是居中顯示。
箱線圖完整版代碼
基本箱線圖的完整代碼
- 橫向箱線圖
library(ggplot2)
ggplot(data=mpg, aes(x="", y=hwy)) +
geom_boxplot() +
labs(x="") # 去除橫坐標(biāo)軸的標(biāo)簽

- 縱向箱線圖
library(ggplot2)
ggplot(data=mpg, aes(x=hwy, y="")) +
geom_boxplot() +
labs(y="") # 去除縱坐標(biāo)軸的標(biāo)簽

分組箱線圖的完整代碼
# 首先將數(shù)據(jù)框中的drv修改為factor類型
library(ggplot2)
mpg_new <- mpg
mpg_new$drv <- as.factor(mpg_new$drv)
# 其次繪圖
ggplot(data=mpg_new, aes(x=drv, y=hwy, fill=drv)) +
geom_boxplot() +
guides(fill="none") + # fill指的是圖例中的fill,和aes中對應(yīng),fill=none表示不顯示圖例
labs(title="Boxplot of highway miles per gallon") + # title是圖表標(biāo)題
theme_minimal() +
theme(plot.title=element_text(hjust=0.5)) #這一句讓圖表標(biāo)題居中,ggplot2默認(rèn)的標(biāo)題是左對齊的
