展示數據分佈
有一些幾何對象可以用於展示數據的分佈,具體使用哪種取決於分佈的維度、分佈是連續型或是離散型,以及我們感興趣的是條件分佈還是聯合分佈。對於一維連續型分佈,最重要的幾何對象是直方圖。下圖使用直方圖展示了diamond數據中的depth變量。爲了找到一個表現力強的視圖,多次測試組距的佈局細節是必不可少的。例如,我們可以改變組距寬度(
binwidth
)或者顯式地精確指定切分位置(breaks
)。
以下代碼演示了這些方式:
Part 1
Part 1.1
調整組距
永遠不要指望依靠默認的參數就能對某個具體的分佈獲得一個表現力強的圖形(左上圖)。
(下圖) 對 x 軸進行了放大,xlim = c(55,70)
,並選取了一個更小的組距寬度, binwidth =0.1
,較左圖揭示出了更多細節。我們可以發現這個分佈是輕度右偏的。
同時別忘了在標題中寫上重要參數 (如組距寬度) 的信息。
qplot(depth, data = diamonds, geom = "histogram")
qplot(depth, data = diamonds, geom = "histogram", xlim = c(55, 70), binwidth = 0.1)
Part 1.2
有多種方式可以用來進行分佈的跨組比較:同時繪製多個小的直方圖,facets=.-var
;使用頻率多邊形(frequency polygon),geom="freqpoly"
;或者使用條件密度圖,position="fill"
。
作爲幾何對象的直方圖和頻率多邊形均使用了stat_bin
統計變換。此統計變換生成了兩個輸出變量count
和density
。變量count
爲默認值,因爲它的可解釋性更好。而變量density
基本上相當於count除以count的總數,此變量在我們想要比較不同分佈的形狀而不是數據的絕對大小時更有用。特別地,我們經常使用此變量來比較數據中不同大小子集的分佈。
和分佈相關的許多幾何對象都是以幾何對象(geom)/統計變換(stat)的形式成對出現的。這些幾何對象中大多數的本質都是別名(alias):一個基本幾何對象結合一個統計變換,即可繪製出想要的圖形。表面上看,箱線圖(boxplot)
似乎是一個例外,但在幕後實現上,geom_boxplot
同樣是使用基本的條、線和點組合而成的。
鑽石數據切割和深度分佈的三種視圖。從上至下分別是分面直方圖、條件密度圖和頻率多邊形圖。
調整組距+分面(密度)
depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58, 68)
它們都顯示了出一個有趣的模式:隨着鑽石質量的提高,分佈逐漸向左偏移且愈發對稱。
depth_dist + geom_histogram(aes(y = ..density..), binwidth = 0.1) + facet_grid(cut~.)
累積直方圖
depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill")
頻率多邊形
depth_dist + geom_freqpoly(aes(y = ..density.., colour = cut), binwidth = 0.1)
Part 2
箱線圖可以用於觀察針對一個類別型變量 (如 cut) 取條件時(上圖),或連續型變量 (如 carat) 取條件時(下圖),連續型變量的分佈情況。
library(plyr)
箱線圖
qplot(cut, depth, data = diamonds, geom = "boxplot")
分箱
對於連續型變量,必須設置group
圖形屬性以得到多個箱線圖。
此處使用了group=round_any(carat,0.1, floor)
來獲得針對變量carat以0.1個單位爲大小分箱後的箱線圖。
qplot(carat, depth, data = diamonds, geom = "boxplot",
group = round_any(carat,0.1, floor), xlim = c(0, 3))
抖動型散點圖 jitter
幾何對象jitter
可在二維分佈中有一個離散型變量時繪製出一個較爲粗略的圖形。
總體來說,這種數據打散的處理對小數據集更有效。
上圖展示了mpg數據集中離散型變量class和連續型變量city,下圖則將連續型變量city替換爲離散型變量drv。
geom_jitter=position_jitter+geom_point
:通過在離散型分佈上添加隨機噪聲以避免遮蓋繪製問題,這是一種較爲粗糙的方法。使用以下代碼繪製的圖展示了這樣的一個例子。
qplot(class, cty, data = mpg, geom = "jitter")
qplot(class, drv, data = mpg, geom = "jitter")
密度圖(基於核平滑方法進行平滑後得到的頻率多邊形)
geom_density=stat_density+geom_area
:基於核平滑方法進行平滑後得到的頻率多邊形。請僅在已知潛在的密度分佈爲平滑、連續且無界的時候使用這種密度圖。可以使用參數adjust
來調整所得密度曲線的平滑程度。使用以下代碼繪製的圖展示了這樣一個例子。
密度圖實際上就是直方圖的平滑化版本。它的理論性質比較理想,但難以由圖回溯到數據本身。
上圖爲變量depth的密度圖。下圖爲按照變量cut的不同取值上色的版本。
qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70))
qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70), fill = cut,alpha = I(0.2))