- R語言數據可視化之美:專業圖表繪制指南
- 張杰
- 4676字
- 2019-09-20 14:52:45
1.6.4 坐標系
在編碼數據的時候,需要把數據系列放到一個結構化的空間中,即坐標系,它賦予X軸、Y軸坐標或給出經緯度表示的意義。圖1-6-12展示了三種常用的坐標系,分別為直角坐標系(rectangular coordinate)、極坐標系(polar coordinate)和地理坐標系(geographic coordinate)。它們幾乎可以滿足數據可視化的所有需求。

圖1-6-12 常用坐標系
1.直角坐標系
直角坐標系,也叫作笛卡兒坐標系,是最常用的坐標系,如圖1-6-13所示。你平時經常繪制的條形圖、散點圖或氣泡圖,就是直角坐標系。坐標系所在平面叫作坐標平面,兩坐標軸的公共原點叫作直角坐標系的原點。X軸和Y軸把坐標平面分成四個象限,右上方的叫作第一象限,其他三個部分按逆時針方向依次叫作第二象限、第三象限和第四象限。象限以數軸為界,橫軸、縱軸上的點不屬于任何象限。通常在直角坐標系中的點可以記為:(x, y),其中x表示X軸的數值,y表示Y軸的數值。

圖1-6-13 直角坐標系下的散點圖和氣泡圖
ggplot2的直角坐標系包括coord_cartesian()、coord_fixed()、coord_flip()和coord_trans()四種類型。ggplot2中默認類型為coord_cartesian(),其他坐標系都是通過直角坐標系畫圖,然后變換過來的。在直角坐標系中,可以使用coord_fixed()固定縱橫比,在繪制華夫餅圖和復合型散點餅圖時,我們需要使縱橫比為1:coord_fixed(ratio = 1);
我們在繪制條形圖或者水平箱形圖時,需要使用coord_flip()翻轉坐標系。它會將X軸和Y軸坐標對換,從而可以將豎直的柱形圖轉換成水平的條形圖。
原始的直角坐標上,坐標軸上的刻度比例尺是不變的,而coord_trans()坐標系的坐標軸上刻度比例尺是變化的,這種坐標系應用很少,但不是沒用,可以將曲線變成直線顯示。如果數據點在某個軸方向的密集程度是變化的,不便于觀察,則可以通過改變比例尺來調節,使數據點集中顯示,更加方便觀察。
三維直角坐標系的投影方法在繪圖軟件中,三維直角坐標系中有投影這個參數:正交投影(orthographic projection)和透視投影(perspective projection),如圖1-6-14所示。讀者的眼睛就好比三維渲染場景中的相機。而相機存在兩種投影方法。一種是正交投影,也叫平行投影(parallel projection),即進入相機的光線與投影方向是平行的。另一種是透視投影,即所有的光線相交于一點。不管是plot3D包還是lattice包的三維圖表繪制函數,都存在這樣一個參數可以調整三維坐標系的透視程度,這個參數對三維圖表美觀程度的展示尤為重要。

圖1-6-14 兩種不同形式的投影方法
直角坐標系還可以擴展到多維空間。例如,三維空間可以用(x, y, z)三個值對來表示三維空間中數據點的位置。如果再拓展到平行坐標系(parallel coordinate),則可以用于對高維幾何和多元數據的可視化,這時,我們可以使用R中GGally包的ggparcoord()函數實現平行坐標系的繪制。
2.極坐標系
你平時使用的雷達圖、餅圖等就是極坐標系。盡管你可能只用到了角度,還沒有用到半徑,圖1-6-15為極坐標下的柱形圖(南丁格爾玫瑰圖)。

圖1-6-15 極坐標下的柱形圖
極坐標系是指在平面內由極點、極軸和極徑組成的坐標系。在平面上取定一點O,稱為極點。從O出發引一條射線Ox,稱為極軸。再取定一個單位長度,通常規定角度取逆時針方向為正。這樣,平面上任一點P的位置就可以用線段OP的長度ρ,以及從Ox到OP的角度θ來確定,有序數對(ρ, θ)就稱為P點的極坐標,記為P (ρ, θ); ρ稱為P點的極徑,指數據點到圓心的距離;θ稱為P點的極角,指數據點距離最右邊水平軸的角度。
極坐標系的最右邊點是零度,角度越大,逆時針旋轉越多。距離圓心越遠,半徑越大。極坐標系在繪圖中沒有直角坐標系用得多,但在角度和方向兩個視覺暗示方面有很好的優勢,往往可以繪制出很出人意料的精美圖表。
R ggoplot2使用coord_polar()函數可以將坐標系從直角坐標系轉換到極坐標系,具體語句為:coord_polar(theta = "x", start = 0, direction = 1, clip = "on"),其中,theta表示要極坐標化的中心軸,即X軸轉化為圓周,Y軸轉化為半徑;direction表示排列方向,direction=1表示順時針,direction=-1表示逆時針;start表示起始角度,以距離12點針的弧度衡量,具體位置與direction參數有關,若direction為1則在順時針start角度處,若direction為-1則在逆時針start角度處。注意:極坐標轉化比較耗費計算機資源,最好先用如下語句清空內存:rm(list = ls()); gc()。
3.地理坐標系
位置數據的最大好處就在于它與現實世界的聯系,用地理坐標系可以映射位置數據。位置數據的形式有許多種,包括經度(longitude)、緯度(latitude)、郵編等。通常用緯度和經度來描述相對于赤道和子午線的角度。緯度線是東西向的,標識地球上的南北位置;經度線是南北向的,標識地球上的東西位置。相對于直角坐標系,緯度就好比水平軸,經度就好比垂直軸。也就是說,相當于使用了平面投影。
由于球面上任何一點的位置都是用地理坐標經緯度(λ, φ)表示的,而平面上的點的位置是用直角坐標(x, y)或極坐標(ρ, θ)表示的,所以要想將地球表面上的點轉移到平面上,則必須采用一定的方法來確定地理坐標與平面直角坐標或極坐標之間的關系。這種在球面和平面之間建立點與點之間函數關系的數學方法,就是地圖投影方法。地圖投影的實質就是將地球橢球面上的地理坐標轉化為平面直角坐標。用某種投影條件將投影球面上的地理坐標點一一投影到平面坐標系內,以構成某種地圖投影。
地圖投影方法有20多種,其中常用的有墨卡托投影(Mercator projection)、蘭勃特等角割圓錐投影(Lambert's conic conformal projection)、Albers等積正割圓錐投影(Albers equal-area conic projection)、等距圓柱投影(cylindrical equidistant projection)等。具體來說,不同區域常用的地圖投影方法不同。墨卡托投影法又稱正軸等角圓柱投影,是一種等角的圓柱形地圖投影。以此投影法繪制的地圖上,經緯線于任何位置皆垂直相交,使世界地圖可以繪制在一個長方形上。由于可顯示任兩點間的正確方位,航海用途的海圖、航路圖大多以此方式繪制。在該投影中線型比例尺在圖中任意一點周圍都保持不變,從而可以保持大陸輪廓投影后的角度和形狀不變(即等角);但墨卡托投影法會使面積產生變形,極點的比例甚至達到了無窮大。
R ggplot2使用coord_map()函數和coord_quickmap()函數可以設定坐標系為地理空間坐標系。其中coord_quickmap()函數是一種保留經緯直線的快速近似繪制的地理坐標系,它最適合靠近赤道的較小區域展示。coord_map()函數可以通過設定projection投影參數,從而實現不同投影的地理空間坐標系,包括墨卡托投影、蘭勃特等角圓錐投影、Albers等積正割圓錐投影、等距圓柱投影和正交投影等。
4.坐標系的轉換
選擇合適的坐標系對數據的清晰表達也很重要,直角坐標系與極坐標系的轉換如圖1-6-16所示。使用極坐標可以將數據以365天圍繞圓心排列。極坐標圖可以讓用戶方便地看到數據在周期、方向上的變化趨勢,而對連續時間段的變化趨勢的顯示則不如直角坐標系。

圖1-6-16 坐標系的轉換
極坐標系的表示方法為P(ρ, θ),平面直角坐標系的表示方法為Q(x, y)。極坐標系中的兩個坐標r和θ可以由下面的公式轉換為直角坐標系下的坐標值:
x=ρcosθ
y=ρsinθ
而在直角坐標系中,從x和y兩坐標計算出極坐標下的坐標:

其中要滿足x不等于0;在x = 0的情況下:若y為正數時,則θ = 90°(π/2 radians);若y為負數時,則θ = 270°(3π/2radians)。
5.坐標軸度量
坐標系指定了可視化的維度,而坐標軸的度量則指定了在每一個維度里數據映射的范圍。坐標軸的度量有很多種,你也可以用數學函數定義自己的坐標軸度量,但是基本上都屬于圖1-6-17所示的坐標軸度量。這些坐標軸度量主要分為三種,包括數字(側重數據的對數變化)、分類坐標軸度量和時間坐標軸度量。其中,數字坐標軸度量包括線性坐標軸度量、對數坐標軸度量、百分比坐標軸度量三類,而分類坐標軸度量包括分類坐標軸度量和順序坐標軸度兩類。

圖1-6-17 不同類型的標尺[19]
R ggplot2數字坐標軸度量包括:scale_x/y_continuous(), scale_x/y_log10(), scale_x/y_sqrt(), scale_x/y_reverse();分類坐標軸度量包括scale_x/y_discrete();時間坐標軸度量包括:scale_x/y_date(),scale_x/y_datetime(), scale_x/y_time()。這些度量的主要參數包括:① name表示指定坐標軸名稱,也將作為對應的圖例名;②breaks表示指定坐標軸刻度位置,即粗網格線位置;③labels表示指定坐標軸刻度標簽內容;④limits表示指定坐標軸顯示范圍,支持反區間;⑤expand表示擴展坐標軸顯示范圍;⑥trans表示指定坐標軸變換函數,自帶有exp()、log()、log10()等,還支持scales包內的其他變換函數,如scales::percent()百分比刻度、自定義等。圖1-6-18(b)就是在圖1-6-18(a)的基礎上添加了scale_x_continuous()和scale_y_continuous()以調整X軸和Y軸的刻度與軸名:

圖1-6-18 直角坐標系度量的調整
X軸度量:scale_x_continuous(name="Time(d)", breaks=seq(0,20,2)) Y軸度量:scale_y_continuous(breaks=seq(0,90,10), limits=c(0,90), expand=c(0, 1))
線性坐標軸度量(linear scale)上的間距處處相等,無論處于坐標軸的什么位置。因此,在尺度的低端測量兩點間的距離,和在尺度高端測量的結果是一樣的。然而,對數坐標軸度量(logarithmic scale)是一個非線性的測量尺度,用在數量有較大范圍的差異時。像里氏地震震級、聲學中的音量、光學中的光強度,以及溶液的pH值等。對數尺度以數量級為基礎,不是一般的線性尺度,因此每個刻度之間的商為一定值。若數據有以下特性時,用對數尺度來表示會比較方便:
(1)數據有數量級的差異時,使用對數尺度可以同時顯示很大和很小的數據信息;
(2)數據有指數增長或冪定律的特性時,使用對數尺度可以將曲線變為直線表示。
圖1-6-19(a)的X軸和Y軸都為線性尺度,而圖1-6-19(b) X軸仍為線性尺度,將Y軸轉變成對數尺度,就可以很好地展示很大和很小的數據信息。

圖1-6-19 坐標軸標尺的轉換
圖1-6-18(a): scale_y_continuous(breaks=seq(0,2.1,0.5), limits=c(0,2)) 圖1-6-18(b): scale_y_log10(name='log(value)', limits=c(0.00001,10))
分類坐標軸度量(categorical scale):數據不僅僅包括數值,有時候還包括類別,比如不同實驗條件、實驗樣品等測試得到的數據。分類標尺通常和數字標尺一起使用、以表達數據信息。條形圖就是水平X軸為數字標尺、垂直Y軸為分類標尺;而柱形圖是水平X軸為分類標尺、垂直Y軸為數字標尺,如圖1-6-20所示。其中,條形圖和柱形圖一個重要的視覺調整參數就是分類間隔,但是它和數值沒有關系(如果是多數據系列,還包括一個視覺參數:系列重疊)。另外,餅圖和圓環圖也是數字尺度和分類尺度的組合。
注意 對于柱形圖、條形圖和餅圖最好對數據先排序后再進行展示。對于柱形圖和條形圖,把數據從大到小排序,最大的位置放置在最左邊或者最上邊。而餅圖的數據要從大到小排序,最大的從12點位置開始。
常見的相關性系數圖的X軸、Y軸都為分類標尺,如圖1-6-21所示。相關系數圖一般都是三維及以上的數據,但是使用二維圖表顯示。其中,X列、Y列為都為類別數據,分布對應圖表的X軸和Y軸;Z列為數值信息,通過顏色飽和度、面積大小等視覺暗示表示。圖1-6-21(a)使用顏色飽和度和顏色色相綜合表示Z列數據;圖1-6-21(b)使用方塊的面積大小及顏色綜合表示Z列數據,從圖中很容易觀察到哪兩組變量的相關性最好。

圖1-6-21 分類尺度的使用
相關系數
相關系數(correlation coefficient)是用以反映變量之間相關關系的密切程度的統計指標。它是一種非確定性的關系,相關系數是研究變量之間線性相關程度的量。由于研究對象的不同,相關系數有如下幾種定義方式。
(1)簡單相關系數:又叫相關系數或線性相關系數,一般用字母r表示,用來度量兩個變量間的線性關系。圖1-6-20相關性圖就是研究多個變量兩兩之間的簡單相關關系。
(2)復相關系數:又叫多重相關系數。復相關是指因變量與多個自變量之間的相關關系。例如,某種商品的季節性需求量與其價格水平、職工收入水平等現象之間呈現復相關關系。
(3)典型相關系數:是先對原來各組變量進行主成分分析,得到新的線性關系的綜合指標,再通過綜合指標之間的線性相關系數來研究原各組變量間的相關關系。
時間坐標軸度量(time scale):時間是連續的變量,你可以把時間數據畫到線性度量上,也可以將其分成時刻、星期、月份、季節或者年份,如圖1-6-22所示。時間是日常生活的一部分。隨著日出和日落,在時鐘和日歷里,我們每時每刻都在感受和體驗著時間。所以我們會經常遇見時間序列的數據,時間序列的數據常用柱形圖、折線圖或者面積圖表示,有時候使用極坐標圖也可以很好地展示數據,因為時間往往存在周期性,以天(day)、周(week)、月(month)、季(season)或年(year)為一個周期。

圖1-6-22 時間序列圖表
需要注意的是:R ggplot2時間坐標軸度量函數scale_×××_date() 要求變量是Date格式;scale_×××_datetime() 要求變量是POSIXct格式;scale_×××_time() 要求變量是hms格式。
- Swift 3 New Features
- SEO實戰密碼
- Linux環境編程:從應用到內核
- Bootstrap 4:Responsive Web Design
- Hands-On Enterprise Automation with Python.
- AIRIOT物聯網平臺開發框架應用與實戰
- Java零基礎實戰
- OpenCV 3 Blueprints
- Python商務數據分析(微課版)
- 超簡單:Photoshop+JavaScript+Python智能修圖與圖像自動化處理
- VMware vSphere 5.5 Cookbook
- Visual Basic語言程序設計上機指導與練習(第3版)
- SaaS攻略:入門、實戰與進階
- Game Development Patterns and Best Practices
- JavaWeb入門經典