R繪圖 第四篇:繪制箱圖(ggplot2)


箱線圖通過繪制觀測數據的五數總括,即最小值、下四分位數、中位數、上四分位數以及最大值,描述了變量值的分布情況。箱線圖能夠顯示出離群點(outlier),離群點也叫做異常值,通過箱線圖能夠很容易識別出數據中的異常值。

箱線圖提供了識別異常值的一個標准:

異常值通常被定義為小於 Q- l.5 IQR 或者 大於 Q+ 1.5 IQR的值,QL稱為下四分位數, Qu稱為上四分位數,IQR稱為四分位數間距,是Qu上四分位數和QL下四分位數之差,其間包括了全部觀察值的一半。

箱線圖的各個組成部分的名稱及其位置如下圖所示:

箱線圖可以直觀地看出數據集的以下重要性值:

中心位置:中位數所在的位置就是數據集的中心;

散布程度:箱線圖分為多個區間,區間較短時,表示落在該區間的點較集中;

對稱性:如果中位數位於箱子的中間位置,那么數據分布較為對稱;如果極值離中位數的距離較大,那么表示數據分布傾斜

一,繪制箱線圖

繪制箱線圖比較簡單,通常情況下,我們使用ggplot和geom_boxplot繪制箱線圖,在下面的小節中,我們使用ToothGrowth作為示例數據:

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
head(ToothGrowth)

   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

1,繪制基本的箱線圖

使用geom_boxplot繪制基本的箱線圖:

library(ggplot2)

ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_boxplot()

2,設置離群點(outlier)

geom_boxplot函數中有outlier開頭的多個參數,用於修改離群點的屬性:

  • outlier.colour:離群點的顏色
  • outlier.fill:離群點的填充色
  • outlier.shape:離群點的形狀
  • outlier.size:離群點的大小
  • outlier.alpha:離群點的透明度

 示例代碼如下:

ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_boxplot(outlier.colour="red", outlier.shape=8, outlier.size=4)

3,設置箱線圖的顏色

通過aes(color=)函數可以為每個箱線圖設置一個顏色,而箱線圖的划分是通過 aes(color=)函數的color參數來划分的,划分箱線圖之后,scale_color_*()函數才會起作用,該函數用於為每個箱線圖設置前景色和填充色,顏色是自定義的:

scale_fill_manual() #for box plot, bar plot, violin plot, etc
scale_color_manual() #for lines and points

以下代碼設置箱線圖的前景色:

ggplot(ToothGrowth, aes(x=dose, y=len,color=dose)) + 
  geom_boxplot()+
  scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))

4,設置Legend 的位置

 說明(Legend)是對箱線圖的解釋性描述,默認的位置是在畫布的右側中間位置,可以通過theme()函數修改Legend的位置,lengend.position的有效值是top、right、left、bottom和none,默認值是right:

p <- ggplot(ToothGrowth, aes(x=dose, y=len,color=dose)) + 
  geom_boxplot()+
  scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))

p + theme(legend.position="top")
p + theme(legend.position="bottom")
p + theme(legend.position="none") # Remove legend

5,設置箱線圖的標題和坐標軸的名稱

通過labs設置箱線圖的標題和坐標的名稱,參數title用於設置標題,x和y用於設置x軸和y軸的標簽:

ggplot(ToothGrowth, aes(x=dose, y=len,color=dose)) + 
  geom_boxplot()+
  scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))+
  theme(legend.position="right")+
  labs(title="Plot of length  per dose",x="Dose (mg)", y = "Length")

6,繪制箱線圖的散點

通過geom_point函數,向箱線圖中添加點,geom_jitter()函數是geom_point(position = "jitter")的包裝,binaxis="y"是指沿着y軸進行分箱:

# Box plot with dot plot
p + geom_dotplot(binaxis='y', stackdir='center', dotsize=1)
# Box plot with jittered points
# 0.2 : degree of jitter in x direction
p + geom_jitter(shape=16, position=position_jitter(0.2))

7,旋轉箱線圖

函數coord_flip()用於翻轉笛卡爾坐標系,使水平變為垂直,垂直變為水平,主要用於把顯示y條件x的geoms和統計信息轉換為x條件y。

p <- ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_boxplot() + 
  coord_flip()

二,異常值檢測

繪制散點圖,並標記異常值:

ggplot(ToothGrowth, aes(x=dose, y=len,color=dose)) + 
  geom_boxplot(outlier.colour="red", outlier.shape=7,outlier.size=4)+
  scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))+
  theme(legend.position="right")+
  labs(title="Plot of length  per dose",x="Dose (mg)", y = "Length")+
  geom_dotplot(binaxis='y', stackdir='center', stackratio=1.5, dotsize=1.2)

當箱線圖中的異常值過多時,繪制的圖中,箱子被壓成一條線,無法觀察到數據的分布,這就需要移除異常值,只保留適量的離群點,常見的做法是改變ylim的范圍,代碼是:

# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
ggplot() + gemo_box() + coord_cartesian(ylim = ylim1*1.05)

三,箱圖的排序

對箱圖的排序,實際上,是對箱圖的x軸因子進行排序,而因子的順序是由因子水平決定的。在對箱圖進行排序時,可以按照數據的均值對x軸因子水平進行排序,重置數據框x軸的因子水平,就可以實現箱圖的排序:

x_order <- df %>%
  group_by(x_factor) %>%
  summarize(mean_y=mean(y_value))%>%
  ungroup()%>%
  arrange(desc(mean_y))%>%
  select(x_factor);

df$x_factor<-factor(df$x_factor,levels=as.character(x_order$x_factor),ordered = TRUE)

 

 

參考文檔:

ggplot2 box plot : Quick start guide - R software and data visualization

A box and whiskers plot (in the style of Tukey)

MBA lib 箱線圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM