第六篇:R語言資料視覺化之資料分佈圖(直方圖、密度曲線、箱線圖、等高線、2D密度圖)

穆晨發表於2016-04-25

資料分佈圖簡介

        中醫上講看病四診法為:望聞問切。而資料分析師分析資料的過程也有點相似,我們需要望:看看資料長什麼樣;聞:仔細分析資料是否合理;問:針對前兩步工作蒐集到的問題與業務方交流;切:結合業務方反饋的結果和專案需求進行資料分析。

        "望"的方法可以認為就是製作資料視覺化圖表的過程,而資料分佈圖無疑是非常能反映資料特徵(使用者症狀)的。R語言提供了多種圖表對資料分佈進行描述,本文接下來將逐一講解。

繪製基本直方圖

        本例選用如下測試集:

        直方圖的橫軸為繫結變數區間分隔的取值範圍,縱軸則表示變數在不同變數區間上的頻數。繪製時只需將基函式的美學特徵集中配置好需要分析的變數,然後建立新的直方圖圖層即可。R語言示例程式碼如下:

# 基函式
ggplot(faithful, aes(x = waiting)) +
  # 直方圖函式:binwidth設定組距
  geom_histogram(binwidth = 5, fill = "lightblue", colour = "black")

        執行結果:

基於分組的直方圖

        本例選用如下測試集:

        直方圖的分組圖和本系列前面一些博文中講的一些分組圖不同,它不能進行水平方向的堆積 - 這樣看不出頻數變化趨勢;也不能進行垂直方向的堆積 - 這樣同樣看不出趨勢。這裡採用一種新的堆積方法:重疊堆積,R語言實現程式碼如下:

# 預處理:將smoke變數轉換為因子型別
birthwt$smoke = factor(birthwt$smoke)

# 基函式:x設定目標變數
ggplot(birthwt, aes(x = bwt, fill = smoke)) +
  # 直方圖函式:position設定堆積模式為重疊
  geom_histogram(position = "identity", alpha = 0.4)

        執行結果:

        也可以採用分面的方法,R語言實現程式碼如下:

# 預處理1:將smoke變數轉換為因子型別
birthwt$smoke = factor(birthwt$smoke)
# 預處理2:改變因子水平名稱
birthwt$smoke = revalue(birthwt$smoke, c("0" = "No Smoke", "1" = "Smoke"))

# 基函式
ggplot(birthwt, aes(x = bwt)) +
  # 直方圖函式
  geom_histogram(fill = "lightblue", colour = "black") +
  # 分面函式:縱向分面
  facet_grid(smoke ~ .)

        執行結果:

繪製密度曲線

        本例選用如下測試集:

        密度曲線表達的意思和直方圖很相似,因此密度曲線的繪製方法和直方圖也幾乎是相同的。區別僅在於密度曲線的橫軸要繫結到連續型變數,另外繪製函式的名字不同。R語言示例程式碼如下:

# 預處理:將smoke變數轉換為因子型別
birthwt$smoke = factor(birthwt$smoke)

# 基函式:x設定目標變數,fill設定填充色
ggplot(birthwt, aes(x = bwt, fill = smoke)) +
  # 密度曲線函式:alpha設定填充色透明度
  geom_density(alpha = 0.3)

        執行結果:

繪製基本箱線圖

        本例選用如下測試集:

        箱線圖是一種常用資料分佈圖,下圖表示了這種圖中各元素的意義:

        繪製方法是在基函式中將變數分組繫結到橫軸,變數本身繫結到縱軸。此外,為了美觀也可以將分組繫結到fill變數並設定調色盤。R語言示例程式碼如下:

# 基函式
ggplot(birthwt, aes(x = factor(race), y = bwt, fill = factor(race))) +
  # 箱線圖函式
  geom_boxplot() +
  # 顏色標尺
  scale_fill_brewer(palette = "Pastel2")

        執行結果:

往箱線圖新增槽口和均值

        在上一節繪製的基本箱線圖之上,還能進一步繪製以展示更多資訊。

        其中最常見的是為箱子新增槽口,它能更清晰的表示中位數的位置。R語言實現程式碼如下:

# 基函式
ggplot(birthwt, aes(x = factor(race), y = bwt, fill = factor(race))) +
  # 箱線圖函式
  geom_boxplot(notch = TRUE) +
  # 顏色標尺
  scale_fill_brewer(palette = "Pastel2")

        執行結果:

        通過stat_summary()函式,還可以在箱線圖中標記均值點。R語言實現程式碼如下:

# 基函式
ggplot(birthwt, aes(x = factor(race), y = bwt, fill = factor(race))) +
  # 箱線圖函式
  geom_boxplot(notch = TRUE) +
  # 顏色標尺
  scale_fill_brewer(palette = "Pastel2")

        執行結果:

繪製2D等高線

        本例選用如下測試集:

        繪製2D等高線主要是呼叫stat_density()函式。這個函式會給出一個基於資料的二維核密度估計,然後我們可基於這個估計值來判斷各樣本點的"等高"性。接下來首先給出各資料點及等高線的繪製方法,R語言實現程式碼如下:

# 基函式
ggplot(faithful, aes(x = eruptions, y = waiting)) +
  # 散點圖函式
  geom_point() +
  # 密度圖函式
  stat_density2d()

        執行結果:

        也可以通過設定密度函式美學特徵集中的colour引數來給不同密度的等高線著色,R語言實現程式碼如下:

# 基函式
ggplot(faithful, aes(x = eruptions, y = waiting)) +
  # 密度圖函式:colour設定等高線顏色
  stat_density2d(aes(colour = ..level..))

        執行結果:

繪製2D密度圖

        本例選用如下測試集:

        等高線圖也是密度圖的一種,因此繪製密度圖和等高線圖用的是同一個函式:stat_density(),只是它們傳入的引數不同。首先繪製經典柵格密度圖,R語言實現程式碼如下:

# 基函式
ggplot(faithful, aes(x = eruptions, y = waiting)) +
  # 密度圖函式:fill設定填充顏色資料為密度,geom設定繪製柵格圖
  stat_density2d(aes(fill = ..density..), geom = "raster", contour = FALSE)

        執行結果:

        也可以將密度變數對映到透明度來渲染,R語言實現程式碼如下:

ggplot(faithful, aes(x = eruptions, y = waiting)) +
  # 散點圖函式
  geom_point() +
  # 密度圖函式:alpha設定填充透明度資料為密度,geom設定繪製柵格圖
  stat_density2d(aes(alpha = ..density..), geom = "raster", contour = FALSE)

        執行結果:

 

相關文章