ggplot2圖形系統的核心理念是把繪圖與資料分離,把資料相關的繪圖與資料無關的繪圖分離,按圖層作圖。ggplot2可以把繪圖拆分成多個圖層,且能夠按照順序建立多重圖形。
使用ggplot2包建立圖形時,每個圖形都是由函式ggplot()建立的,提供繪圖的資料和對映:
- 資料(data):資料框物件
- 對映(mapping):由aes()函式來設定對映
由幾何物件來控制繪製的幾何圖形,通過符號“+”來增加圖形的元素,這使得繪製圖形的過程結構化,同時使繪圖更具靈活性。
在ggplot2中, 圖形語法中至少包括瞭如下幾個圖形部件,每一個部件可以是一個圖層:
- 幾何物件(geom)
- 統計變換(stats)
- 標度(scale)
- 座標系(coord)
- 分面(facet)
- 主題(theme)
這些元件之間是通過“+”, 以圖層(layer)的方式來粘合構圖的,可以這樣理解ggplot2中的圖層:每個圖層可以代表一個圖形元件, 這些圖形元件以圖層的方式疊加在一起構成一個繪圖的整體,在每個圖層中的圖形元件又可以分別設定資料、對映或其他相關引數,因此元件之間又是具有相對獨立性的。
在開始正文之前,推薦大家閱讀《ggplot2入門與進階(上)》,這篇文章寫的非常好。
一,資料和對映
使用函式ggplot()初始化圖形物件,並指定繪製圖形的資料集和座標軸的對映,在ggplot()函式中,指定資料集的預設設定,便於後續圖形選項的操作:
ggplot(data = NULL, mapping = aes())
兩個重要引數:
- data: 用於指定要用到的資料來源,必須使資料框型別
- mapping:使用aes()函式指定每個變數的角色,除x和y之外的其他引數,例如,size、color、shape等,必須採用name=value的形式。
在ggplot中設定的對映是預設對映關係,其他圖層中可以繼承該對映關係,或修改對映關係。
1,資料
在ggplot2中, 所接受的資料集必須為資料框(data.frame)格式,在下面的小節中,使用資料集mtcars作為ggplot的輸入:
library(ggplot2)
data("mtcars")
2,對映
對映是指為資料集中的資料關聯到相應的圖形屬性過程中一種對應關係,ggplot2通過aes()函式來指定對映,把圖形屬性和資料關聯起來。
aes是英語單詞 aesthetics 的縮寫,中文意思是美學,aes用於指定圖形屬性。
aes(x, y, ...)
aes()函式中常見的對映選項是:
- x和y:用於指定x軸和y軸對映的變數
- color:對映點或線的顏色
- fill:對映填充區域的顏色
- linetype:對映圖形的線形(1=實線、2=虛線、3=點、4=點破折號、5=長破折號、6=雙破折號)
- size:點的尺寸和線的寬度
- shape:對映點的形狀
- group:預設情況下ggplot2把所有觀測點分為了一組, 如果需要把觀測點按額外的離散變數進行分組處理, 必須修改預設的分組設定
注意,對映和設定是不同的:
- 對映是將一個變數中離散或連續的資料與一個圖形屬性中以不同的引數來相互關聯,
- 而設定能夠將這個變數中所有的資料統一為一個圖形屬性。
p <- ggplot(mtcars, aes(wt, mpg)) p + geom_point(color = "blue") #設定散點的顏色為藍色 p + geom_point(aes( color = "blue"))
最後一行語句為錯誤的對映關係, 在aes中, color = “blue”的實際意思是把”blue”當為一個變數, 用這個變數裡的資料去關聯圖形屬性中的引數, 因為”blue”只含有一個字元變數, 預設情況下為離散變數, 按預設的顏色標度標記為桃紅色。
3,分組
分組(group)是ggplot2中對映關係的一種,預設情況下ggplot2把所有觀測點分為了一組,如果需要把觀測點按指定的因子進行分組處理,必須修改預設的分組設定。
ggplot(data = mtcars, mapping = aes(x = wt, y = hp, group = factor(gear))) + geom_line()
分組也可以通過對映把視覺特徵(shape、color、fill、size和linetype等)設定為變數來實現分組,分組通常使用因子來實現,這就要求在資料集中存在因子變數,用於對資料分類,實現圖形的分組。
ggplot(data=ds,aes(x=var1,y=var2,fill=var3,shape=var4))+ geom_point()
二,幾何物件(geom)和統計變換(stat)
幾何物件控制圖層的渲染和生成的影像型別,例如,geom_point()會生成散點圖,而geom_line會生成折線圖。統計變換是對資料進行統計,通常以某種方式對資料資訊進行彙總, 例如通過stat_smooth()新增光滑曲線。
每一個幾何物件都有一個預設的統計變換, 並且每一個統計變換都有一個預設的幾何物件。在ggplot2的官方文件中, 已對ggplot2中所有的geom和stat元件進行了彙總, 更詳細的內容, 可直接點開相應圖形元件所對應的連結。
函式ggplot()可以設定圖形,但是沒有視覺輸出,需要使用一個或多個幾何函式向圖形中新增幾何物件(geometric,簡寫為geom),包括點(point)、線(line)、條(bar)等,而新增幾何圖形的格式十分簡單,通過符號“+”把幾何圖形新增到plot中:
ggplot()+
geom_xxx()
例如,使用geom_point()函式輸出點狀圖形,並接收以下美學引數:alpha、colour、fill、group、shape、size和stroke,
ggplot(data=mtcars, aes(x=wt,y=mpg))+ geom_point(color="red",size=1,shape=0)
常用的圖形引數是:
- color:對點、線和填充區域的邊界進行著色
- fill:對填充區域著色
- alpha:演示的透明度,從透明(0)到不透明(1)
- linetype:圖案的線條(1=實線、2=虛線、3=點、4=點破折號、5=長破折號、6=雙破折號)
- size:點的尺寸和線的寬度
- shape:點的形狀(和par()函式的pch引數相同)
- position:繪製條形圖和點等物件的位置
- binwidth:分箱的寬度
- notch:表示方塊圖是否應該有缺口
- sides:地毯圖的位置("b"=底部、"l"=左部、"r"=右部、"bl"=左下部,等)
- width:箱線圖的寬度
三,標度(scale)
標度控制著資料到圖形屬性的對映,更重要的一點是標度將我們的資料轉化為視覺上可以感知的東西, 如大小、顏色、位置和形狀。所以通過標度可以修改座標軸和圖例的引數。關於標度,請檢視官方文件:Scales 。
最常用的標度是:標籤、圖形選項(顏色、size、形狀、線形等)和座標軸
1,標籤
可以通過函式labs()來指定圖形的標題(title),子標題(subtitle),座標軸的標籤(x,y)等,並可以指定標籤的美學選項:
labs(...)
引數是美學(aesthetic)選項,使用name=value模式,可以使用的選項是:
- 指定文字:title、subtitle、caption、x和y
- 指定美學選項:color、size等
2,自定義圖形選項
scale_colour_manual()
scale_fill_manual()
scale_size_manual()
scale_shape_manual()
scale_linetype_manual()
scale_alpha_manual()
scale_discrete_manual()
3,座標軸
標度是區分離散和連續變數的,標度用於將連續型、離散型和日期-時間型變數對映到繪圖區域,以及構造對應的座標軸。
四,座標系
座標系統確定x和y美學如何組合以在圖中定位元素。預設的座標系是笛卡爾座標系,coord_cartesian(),笛卡爾座標系是最常用的座標系,函式coord_flip() 用於反轉笛卡爾座標系,把x軸和y軸對調。
五,刻面(facet)
分組和刻面都用於對資料分組,便於觀察各自的規律、趨勢和模式,不同的是,分組是把圖形繪製到一個大的圖形中,通過美學特徵來區分,而刻面是把圖形繪製到不同的網格中。
刻面是在一個畫布上分佈多幅圖形,這一過程需要先把資料劃分為多個子集, 然後把每個子集依次繪製到畫布的不同皮膚中。
ggplot2提供兩種分面型別:網格型(facet_grid)和封面型(facet_wrap)。
- 網格刻面生成的是一個2維的皮膚網格, 皮膚的行與列通過變數來定義, 本質是2維的;
- 封裝刻面則先生成一個1維的皮膚條塊, 然後再分裝到2維中, 本質是1維的。
六,主題
主題(Theme)用於控制圖形中的非資料元素外觀,不會影響幾何物件和標度等資料元素,主題主要是對標題、座標軸標籤、圖例標籤等文字調整, 以及網格線、背景、軸須的顏色搭配。
ggplot圖形的主題(theme)元素主要分為5大類:圖形(plot)、皮膚(panel)、座標軸(axis)、圖例(Legend)和帶形(Strip),通過theme()函式來統一控制圖形的美學和文字特徵,可以用於調整字型,背景色,前景色和網格線等。
對於皮膚的網格線,分為主線(panel.grid.major)和 次線(panel.grid.minor ),使用者可以根據繪製圖形的需要,顯示或隱藏。
關於主題的詳細用法,請檢視官方文件:Modify components of a theme 和 Theme elements。
Theme()中每一個引數的賦值,可以通過元素函式來實現,margin()
函式用於指定元素的邊界,element_xxx用於控制矩形,線條和文字的填充(fill)、顏色,size、形狀等
margin(t = 0, r = 0, b = 0, l = 0, unit = "pt")
element_blank()
element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL, inherit.blank = FALSE)
element_line(colour = NULL, size = NULL, linetype = NULL, lineend = NULL, color = NULL, arrow = NULL, inherit.blank = FALSE)
element_text(family = NULL, face = NULL, colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, color = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE)
參考文件: