天天看點

《R繪圖系統(第2版)》一1.2 R繪圖系統的結構

本節書摘來自異步社群《r繪圖系統(第2版)》一書中的第1章,第1.2節,作者【紐西蘭】paul murrell,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

這一節簡要闡述了r 繪圖函數庫中的函數是如何組織的,以使使用者能夠了解怎樣開始尋找一個特定的函數。

在r繪圖工具庫中占據核心地位的是grdevices包,該包同時也被稱為繪圖引擎。grdevices包提供了一系列r中的基本繪圖函數,如選擇顔色和字型以及選擇繪圖輸出格式。盡管幾乎所有的r繪圖應用都使用了grdevices包,這其中絕大部分隻需要通過學習一些基本知識即可掌握,是以關于該包中繪圖函數的細節被安排在本書第3部分介紹。

在繪圖引擎的基礎上直接搭建了兩個包:graphics包和grid包。這兩個包代表着兩個巨大的不相容的繪圖系統,并将r的繪圖功能從主體上分割成了兩個不同的部分。

graphics包,也被稱為傳統繪圖系統,提供了建立一系列豐富的通用圖形所用到的完整函數集,以及供使用者在自定義圖中能夠控制到非常具體的細節所需要的繪圖函數。這些内容在本書第1部分具體介紹。

grid 包則提供了一系列不同的基本繪圖工具。它并沒有提供繪制完整圖形的函數,是以通常并不直接用于繪制統計圖形。相反,人們廣泛使用基于grid之上所開發的繪圖包中的函數,特别是其中的lattice 包和ggplot2包。這3個包,建構起了r grid繪圖系統中的主體,關于這3個包的介紹安排在本書的第2部分。

此外,還有許多其他的繪圖函數包是基于graphics包或者grid包的。例如,maps 包提供了在傳統繪圖系統中繪制地圖所需的函數,pixmap包提供了可以嵌入外部光栅圖像,特别是graphics包内部繪制的圖形所需要的函數,而grimport包則提供了能夠包含外部矢量圖像,特别是通過grid繪圖系統所繪制的圖形所用到的函數。圖1.14展示了從這些繪圖包中選取的一小部分。本書的第4部分将廣泛選取r的一些擴充包給予介紹。

有一些包則相當程度的獨立于r中主要的繪圖工具庫。這些包提供了r 與第三方繪圖系統的接口,例如用于繪制複雜三維圖形的opengl圖形庫(rgl 包),以及繪制動态互動圖形系統的圖形庫(rggobi 和 iplots 包)。這些包将在本書第四部分作基本介紹。

最後,還有一些為r提供了額外繪圖裝置的函數包。這些包使得r 圖形輸出能夠嵌入到其他系統,例如,tikzdevice包可以繪制嵌入到latex檔案的圖形,javagd 包提供了在java應用内實作r圖形輸出的功能。在本書第3部分會提及這些包。

r繪圖系統與繪圖程式包可以分成兩個主要類型:用于繪制完整圖形的進階函數和在已經存在的圖形上添加額外圖形的低級函數。

傳統繪圖系統以及在其之上建構的繪圖程式包,提供了目前r中可用進階繪圖函數的主體。最重要的例外是lattice包(見第4章)和ggplot2包(見第5章),這兩個包提供了基于grid繪圖系統的完整繪圖函數。同時,傳統繪圖系統和grid 繪圖系統也提供了許多低級繪圖函數。

大多數繪圖包中的函數都用來繪制完整的圖形,并且通常用于提供針對某種特定類型分析或者專門領域研究所需的繪圖功能。例如:在hexbin包中提供了用于海量資料可視化的六邊形面元化繪圖功能(見12.5節);maps包提供了地理資料可視化的繪圖函數(見14.1.1小節);scatterplot3d提供了繪制多種三維圖形的繪圖功能(見16.5節)。如果讀者有繪制某種特定類型圖形的需要,很可能已經有人編寫了實作這類功能的函數。例如,在r-help郵件清單中經常有人詢問如何在散點圖或者條形圖中增加誤差條,實作該功能的方法有很多種,例如,使用傳統的arrows()函數,使用gplots包中的plotci()函數或者使用hmic函數包中的errbar()函數。r提供了一些用來連接配接r首頁站點的搜尋工具以幫助使用者尋找為實作某個特定目的所需要的專業函數。在sos程式包中,就通過函數findfn() 提供了一個友好的網絡接口。

