本文對應《R語言實戰》第11章:中級繪圖;第16章:高級圖形進階
基礎圖形一章,側重展示單類別型或連續型變量的分布情況;中級繪圖一章,側重展示雙變量間關系(二元關系)和多變量間關系(多元關系)的繪圖;高級繪圖進階一章介紹四種圖形系統,主要介紹lattice和ggplot2包。
=========================================================================
散點圖:
主要內容:把多個散點圖組合起來形成一個散點圖矩陣,以便可以同時瀏覽多個二元變量關系;數據點重疊的解決途徑;通過添加第三個連續型變量,擴展到三維。
散點圖矩陣:
pairs()函數
pairs(~ mpg + disp + drat + wt, data = mtcars, main = “basic scatter plot matrix”)
car包中的scatterplotMatrix()函數:
library(car) scatterplotMatrix( ~ mpg + disp + drat + wt, data = mtcars, spread = FALSE, lty.smooth = 2)
默認添加線性和平滑曲線,主對角線處添加核密度曲線和軸須圖;spread選項設定是否添加展示分散度和對稱信息的直線;lty.smooth設定擬合曲線使用的線形狀。
另一個示例:
library(car) scatterplotMatrix( ~ mpg + disp + drat + wt | cyl, data = mtcars, spread = FALSE, diagonal = “histogram”)
gclus包中的cpairs()函數提供了一個散點圖矩陣變種,可以重排矩陣中變量位置,讓相關度更高的變量更靠近主對角線,並對各單元格進行顏色編碼來展示變量間的相關性大小。這里將主對角線的核密度曲線改成了直方圖,並且直方圖是以cyl為條件繪制的。
library(gclus) mydata <- mtcars[c(1, 3, 5, 6)] mydata.corr <- abs(cor(mydata)) mycolors <- dmat.color(mydata.corr) myorder <- order.single(mydata.corr) cpairs(mydata, myorder, panel.colors = mycolors, gap = .5)
高密度散點圖:數據點重疊的解決途徑之一
smoothScatter()函數可利用核密度估計生成用顏色密度來表示點分布的散點圖:
with(mydata, smoothScatter(x, y, main = “Scatterplot Colored by Smoothed Densities”))
hexbin包中的hexbin()函數將二元變量的封箱放到六邊形單元格中:
library(hexbin) with(mydata, { bin <- hexbin(x, y, xbins = 50) plot(bin, main = “Hexagonal Bining with 10,000 Observations”) })
IDPmisc包中的iplot()函數可以通過顏色來展示點的密度(在某特定點上數據點的數目)
library(IDPmisc) with(mydata, iplot(x, y, main = “Image Scatter Plot with Color Indicating Density”))
三維散點圖:
scatterplot3d包中的scatterplot3d()函數:
library(scatterplot3d) attach(mtcars) scatterplot3d(wt, disp, mpg, main = “Basic 3D Scatter Plot”)
旋轉三維散點圖:
rgl包中的plot3d()函數創建可交互的三維散點圖。Rcmdr包中有類似的函數scatter3d()。
氣泡圖:
先創建一個二維散點圖,然后用點的大小來代表第三個變量的值。注意默認為半徑,如需使用面積需要進行變換。
symbols(x, y, circle = radius) #使用面積表示第三個值 symbols(x, y, circle = sqrt(z/pi))
折線圖:
可用plot(x, y, type = )或者lines(x, y, type = )函數來創建
p |
只有點 |
l |
只有線 |
o |
實心點和線(即線覆蓋在點上) |
b, c |
線連接點(c時不繪制點) |
s, S |
階梯線 |
h |
直方圖式的垂直線 |
n |
不生成任何點和線(通常用來為后面的命令創建坐標軸) |
相關圖:
將相關系數矩陣進行可視化。corrgram包中的corrgram()函數:
library(corrgram) corrgram(mtcars, order = TRUE, lower.panel = panel.shade, upper.panel = panel.pie, text.panel = panel.txt)
上三角的單元格用餅圖展示了相同的信息,同樣的,藍色表示正相關,紅色表示負相關;相關性大小由被填充的餅圖塊的大小來展示;正相關性將從12點鍾處開始順時針填充餅圖,負相關性則逆時針方向填充餅圖。圖形意義:默認情況下,下三角單元格中,藍色和從左下指向右上的斜杠表示單元格中的兩個變量呈正相關;紅色和從左上指向右下的斜杠表示變量呈負相關;色彩越深,飽和度越高,變量相關性越大。
order = TRUE時相關矩陣將使用主成分分析法對變量重排序,可以使二元變量的關系模式更為明顯。panel可以設定面板使用的元素類型:lower.panel和upper.panel設置主對角線下和上的元素類型;text.panel和diag.panel控制主對角線元素類型,詳細值如下表:
位置 |
面板選項 |
描述 |
非對角線 |
panel.pie |
用餅圖的填充比例表示相關性大小 |
panel.shade |
用陰影的深度來表示相關性大小 |
|
panel.ellipse |
繪制置信橢圓 |
|
panel.pts |
平滑擬合曲線繪制散點圖 |
|
主對角線 |
panel.minmax |
輸出變量的最大最小值 |
panel.txt |
輸出變量的名字 |
馬賽克圖:
用於展示類別型變量間的關系。馬賽克圖中,嵌套矩形面積正比於單元格頻率,其中該頻率即多維列聯表中的頻率。顏色和陰影可表示擬合模型的殘差值。常用vcd包中的mosaic()函數實現(比基礎安裝中的mosaicplot()函數有更多的擴展功能)。
圖形中隱藏大量信息,可以關注各個矩形的相對寬度和高度來解釋。顏色和陰影提供了擬合模型的殘差值:藍色代表在假定類別與條件無關的情況下,該類別的數量高於預期值,紅色則相反。
=========================================================================
R中有四種圖形系統:基礎圖形系統、grid圖形系統、lattice包、ggplot2包。
lattice包:
通常格式:graph_function(formula, data = , options)
graph_function為函數名,formula指定要展示的變量和條件變量;data指定數據框;options是逗號分隔參數,修改格式等。
一般的,下表中小寫字符代表數值型變量,大寫字符代表類別型變量。
圖形類型 |
函數 |
表達式示例 |
三維等高線圖 |
contourplot() |
z ~ x*y |
三維水平圖 |
levelplot() |
z ~ y*x |
三維散點圖 |
cloud() |
z ~ x*y|A |
三維線框圖 |
wireframe() |
z ~ y*x |
條形圖 |
barchart() |
x ~ A或A ~ x |
箱線圖 |
bwplot() |
x ~ A或A ~ x |
點圖 |
dotplot() |
~ x | A |
直方圖 |
histogram() |
~ x |
核密度圖 |
densityplot() |
~ x | A*B |
平行坐標圖 |
parallel() |
dataframe |
散點圖 |
xyplot() |
y ~ x | A |
散點圖矩陣 |
splom() |
dataframe |
帶狀圖 |
stripplot() |
A ~ x或x ~ A |
options:
aspect |
數值,設定每個面板中圖形的寬高比 |
col/pch/lty/lwd |
向量,分別設定圖形中的顏色、符號、線條類型和線寬 |
Groups |
用來分組的變量(因子) |
index.cond |
列表,設定面板的展示順序 |
key(或auto.key) |
函數,添加分組變量的圖例符號 |
layout |
兩元素數值型向量,設定面板的擺放方式(行數和列數); 如有需要,可以添加第三個元素,以指定頁數 |
Main/sub |
字符型向量,設定主標題和副標題 |
Panel |
函數,設定每個面板要生成的圖形 |
Scales |
列表,添加坐標軸標注信息 |
Strip |
函數,設定面板條帶區域 |
Split/position |
數值型向量,在一頁上繪制多幅圖形 |
Type |
字符型向量,設定一個或多個散點圖的繪圖參數 (如p=點,l=線,r=回歸,smooth=平滑曲線,g=格點) |
xlab/ylab |
字符型向量,設定橫軸和縱軸標簽 |
xlim/ylim |
兩元素數值型向量,分別設定橫軸和縱軸的最小和最大值 |
高級繪圖中表達式的通常格式:
y ~ x | A * B
豎線左邊的變量稱為主要變量,右邊稱為條件變量。主要變量即為圖形的兩個坐標軸,其中y在縱軸上,x在橫軸上。變形:單變量繪圖,用 ~ x 即可;三維繪圖,用z ~ x*y;多變量繪圖,使用數據框代替y ~ x即可。
條件變量的用法:~ x | A表示因子A各個水平下數值型變量x的分布情況;y ~ x | A * B表示因子A和B各個水平組合下數值型變量x和y之間的關系。A ~ x表示A在縱軸上展示,x在橫軸上展示。
條件變量為連續型變量時,要先將其轉換成離散型變量。一種方法是使用cut()函數,另外可以使用lattice包中的函數將連續型變量轉化為瓦塊(shingle)數據結構,這樣,連續型變量可以被分割為一系列(可能)重疊的數值范圍。
myshingle <- equal.count(x, number = #, overlap = proportion) #連續型變量x將會被分割為#個區間,重疊度為proportion,每個區間內觀測數相等
這樣就可以使用這個變量作為條件變量了
分組變量:將每個條件變量產生的圖形疊加到一起,在同一幅圖中展示,只需要將條件變量放到繪圖函數中的group聲明中即可。
面板函數:自定義面板的各個選項,然后在繪制圖形的函數中調用即可。
圖形參數:查看默認的圖形參數使用trellis.par.get()函數;修改這些參數使用trellis.par.set()函數;show.settings()函數可以展示當前的圖形參數設置情況。
頁面擺放:lattice無法使用par()函數,因此需要將圖形存儲到對象中,然后利用plot()函數中的split = 或position = 選項來進行控制。
#split方法 library(lattice) graph1 <- histogram(…) graph2 <- densityplot(…) plot(graph1, split = c(1,1,1,2)) plot(graph2, split = c(1,2,1,2), newpage = FALSE) #position方法 library(lattice) graph1 <- histogram(…) graph2 <- densityplot(…) plot(graph1, position = c(0, .3, 1, 1)) plot(graph2, position = c(0, 0, 1, .3), newpage = FALSE)
split的方法,將第一幅圖放置到第二幅圖的上面:第一個plot()函數把頁面分割為一列兩行的矩陣,並將圖形放置到第一列第一行中;第二個plot()函數將圖形放置到第一列第二行中,由於plot()函數默認啟動新的頁面,因此使用newpage = FALSE選項。position方法,設定坐標,原點位於頁面左下角,x軸和y軸維度范圍為(0, 1),position = (xmin, ymin, xmax, ymax)。
ggplot2包:
只介紹一種較為簡單的繪圖方式:qplot()函數
qplot(x, y, data = , color = , shape = , size = , alpha = , geom = , method = , fomula = , facets = , xlim = , ylim = , xlab = , ylab = , main = , sub = )
選項 |
描述 |
alpha |
元素重疊的alpha透明度,數值為0(完全透明)到1(完全不透明)間的分數 |
color/shape/size/fill |
把變量的水平與符號顏色、形狀或大小聯系起來,color為線的顏色,fill為填充顏色 |
data |
指定一個數據框 |
facets |
指定條件變量,創建一個柵欄圖 |
geom |
設定定義圖形類型的幾何形狀 |
main/sub |
字符向量,設定標題或副標題 |
method/formula |
若geom = “smooth”,則會默認添加一條平滑擬合曲線和置信區間,觀測數大於1000時,需要調用更高效的平滑擬合算法,包括回歸lm、廣義可加模型gam、穩健回歸rlm。formula指定擬合形式,注意formula = y ~ x使用的就是字母y和x而不是變量名。 對於method = “gam”要加載mgcv包,method = “rml”要加載MASS包 |
x/y |
指定擺放在水平軸和豎直軸的變量。對於單變量圖形(如直方圖),則省略y |
xlab/ylab |
字符向量,設定橫軸和縱軸標簽 |
xlim/ylim |
二元素數值型向量,分別指定橫軸和縱軸的最小值和最大值 |
交互式圖形:
主要介紹的軟件包:playwith, latticist, iplots, rggobi
基礎安裝中的交互:鑒別點函數:identify()函數
plot(mtcars$wt, mtcars$mpg) identify(mtcars$wt, mtcars$mpg, labels = row.names(mtcars))
許多包中的圖形函數都可以應用該方法進行標注,但是lattice或ggplot2圖形無法使用該方法。
playwith包:
playwith()包允許用戶識別和標注點、查看一個觀測所有的變量值、縮放和旋轉圖形、添加標注(文本、箭頭、線條、矩形、標題和標簽)、修改視覺元素(顏色、文本大小等)、應用先前存儲的圖形風格,以及以多種格式輸出圖形結果。
playwith()既對R基礎圖形有效,也對lattice和ggplot2圖形有效,但是並不是所有都可以用。
latticist包:
www.deducer.org
可以與playwith整合到一起:
library(latticist) mtcars$cyl <- factor(mtcars$cyl) mtcars$gear <- factor(mtcars$gear) latticist(mtcars, use.playwith = TRUE)
作用是可以通過柵欄圖方式探索數據集。
iplots包:
http://rosuda.org/iplots/
playwith包和latticist包只能與單幅圖形交互,而iplots包提供的交互方式則有所不同。該包提供了交互式馬賽克圖、柱狀圖、箱線圖、平行坐標圖、散點圖和直方圖,以及顏色刷,並可將他們結合在一起繪制。也就是說可通過鼠標對觀測點進行選擇和識別,並且對其中一幅圖形的觀測點突出顯示時,其他被打開的圖形將會自動突出顯示相同的觀測點。
ibar() |
交互式柱狀圖 |
ibox() |
交互式箱線圖 |
ihist() |
交互式直方圖 |
imap() |
交互式地圖 |
imosaic() |
交互式馬賽克圖 |
ipcp() |
交互式平行坐標圖 |
iplot() |
交互式散點圖 |
roggobi包:
開源軟件GGobi(www.ggobi.org)
用法:首先要下載該軟件,然后在R中安裝rggobi包,即可利用R中運行GGobi