美學(xué),幾何,映射,比例尺,都是什么?
本節(jié)主要向初學(xué)者簡(jiǎn)要介紹ggplot2中的一些關(guān)鍵概念
先看下面的代碼:
ggplot(celebs,aes(x = age, y = oscars)) +
geom_point(size = 7,aes(color = gender)) +
geom_text(aes(label = name))
乍一看,對(duì)于ggplot2
的初學(xué)者來(lái)說(shuō),這似乎簡(jiǎn)直是胡言亂語(yǔ)。你可能猜測(cè)到ggplot
是一個(gè)函數(shù),并且此代碼生成的可視化結(jié)果可能表示點(diǎn)和文本。但到底aes
是什么或者geom_text
或者size
是什么意思?
要在ggplot2
中實(shí)現(xiàn)數(shù)據(jù)可視化,首先需要了解一些關(guān)鍵概念。一旦了解了它們,任何可視化都將變得更加容易。本節(jié)中我將不會(huì)創(chuàng)建精美的可視化圖,也不會(huì)創(chuàng)建有意義的可視化。但是,我們將學(xué)習(xí)一些重要的關(guān)鍵概念:美學(xué),映射,幾何和比例。將用大部分示例來(lái)幫助大家了解它們的含義
首先安裝tidyverse
install.packages("tidyverse")
library(tidyverse)
繼續(xù),將以下代碼粘貼到Rstudio的代碼編輯區(qū)。先無(wú)需知道代碼的工作原理,只需將其粘貼并查看它是否產(chǎn)生與以下相同的輸出
celebs <- tibble(
name = c("Brad Pitt", "Daniel Day-Lewis",
"Tom Hanks", "Natalie Portman",
"Kate Winslet", "Cate Blanchett"),
age = c(56, 62, 63, 38, 44, 50),
oscars = c(0, 3, 2, 1, 1, 2),
gender = c("male", "male", "male",
"female", "female", "female")
) %>%
mutate(oscars = as.factor(oscars))
celebs
# A tibble: 6 x 4
name age oscars gender
<chr> <dbl> <fct> <chr>
1 Brad Pitt 56 0 male
2 Daniel Day-Lewis 62 3 male
3 Tom Hanks 63 2 male
4 Natalie Portman 38 1 female
5 Kate Winslet 44 1 female
6 Cate Blanchett 50 2 female
根據(jù)創(chuàng)建的文件可以看到湯姆·漢克斯(Tom Hanks)今年63歲,贏得了兩次奧斯卡獎(jiǎng)。丹尼爾·戴·劉易斯贏得了三場(chǎng)。我們的主要問(wèn)題是,如何將這些數(shù)據(jù)轉(zhuǎn)換為可視化圖像?
什么是數(shù)據(jù)可視化?
在關(guān)注關(guān)鍵概念之前,我們應(yīng)該先花一點(diǎn)時(shí)間來(lái)思考我們需要解決的整體問(wèn)題。在數(shù)據(jù)可視化中,我們要可視化的數(shù)據(jù)(例如數(shù)字,文本)
可視化什么?
就如同畫(huà)家通常在畫(huà)布上繪畫(huà),我們也是一樣。每個(gè)新畫(huà)布都是空的。作為畫(huà)家和數(shù)據(jù)可視化工程師,我們的工作都是填補(bǔ)畫(huà)布。但是,我們的畫(huà)布不是真實(shí)的東西,它是一種函數(shù)。我們將此函數(shù)稱為ggplot
ggplot()
ggplot2
中的每個(gè)數(shù)據(jù)可視化都從此函數(shù)開(kāi)始。該函數(shù)創(chuàng)建一個(gè)我們必須填充的灰色畫(huà)布。最終,我們添加到繪圖中的所有內(nèi)容都必須映射到實(shí)際數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)可視化。如果我們像幼兒一樣在畫(huà)布上添加隨機(jī)點(diǎn),就不會(huì)稱之為數(shù)據(jù)可視化
先舉一個(gè)例子,說(shuō)明我們?nèi)绾巫龅竭@一點(diǎn):
湯姆·漢克斯(Tom Hanks)贏得了2項(xiàng)奧斯卡獎(jiǎng),他今年63歲。我們可以在畫(huà)布上添加一個(gè)圓或一個(gè)點(diǎn)。該點(diǎn)必須以某種方式映射到數(shù)據(jù)。這就是它的工作方式:
年齡顯示在x軸上,奧斯卡數(shù)顯示在y軸上。從這個(gè)意義上說(shuō),湯姆·漢克斯不過(guò)是二維空間中的一個(gè)點(diǎn),讓我們暫時(shí)忘記要點(diǎn)。湯姆·漢克斯(Tom Hanks)也可以只是二維空間中巧克力棒的圖像:
關(guān)鍵是,湯姆·漢克斯的在視覺(jué)上可以是任何東西。甚至只是一段文字。所以這是第一條規(guī)則
:
在數(shù)據(jù)可視化中,我們將數(shù)據(jù)可視化為幾何對(duì)象
我們已經(jīng)看到了兩個(gè)幾何對(duì)象,一個(gè)點(diǎn)和一個(gè)巧克力棒。
以下更全面的列表:
一個(gè)點(diǎn)
一個(gè)矩形
一條線
路徑(或連接的線)
一個(gè)地區(qū)
在二維空間中,每個(gè)這樣的幾何對(duì)象都需要一個(gè)x坐標(biāo)和一個(gè)y坐標(biāo)。我們的Tom Hanks巧克力棒必須放在畫(huà)布上的某個(gè)位置。實(shí)際位置會(huì)影響我們解釋數(shù)據(jù)可視化的結(jié)果。如果巧克力棒在左邊,Tom Hanks會(huì)比實(shí)際年齡年輕。因此,巧克力棒在空間中的位置與數(shù)據(jù)之間存在映射。我們稱這種映射為美學(xué)映射。每種美學(xué)映射都告訴我們有關(guān)幾何對(duì)象的一些可視化信息。下面介紹一個(gè)可視化例子:
ggplot(celebs,aes(x = age, y = oscars)) +
geom_point(size = 7,aes(color =oscars)) +
geom_text(aes(label = name))
在這個(gè)例子中,我們將一個(gè)點(diǎn)用作幾何對(duì)象。每個(gè)點(diǎn)都有三個(gè)美學(xué)映射。首先,通過(guò)x與y,2個(gè)值將每個(gè)點(diǎn)定位在二維空間中。其次,每個(gè)點(diǎn)的顏色都不同,具體取決于每個(gè)電影明星獲得的奧斯卡獎(jiǎng)。例如,丹尼爾·戴·劉易斯(Daniel Day-Lewis)贏得了三項(xiàng)奧斯卡獎(jiǎng)。數(shù)字三被映射為紫色。同樣,數(shù)字2(2項(xiàng)奧斯卡獎(jiǎng))被映射為青色。我們可以如下表示該映射:
年齡-> x
奧斯卡獎(jiǎng)數(shù)-> y
奧斯卡獎(jiǎng)數(shù)->顏色
在ggplot
中,定義此類(lèi)映射的函數(shù)為aes,在Rstudio中復(fù)制以下代碼
aes(x = age,
y = oscars,
color = oscars)
Aesthetic mapping:
* `x` -> `age`
* `y` -> `oscars`
* `colour` -> `oscars`
通過(guò)這種映射,每個(gè)幾何對(duì)象將根據(jù)每個(gè)電影明星的年齡和奧斯卡獎(jiǎng)的數(shù)量位于畫(huà)布相對(duì)位置。此外,每個(gè)幾何對(duì)象的顏色將映射到每個(gè)電影明星贏得的奧斯卡獎(jiǎng)的數(shù)量。這是我們的第二條規(guī)則
:
數(shù)據(jù)映射到應(yīng)用于幾何對(duì)象的美學(xué)映射
幾何對(duì)象、美學(xué)和映射之間的相互作用
現(xiàn)在我們知道,在使用ggplot2進(jìn)行數(shù)據(jù)可視化時(shí),我們先將美學(xué)映射到幾何對(duì)象。讓我們?cè)陔娪懊餍菙?shù)據(jù)集的幫助下了解這一想法。以下數(shù)據(jù)可視化表示散點(diǎn)圖,即點(diǎn)作為映射到二維空間上的幾何對(duì)象
ggplot(data = celebs, mapping = aes(x = age, y = oscars)) +
geom_point()
ggplot
是一個(gè)函數(shù),帶有兩個(gè)參數(shù)。第一個(gè)參數(shù)是數(shù)據(jù)本身,第二個(gè)參數(shù)aes
中是我們的美學(xué)映射,稱為映射。我們用+
添加的幾何對(duì)象。例如,在此可視化中,我們將點(diǎn)添加為幾何對(duì)象。這些幾何對(duì)象始終以geom_
開(kāi)頭。然后,我們必須告訴ggplot
顯示哪種幾何對(duì)象:geom_point()
上面的代碼也可以用如下方式表示:
ggplot(celebs, aes(x = age, y = oscars)) +
geom_point()
我們不必命名參數(shù)。只要我們保持參數(shù)的順序相同,就可以省略data =
和mapping =
因此主要概念就是:ggplot(數(shù)據(jù),aes(映射))+幾何對(duì)象
相同的美學(xué),不同的幾何對(duì)象
為了欣賞將美學(xué)映射應(yīng)用于任何幾何對(duì)象這一事實(shí),我們可以將geom_point
更改為geom_text
,從而在屏幕上顯示文本:
ggplot(celebs, aes(x = age, y = oscars)) +
geom_text(label = "Some text")
可以看到相同的x、y坐標(biāo)可以應(yīng)用于不同的幾何對(duì)象
相同的幾何對(duì)象,不同的美學(xué)
接下來(lái),向我們的可視化中添加另外的美學(xué)映射。點(diǎn)的顏色應(yīng)映射到電影明星的性別:顏色->性別,透明度->性別
ggplot(celebs, aes(x = age, y = oscars,
color = gender)) +
geom_point(size = 9)
ggplot(celebs, aes(x = age, y = oscars,
alpha = gender)) +
geom_point(size = 9)
將美學(xué)添加到特定的幾何圖形中
當(dāng)我們向ggplot函數(shù)添加美學(xué)映射時(shí),它將應(yīng)用于每個(gè)后續(xù)幾何對(duì)象。例如,在以下示例中,我們將美學(xué)映射顏色->性別
應(yīng)用于geom_point
和geom_spoke
:
ggplot(celebs, aes(x = age, y = oscars,
color = gender))+
geom_point(size=9)+
geom_spoke(angle = .45, radius =1)
可以看到我們繼續(xù)添加了geom_spoke
幾何對(duì)象,它以一定角度顯示短線,而此時(shí)顏色也映射到了此幾何對(duì)象中。
但是也許我們只想將顏色->性別的美學(xué)映射應(yīng)用于點(diǎn)而不是短線。我們可以通過(guò)向geom_point
添加另一個(gè)aes
函數(shù)來(lái)做到這一點(diǎn):
ggplot(celebs, aes(x = age, y = oscars)) +
geom_point(aes(color = gender),size = 9)+
geom_spoke(angle = .45, radius =1)
此時(shí)圖中顏色只映射到了點(diǎn)的幾何對(duì)象中,并沒(méi)有改變短線的顏色
ggplot
函數(shù)中的美學(xué)映射適用于任何幾何對(duì)象
,我們可以稱之為全局映射
,而幾何對(duì)象中的美學(xué)映射僅適用于此特定幾何對(duì)象
,稱之為局部映射
不要將一種美學(xué)映射到多個(gè)變量
但是,此時(shí)我們應(yīng)注意不要太有創(chuàng)意。例如,你可以將顏色映射到電影明星的性別和名字:
ggplot(celebs, aes(x = age, y = oscars)) +
geom_point(size = 7, aes(color = gender)) +
geom_text(aes(label = name, color = name),nudge_y = -0.2)
查看右側(cè)的圖例。性別是不存在布拉德·皮特(Brad Pitt),因?yàn)樗淮嬖凇?code>ggplot感到困惑,因?yàn)槲覀儗⒍鄠€(gè)變量應(yīng)用于一種美學(xué)。不建議這樣做。一般ggplot
會(huì)將第一個(gè)美學(xué)映射的名稱保留為圖例的標(biāo)題,而變量的值將用作圖例標(biāo)簽。
要了解ggplot2
中各種功能,請(qǐng)查看官方文檔,這一節(jié)我們主要介紹了ggplot2中的一些關(guān)鍵概念,美學(xué)、映射、幾何對(duì)象等,理解這些概念是我們后續(xù)學(xué)好數(shù)據(jù)可視化分析的基礎(chǔ),后面將會(huì)在一系列實(shí)戰(zhàn)案例中來(lái)不斷的深入學(xué)習(xí)。