《R繪圖系統(第2版)》一1.2 R繪圖系統的結構

圖1.14 r圖形系統的結構。深灰色背景的包構成了圖形系統的核心。本書第1部分介紹了graphics包,第2部分會介紹grid、lattice和ggplot2包,第3部分會介紹grdeivces包。淺灰色背景的包是對核心系統作擴充的示例,會在第4部分介紹。有一些包提供了獨立的圖形系統,我們會在幾個代表性的包中詳細介紹這些圖形系統,它們和核心圖形包沒有關系。

r中存在着兩個不同的繪圖系統,傳統繪圖系統與grid繪圖系統,這就帶來了一個問題,在什麼時侯選用什麼樣的繪圖系統。

對于某些以通過簡單函數調用來繪制完整圖形為目的的使用者來說,如何選擇繪圖系統大多數時候依賴于需要繪制何種類型的圖形。如果沒有在現有圖形上添加更多圖形的需要,對繪圖系統的選擇很大程度上是彼此不相幹的。

如果有在現有圖形上添加更多圖形的需要,使用者則需要知道該用何種繪圖系統繪制初始圖形。通常,應該使用同一個繪圖系統添加額外的圖形(盡管在第19章中介紹的gridbase程式包中,提供了一種繞開這種限制的方法)。

對一系列通用标準圖形來說,可以通過使用lattice、ggplot2和graphics包提供的函數來繪制3種不同樣式的該類圖形。作為通用準則,lattice和ggplot2包所預設的樣式通常被優先使用,因為它們都是根據人們的認知規律而開發設計進而使得圖形能夠更好地傳遞資訊。

對于多中繼資料集的可視化,lattice和ggplot2包也提供了更多複雜的支援,例如向一個簡單的兩個連續變量的散點圖中添加内容,可以通過對資料内不同子集使用不同線段或者使用不同的圖形符号來表示,或者對不同的子集繪制單獨圖形的方式來實作。

當然,使用lattice和ggplot2包中的進階特性的代價是,使用者需要付出很大的努力學習并熟悉這些包所對應的知識體系。對于lattice包,使用者需要專門學習如何顯式的定制預設樣式,而對于 ggplot2 ,則需要一段時間去适應 ggplot2 的設計理念,盡管掌握了這種理念就可以設計出更多一緻且強大的圖形樣式。

總之,關于如何選擇繪圖系統,使用者可能會從快速上手的角度選擇傳統繪圖系統,但是從長遠看,lattice和ggplot2包能夠提供更多有效并且複雜的選項。

對于更多專項繪圖,例如繪制地圖或者節點-邊圖,選擇是根據那個程式包提供相關繪圖函數決定的(見本書第4部分的相關章節)。

一個不同的問題是當繪制那些沒有現成函數可以用的圖形時,需要借助低級函數。在這種情況下,相比于傳統繪圖系統的低級函數,grid繪圖系統提供了更加廣泛的可用選擇,代價是需要深入學習一些概念。

如果使用者的目的是創造新的繪圖函數供其他人使用,grid繪圖系統也提供了比傳統繪圖系統更好的支援,使使用者更容易繪制混合了各類圖形的複雜圖形。

最後需要考慮的是速度。沒有任何繪圖系統能夠盲目地被描述為快速的,但是基于grid的繪圖系統速度明顯要慢于傳統繪圖系統,并且這些缺點在某些應用中會特别明顯。

章節總結

r 繪圖系統由一個核心繪圖引擎和兩個低級繪圖系統(傳統繪圖系統和grid繪圖系統)構成。傳統繪圖系統包含了很多進階函數用于繪制完整圖形。搭建于grid繪圖系統之上的lattice包和 ggplot2包也提供了進階繪圖函數庫。許多擴充程式包為這個兩個繪圖系統提供了更多的繪圖工具,這意味着使用者有可能利用r創造出許多豐富多彩的圖形和圖像。