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)
參考文檔: