簡介:
ggplot2的層式結構使得系統的繪圖成爲可能。你現在已經知道了什麼是圖層和如何將圖層添加到自己所繪製的圖像上,但是什麼類型的圖形才能最合理的對數據進行展示呢?這一部分將根據不同的功能將圖形進行分類介紹。
在添加新的圖層之前,最好先想一想你想用這一圖層達到什麼目的。下面是圖層最爲常見的幾種作用:
·數據的展示。
原始數據的繪製很重要,我們要手工對整體以及局部的數據結構和異常值進行判斷。在數據處理的早期階段,數據圖層往往就是唯一的圖層。
·統計結論的展示。
在我們對數據模型進行研究的時候,在原始數據上同時添加模型預測結果也是很好的選擇。我們可以根據統計檢驗來評估模型的好壞。將原始數據與模型放在一起,既有利於我們查看模型的好壞,又有利於我們對原始數據更加深入的觀察。
·宏數據、背景以及註釋的添加。
宏數據層可以添加背景信息以及註釋,從而讓我們更好地理解原始數據。宏數據層既可以放在底層又可以放在頂層。在在繪製地理數據時,地圖往往被放在底層。放在底層的宏數據有最小的可視性,因此不會干擾你對原始數據的觀察。這就意味着,如果你關心宏數據,你可以容易地觀察到它,但如果你只想認真檢視數據,宏數據又一點也不會干擾到你。
還有一些宏數據是爲了強調重要的信息。你有時可能要對一些重要的拐點和異常值添加註釋信息,那你就希望這些東西可以奪人眼球,這種情況下,宏數據最好放在最後添加。
基本繪圖類型:
這些幾何元素是ggplot的基礎。他們彼此結合可以構成複雜的圖像。他們中的絕大多數對應特定的繪圖類型。
geom_area()
geom_bar()
geom_line()
geom_point()
geom_polygon()
geom_text()
geom_tile()
下面是例子喲:
df <- data.frame(x = c(3, 1, 5),y = c(2, 4, 6),label = c("a","b","c"))
p <- ggplot(df, aes(x, y, label = label)) +xlab(NULL) + ylab(NULL)
p + geom_point() + opts(title = "geom_point")
p + geom_bar(stat="identity") +opts(title = "geom_bar(stat=\"identity\")")
#stat="identity"一定要有的,不然R會自己數個數去的
p + geom_line() + opts(title = "geom_line")
p + geom_area() + opts(title = "geom_area")
p + geom_path() + opts(title = "geom_path")
p + geom_text() + opts(title = "geom_text")
p + geom_tile() + opts(title = "geom_tile")
p + geom_polygon() + opts(title = "geom_polygon")
數據分佈的的表示:
顯示數據分佈規律的方法有很多,這取決於數據的維數,離散還是連續數據,你是對條件分佈感興趣還是對聯合分佈感興趣。
對於一維的連續數據最重要的分佈圖就是直方圖。下圖是diamond depth的分佈直方圖。bin的參數對於直方圖的外觀相當重要,可以用binwidth或break參數進行設置。
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)
大數據的處理:
散點圖對於估計兩個連續變量之間的關係非常有用。但是如果數據量很大的時候,點與點之間就會相互重疊,從而掩蓋兩變量之間真實的關係。有些情況下,你可能只能在圖中看出數據大體的分佈範圍,因此任何的結論都是值得懷疑的。這一問題被稱爲“overplotting”,解決方法主要有以下幾種:
·對於少數點的overplotting,可以將點畫的小一些,或者改變點的形狀。如下圖所示:
df <- data.frame(x = rnorm(2000), y = rnorm(2000))
norm <- ggplot(df, aes(x, y))
norm + geom_point()
norm + geom_point(shape = 1)
norm + geom_point(shape = ".")
·對於更大的數據集,可以用alpha參數設置數據點的透明度。在R中,透明度的最小值可以設到1/256,所以對於特別大的數據集也是無能爲力。
norm + geom_point(colour = 'black', alpha=1/3)
norm + geom_point(colour = 'black', alpha=1/5)
norm + geom_point(colour = 'black', alpha=1/10)
·如果數據本身具有一定的離散性,那麼可以隨機抖動數據點以減少重疊。跟透明度設置聯合應用效果最好。
td <- ggplot(diamonds, aes(table, depth)) +xlim(50, 70) + ylim(50, 70)
td + geom_point()
td + geom_jitter()
jit <- position_jitter(width = 0.5)
td + geom_jitter(position = jit)
td + geom_jitter(position = jit, alpha= 1/10)
td + geom_jitter(position = jit, alpha=1/50)
td + geom_jitter(position = jit, alpha=1/200)
·將數據分組並統計每組內數據的個數,然後將個數展示出來(二維直方圖形式)。把圖形分成許多的小塊可以呈現出特殊的視覺效果。六邊形也是可以的,bins和binwidth參數控制小格的數目和大小。(需要hexbin包)
d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) +opts(legend.position = "none")
d + stat_bin2d()
d + stat_bin2d(bins = 10)
d + stat_bin2d(binwidth=c(0.02, 200))
d + stat_binhex()
d + stat_binhex(bins = 10)
d + stat_binhex(binwidth=c(0.02, 200))