從ggplot2的qplot()開始,,qplot()的用法與plot()有一定的相似之處,所以如果熟悉plot(),,那么學(xué)習(xí)起來(lái)qplot()也不會(huì)太難,。 數(shù)據(jù)集使用diamonds,首先用summary()查看一下數(shù)據(jù)集的基本特性吧,!
數(shù)據(jù)說(shuō)明:
然后創(chuàng)建一個(gè)含有100條記錄的diamonds的子集dsmall:
[plain]
view plaincopy
[plain] view plaincopy
sample()用來(lái)在所有的diamonds記錄中隨機(jī)抽取100個(gè)作為dsmall 最為基本的用法: qplot()的前兩個(gè)參數(shù)分別是x與y,,給出坐標(biāo)點(diǎn)的橫縱坐標(biāo),data參數(shù)可選,。
[plain]
view plaincopy
[plain] view plaincopy
除了一些顯著的outlier以外,,x與y有顯著的相關(guān)性,同時(shí)在y軸方向上可以觀察到有顯著的斷面,。從圖像上看,,x與y成指數(shù)關(guān)系,所以我們可以對(duì)兩組值進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換后再重新作圖使得趨勢(shì)更為明顯,。qplot()的參數(shù)可以為函數(shù),,所以分別對(duì)x值與y值取對(duì)數(shù):
[plain]
view plaincopy
[plain] view plaincopy
看吧,顯著的線性關(guān)系來(lái)了是不是呢,!當(dāng)然了,,qplot()還可以接受不同變量的組合作為參數(shù),如果我們想研究鉆石的體積與重量之間的關(guān)系(體積約等于x*y*z),,那么:
[plain]
view plaincopy
[plain] view plaincopy
從上圖中我們基本可以推斷出鉆石的密度是一個(gè)基本恒定值,,因?yàn)轶w積與質(zhì)量的比值是大體不變的。 對(duì)坐標(biāo)點(diǎn)顏色,,大小,,形狀以及其他外觀參數(shù)的設(shè)定 在使用qplot()與plot()時(shí)最大的不同之一就是對(duì)于點(diǎn)的顏色,大小,,形狀等性質(zhì)的設(shè)定,。如果使用plot()函數(shù),,你需要自己去將類型變量轉(zhuǎn)換成plot()函數(shù)可以識(shí)別的控制外觀的參數(shù),但是在qplot()中,,這一過(guò)程可以自動(dòng)完成:
[plain]
view plaincopy
[plain] view plaincopy
[plain]
view plaincopy
[plain] view plaincopy
對(duì)于每一個(gè)外觀參數(shù),,都有一個(gè)scale函數(shù)將數(shù)據(jù)與有效地參數(shù)逐一對(duì)應(yīng)起來(lái),例如在對(duì)坐標(biāo)點(diǎn)顏色進(jìn)行改變的例子中,,函數(shù)將J對(duì)應(yīng)為紫色,,而將F對(duì)應(yīng)為綠色。
對(duì)于像diamonds這樣較大的數(shù)據(jù)及而言,,設(shè)置點(diǎn)的透明度可以有效地減少坐標(biāo)點(diǎn)重合的問(wèn)題,。alpha參數(shù)可以設(shè)置為0(完全透明)到1(完全不透明)中的任意值。很多時(shí)候,,alpha的值可以用分?jǐn)?shù)來(lái)表示,。
[plain]
view plaincopy
[plain] view plaincopy
不同的外觀參數(shù)適用于不同的數(shù)據(jù)類型。對(duì)于分類數(shù)據(jù)的區(qū)分最好用顏色與形狀參數(shù),,而連續(xù)數(shù)據(jù)最好用大小表示,,同時(shí),數(shù)據(jù)集的大小也是一項(xiàng)重要的考慮因素,。 為圖像添加平滑線 如果僅僅有數(shù)據(jù)的散點(diǎn)圖,,你可能很難看出數(shù)據(jù)的總體趨勢(shì)。在這種情況下,,給圖像添加平滑線是很好的選擇,。在geom中添加"smooth"便可以輕松的完成這項(xiàng)任務(wù)。給geom參數(shù)設(shè)置一列向量可以組合多個(gè)幾何圖形元素,。
[plain]
view plaincopy
[plain] view plaincopy
平滑的算法也有很多可供選擇: method=“l(fā)oess“:對(duì)于較小數(shù)據(jù)集的默認(rèn)平滑算法,,平滑程度由span參數(shù)來(lái)進(jìn)行設(shè)定。span=0時(shí)線較為彎曲,,span=1時(shí)最為平緩,。
[plain]
view plaincopy
[plain] view plaincopy
由于算法復(fù)雜度的原因,對(duì)于大的數(shù)據(jù)集loess并不是十分適用,。 method="gam":當(dāng)數(shù)據(jù)點(diǎn)大于1000時(shí),,這是默認(rèn)的平滑算法。
[plain]
view plaincopy
[plain] view plaincopy
method="lm":用于線性模型,。默認(rèn)為一條直線,,也可以用formula=y~poly(x,2)設(shè)置為二次函數(shù)擬合,或者加載splines包用formula=y~ns(x,2),第二個(gè)參數(shù)表示自由度,,自由度越高擬合曲線也就越彎曲,。
[plain]
view plaincopy
[plain] view plaincopy
繪制箱線圖和抖動(dòng)圖: 當(dāng)一組數(shù)據(jù)既有分類變量又有連續(xù)變量的時(shí)候,你可能會(huì)對(duì)連續(xù)變量在不同分類下的變化感興趣,箱線圖和抖動(dòng)圖是實(shí)現(xiàn)這一目的的兩種不同方法,。
[plain]
view plaincopy
[plain] view plaincopy
[plain]
view plaincopy
[plain] view plaincopy
直方圖和密度圖: 直方圖和密度圖可以形象的顯示單一變量的分布規(guī)律,,但是難以比較不同類之間分布的區(qū)別。
[plain]
view plaincopy
[plain] view plaincopy
對(duì)于不同分類間的比較,,可以像下面代碼所示加一個(gè)外觀參數(shù)選項(xiàng):
[plain]
view plaincopy
[plain] view plaincopy
柱狀圖: 離散變量的直方圖即柱狀圖,,用geom="bar"來(lái)設(shè)置。
[plain]
view plaincopy
[plain] view plaincopy
時(shí)間序列分析: 用含有時(shí)間數(shù)據(jù)的economics數(shù)據(jù)集,,做失業(yè)率隨時(shí)間變化的圖像:
[plain]
view plaincopy
[plain] view plaincopy
觀察失業(yè)率與周失業(yè)人數(shù)中位數(shù)之間的關(guān)系:
[plain]
view plaincopy
[plain] view plaincopy
分面: 我們已經(jīng)討論了如何利用外觀參數(shù)在同一圖中比較不同分類的差異,。而分面可以將不同的亞類放在不同的圖中進(jìn)行比較:
[plain]
view plaincopy
[plain] view plaincopy
關(guān)于ggplot2的語(yǔ)法基礎(chǔ)- 圖層 首先繪制一張最簡(jiǎn)單的統(tǒng)計(jì)圖:
qplot(displ, hwy, data = mpg, colour = factor(cyl))
量化: 在R中繪圖時(shí),我們往往用下表的格式來(lái)存儲(chǔ)數(shù)據(jù):
但是,,這種格式對(duì)于計(jì)算機(jī)來(lái)說(shuō)是毫無(wú)意義的。我們需要將數(shù)據(jù)單元(如,,單位耗油量,、氣缸數(shù))轉(zhuǎn)化成計(jì)算機(jī)可以顯示的物理單元(如,像素,,顏色),。這個(gè)過(guò)程就被稱作量化。但是,,對(duì)于計(jì)算機(jī)而言有意義的數(shù)據(jù)我們又不一定能理解:顏色用四位十六進(jìn)制數(shù)來(lái)表示,,數(shù)字代表大小,整數(shù)代表一種形狀,。 在這一例中,,我們有三個(gè)需要被量化的外觀參數(shù):水平位置(x),垂直位置(y)以及顏色,。在這一例子中,,對(duì)于位置的量化比較簡(jiǎn)單,因?yàn)槲覀冇玫氖悄J(rèn)的線性量表,。我們只需要將數(shù)據(jù)線性映射到0到1的范圍內(nèi)即可,。這里我們用0到1的范圍而不是實(shí)際的像素值,因?yàn)間gplot2應(yīng)用的grid繪圖體系會(huì)自動(dòng)完成后續(xù)的轉(zhuǎn)化,。最后要將x與y結(jié)合從而定位數(shù)據(jù)點(diǎn),,這一步由坐標(biāo)系統(tǒng)(coord)完成。大多數(shù)情況下會(huì)采用笛卡爾坐標(biāo)系,,但有時(shí)也會(huì)用到極坐標(biāo)系,,繪制地圖時(shí)會(huì)用到球形投影。 顏色的添加過(guò)程更加復(fù)雜一些,,因?yàn)榻Y(jié)果是非數(shù)值型的,。然而,與人眼對(duì)于顏色的識(shí)別機(jī)制類似,計(jì)算機(jī)對(duì)顏色的編碼也由三部分構(gòu)成,,這三部分構(gòu)成一個(gè)三維的顏色空間,。量化顏色也就轉(zhuǎn)化為了找到特定顏色在該空間所對(duì)應(yīng)的點(diǎn)。實(shí)現(xiàn)這一過(guò)程的方法有很多種,,但是由于cyl是一個(gè)離散變量,,我們可以在顏色空間上均勻的找到點(diǎn)來(lái)表示這些顏色,結(jié)果如下圖所示,。對(duì)于連續(xù)變量的轉(zhuǎn)化與此并不相同,。
上表所示的數(shù)據(jù)是計(jì)算機(jī)可以識(shí)別的。我們也將轉(zhuǎn)化過(guò)的外觀參數(shù)添加了上去,。這樣每一個(gè)點(diǎn)都已經(jīng)被很好地定義過(guò),,R就可以將他們一一畫下來(lái)了。 最后,,我們就可以用這些元素畫出想要的圖形了,。一個(gè)完整的圖形往往包含以下幾部分:點(diǎn)所代表的數(shù)據(jù),量表以及坐標(biāo)系和附注,。量表和坐標(biāo)系繪制坐標(biāo)軸以及圖例,,這樣我們就可以從圖中讀出參數(shù)。附注添加圖的名稱和一些背景信息,。 更復(fù)雜的圖形: 了解了簡(jiǎn)單模型以后,,下面我們看看稍微復(fù)雜一點(diǎn)的情況吧。下面的圖形在一開始的基礎(chǔ)上添加了新的元素:分面,,多個(gè)圖層以及統(tǒng)計(jì)數(shù)據(jù),。分面和圖層擴(kuò)展了上面提到的數(shù)據(jù)結(jié)構(gòu):每一個(gè)分面的每一個(gè)圖層都有屬于自己的數(shù)據(jù)集。你可以將它想象成是一個(gè)三維的數(shù)組:分面構(gòu)成了二維平面,,然后圖層給予其在新的維度上的擴(kuò)展,。在這個(gè)例子中,不同圖層上的數(shù)據(jù)是一樣的,,但是從理論上來(lái)講,,不同的圖層中可以有不同的數(shù)據(jù)。 qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
下表是每個(gè)分面上的幾行數(shù)據(jù):
平滑圖層與散點(diǎn)圖圖層的不同之處在于它不顯示原始的數(shù)據(jù),,而是給出了統(tǒng)計(jì)方法處理過(guò)后的結(jié)果,。而且,平滑圖層會(huì)給出擬合的平滑曲線,,這要求額外的步驟:在被轉(zhuǎn)化成其對(duì)應(yīng)的外觀參數(shù)之后,,數(shù)據(jù)將會(huì)由stat進(jìn)行統(tǒng)計(jì)轉(zhuǎn)化,對(duì)其進(jìn)行一些非常有用的處理,。在本例中,,stat對(duì)數(shù)據(jù)進(jìn)行l(wèi)oess平滑處理,,并返回在自變量范圍內(nèi)的預(yù)測(cè)值。(其他有用的統(tǒng)計(jì)轉(zhuǎn)化:1 and 2d binning, group means, quantile regression and contouring) 除了需要更多的步驟對(duì)數(shù)據(jù)進(jìn)行處理,,我們也需要一些額外的步驟對(duì)量表進(jìn)行處理,。因?yàn)槲覀儸F(xiàn)在有多個(gè)數(shù)據(jù)集(不同的分面,不同的圖層),,我們需要保證個(gè)數(shù)據(jù)集間的量表保持一致,。量化的過(guò)程分為三步:轉(zhuǎn)換,訓(xùn)練和對(duì)應(yīng),。我們之前沒(méi)有提到過(guò)轉(zhuǎn)換,,但是在做log-log圖時(shí)有用到過(guò)。在log-log圖中,,數(shù)據(jù)與坐標(biāo)并不是線性對(duì)應(yīng)的,,而是要先經(jīng)過(guò)對(duì)數(shù)轉(zhuǎn)換。 量化在統(tǒng)計(jì)之前,,因此stat是對(duì)量化后的數(shù)據(jù)進(jìn)行的處理,。這樣可以保證在線性坐標(biāo)系中l(wèi)og(x) vs. log(y)與對(duì)數(shù)坐標(biāo)系中x vs. y的一致性。還有很多其他的轉(zhuǎn)換可供選擇:如平方根轉(zhuǎn)換,,對(duì)數(shù)轉(zhuǎn)換和倒數(shù)轉(zhuǎn)換。 統(tǒng)計(jì)過(guò)后,,量表會(huì)在所有的圖層和分面上進(jìn)行調(diào)整,。調(diào)整過(guò)程結(jié)合所有數(shù)據(jù)集以獲得最終的取值范圍。沒(méi)有這一步,,量表只對(duì)局部的數(shù)據(jù)有意義,,而且由于無(wú)法對(duì)應(yīng),我們不能疊加不同的圖層,。有時(shí),,不同分面之間的量表可能不需要調(diào)整(但不同圖層間必須調(diào)整)。 最后,,量表與數(shù)據(jù)一一對(duì)應(yīng),。這是一個(gè)局部過(guò)程:他們形成一個(gè)新的數(shù)據(jù)集。 流程示意圖:
層式語(yǔ)法的構(gòu)成: 在上面的例子中,,我們了解了構(gòu)成圖像的基本元素:數(shù)據(jù),,外觀參數(shù),幾何對(duì)象,,統(tǒng)計(jì)轉(zhuǎn)換,,量表以及分面。我們也探討了一些關(guān)于坐標(biāo)系的內(nèi)容,。而未涉及到位置調(diào)整,,這其實(shí)與處理重疊對(duì)象密不可分。上述元素結(jié)合在一起形成圖層。一個(gè)圖像可能會(huì)有很多圖層,,就像一開始我們將平滑線加到散點(diǎn)圖上一樣,。層式語(yǔ)法將圖層定義為以下幾種元素的組合: ·數(shù)據(jù)集以及數(shù)據(jù)與外觀參數(shù)的對(duì)應(yīng) ·一到多個(gè)圖層,每個(gè)圖層都包含幾何元素,,統(tǒng)計(jì)轉(zhuǎn)換,,位置調(diào)整,并可能有數(shù)據(jù)集及其對(duì)應(yīng)的外觀參數(shù) ·統(tǒng)一的量表 ·坐標(biāo)系統(tǒng) ·分面
簡(jiǎn)介: ggplot2的層式結(jié)構(gòu)使得系統(tǒng)的繪圖成為可能,。你現(xiàn)在已經(jīng)知道了什么是圖層和如何將圖層添加到自己所繪制的圖像上,,但是什么類型的圖形才能最合理的對(duì)數(shù)據(jù)進(jìn)行展示呢?這一部分將根據(jù)不同的功能將圖形進(jìn)行分類介紹,。 在添加新的圖層之前,,最好先想一想你想用這一圖層達(dá)到什么目的。下面是圖層最為常見的幾種作用: ·數(shù)據(jù)的展示,。 原始數(shù)據(jù)的繪制很重要,,我們要手工對(duì)整體以及局部的數(shù)據(jù)結(jié)構(gòu)和異常值進(jìn)行判斷。在數(shù)據(jù)處理的早期階段,,數(shù)據(jù)圖層往往就是唯一的圖層,。 ·統(tǒng)計(jì)結(jié)論的展示。 在我們對(duì)數(shù)據(jù)模型進(jìn)行研究的時(shí)候,,在原始數(shù)據(jù)上同時(shí)添加模型預(yù)測(cè)結(jié)果也是很好的選擇,。我們可以根據(jù)統(tǒng)計(jì)檢驗(yàn)來(lái)評(píng)估模型的好壞。將原始數(shù)據(jù)與模型放在一起,,既有利于我們查看模型的好壞,,又有利于我們對(duì)原始數(shù)據(jù)更加深入的觀察。 ·宏數(shù)據(jù),、背景以及注釋的添加,。 宏數(shù)據(jù)層可以添加背景信息以及注釋,從而讓我們更好地理解原始數(shù)據(jù),。宏數(shù)據(jù)層既可以放在底層又可以放在頂層,。在在繪制地理數(shù)據(jù)時(shí),地圖往往被放在底層,。放在底層的宏數(shù)據(jù)有最小的可視性,,因此不會(huì)干擾你對(duì)原始數(shù)據(jù)的觀察。這就意味著,,如果你關(guān)心宏數(shù)據(jù),,你可以容易地觀察到它,但如果你只想認(rèn)真檢視數(shù)據(jù),,宏數(shù)據(jù)又一點(diǎn)也不會(huì)干擾到你,。 還有一些宏數(shù)據(jù)是為了強(qiáng)調(diào)重要的信息,。你有時(shí)可能要對(duì)一些重要的拐點(diǎn)和異常值添加注釋信息,那你就希望這些東西可以?shī)Z人眼球,,這種情況下,,宏數(shù)據(jù)最好放在最后添加。 基本繪圖類型: 這些幾何元素是ggplot的基礎(chǔ),。他們彼此結(jié)合可以構(gòu)成復(fù)雜的圖像,。他們中的絕大多數(shù)對(duì)應(yīng)特定的繪圖類型。 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) #stat="identity"一定要有的,,不然R會(huì)自己數(shù)個(gè)數(shù)去的 p + geom_line() + opts(title = "geom_line")
數(shù)據(jù)分布的的表示: 顯示數(shù)據(jù)分布規(guī)律的方法有很多,,這取決于數(shù)據(jù)的維數(shù),離散還是連續(xù)數(shù)據(jù),,你是對(duì)條件分布感興趣還是對(duì)聯(lián)合分布感興趣,。 對(duì)于一維的連續(xù)數(shù)據(jù)最重要的分布圖就是直方圖。下圖是diamond depth的分布直方圖,。bin的參數(shù)對(duì)于直方圖的外觀相當(dāng)重要,,可以用binwidth或break參數(shù)進(jìn)行設(shè)置。 depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58, 68)
大數(shù)據(jù)的處理: 散點(diǎn)圖對(duì)于估計(jì)兩個(gè)連續(xù)變量之間的關(guān)系非常有用,。但是如果數(shù)據(jù)量很大的時(shí)候,,點(diǎn)與點(diǎn)之間就會(huì)相互重疊,從而掩蓋兩變量之間真實(shí)的關(guān)系,。有些情況下,,你可能只能在圖中看出數(shù)據(jù)大體的分布范圍,因此任何的結(jié)論都是值得懷疑的,。這一問(wèn)題被稱為“overplotting”,解決方法主要有以下幾種: ·對(duì)于少數(shù)點(diǎn)的overplotting,,可以將點(diǎn)畫的小一些,,或者改變點(diǎn)的形狀。如下圖所示: df <- data.frame(x = rnorm(2000), y = rnorm(2000))
·對(duì)于更大的數(shù)據(jù)集,,可以用alpha參數(shù)設(shè)置數(shù)據(jù)點(diǎn)的透明度,。在R中,透明度的最小值可以設(shè)到1/256,,所以對(duì)于特別大的數(shù)據(jù)集也是無(wú)能為力,。 norm + geom_point(colour = 'black', alpha=1/3)
·如果數(shù)據(jù)本身具有一定的離散性,那么可以隨機(jī)抖動(dòng)數(shù)據(jù)點(diǎn)以減少重疊,。跟透明度設(shè)置聯(lián)合應(yīng)用效果最好,。 td <- ggplot(diamonds, aes(table, depth)) +xlim(50, 70) + ylim(50, 70)
·將數(shù)據(jù)分組并統(tǒng)計(jì)每組內(nèi)數(shù)據(jù)的個(gè)數(shù),然后將個(gè)數(shù)展示出來(lái)(二維直方圖形式),。把圖形分成許多的小塊可以呈現(xiàn)出特殊的視覺效果,。六邊形也是可以的,,bins和binwidth參數(shù)控制小格的數(shù)目和大小。(需要hexbin包) d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) +opts(legend.position = "none")
|
|
來(lái)自: 無(wú)名小卒1990 > 《R》