R最強(qiáng)項(xiàng)就是可視化,而ggplot2是其中最為著名的包
3.1 ggplot2基本語(yǔ)法
ggplot2 基于圖層化語(yǔ)法:圖形是一層一層的圖層疊加而成平痰。
選取整潔數(shù)據(jù)將其映射為幾何對(duì)象(如點(diǎn)伍纫、線等) 翻斟,幾何對(duì)象具有美學(xué)特征(如坐標(biāo)軸说铃、顏色等) ,若需要?jiǎng)t對(duì)數(shù)據(jù)做統(tǒng)計(jì)變換腻扇,調(diào)整標(biāo)度幼苛,將結(jié)果投影到坐標(biāo)系,再根據(jù)喜好選擇主題墙杯。
繪圖流程
包括10個(gè)部件, 前3個(gè)是必須得高镐, 其他ggplot2會(huì)自動(dòng)幫你設(shè)置畸冲。
- 數(shù)據(jù) data
- 映射 mapping
- 幾何對(duì)象 geom
- 標(biāo)度 scale
- 統(tǒng)計(jì)變換 stats
- 坐標(biāo)系 coord
- 位置調(diào)整 position adjustments
- 分面 facet
- 主題 theme
- 輸出 output
基本模板
ggplot(data = ,
mapping = aes()) +
geom_function(mappong = aes(),
stat = ,
position = )+
<SCALE_FUNCTION> +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION> +
<THEME_FUNCTION>
數(shù)據(jù)、映射算行、幾何對(duì)象
- 數(shù)據(jù):用于繪圖的數(shù)據(jù)州邢,需要是整潔的數(shù)據(jù)框
-
映射: 函數(shù)aes() 是ggplot2 中的映射函數(shù), 指明了變量與圖形所見(jiàn)元素之間的聯(lián)系,告訴ggplot 圖形元素想要關(guān)聯(lián)哪個(gè)變量數(shù)據(jù).
ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))
經(jīng)常將圖形的美學(xué)color, size 等映射到數(shù)據(jù)集的分類變量,以實(shí)現(xiàn)不同分組用不同的美學(xué)來(lái)區(qū)分. 类少。所以硫狞,若要為美學(xué)指定特定值,比如color = "red", 是不能放在映射
aes() 中的财忽。
-
幾何對(duì)象: 每個(gè)圖形都是采用不同的視覺(jué)對(duì)象來(lái)表達(dá)數(shù)據(jù)
通常用不同類型的‘‘幾何對(duì)象’’ 從不同角度來(lái)表達(dá)數(shù)據(jù)泣侮,如散點(diǎn)圖活尊、平滑曲線、線形圖深胳、條形圖铜犬、箱線圖等癣猾。
ggplot2 提供了50 余種‘‘幾何對(duì)象’’,均以geom_xxxx() 的方式命名夸盟,常用的有:
ggplot() 中的數(shù)據(jù)和映射满俗,是全局的,可供所有幾何對(duì)象共用五芝;位于’’ 幾何對(duì)象’’ 中的數(shù)據(jù)和映射枢步,是局部的渐尿,只供該幾何對(duì)象使用砖茸;
‘‘幾何對(duì)象’’ 優(yōu)先使用局部的,局部沒(méi)有則用全局的货葬。
分組使用group
- 標(biāo)度scale_
標(biāo)度函數(shù)控制幾何對(duì)象中的標(biāo)度映射:不只是x, y 軸震桶,還有color, fill, shape, size 產(chǎn)生的圖例征绎。 -
常用的標(biāo)度函數(shù)
scales 包提供了很多現(xiàn)成的設(shè)置刻度標(biāo)簽風(fēng)格的函數(shù)
1. 修改坐標(biāo)軸刻度及標(biāo)簽
1.1 用scale_*_continuous() 修改連續(xù)變量坐標(biāo)軸的刻度和標(biāo)簽:
- 參數(shù)breaks 設(shè)置各個(gè)刻度的位置
- 參數(shù)labels 設(shè)置各個(gè)刻度對(duì)應(yīng)的標(biāo)簽
用scale_*_discrete() 修改離散變量坐標(biāo)軸的標(biāo)簽:
1.2 scale_x_discrete(labels = c("4" = " 四驅(qū)", "f" = " 前驅(qū)", "r" = " 后驅(qū)"))
1.3 用scale_x_date() 設(shè)置日期刻度柴墩,參數(shù)date_breaks 設(shè)置刻度間隔顷扩,date_labels 設(shè)置標(biāo)簽的日期格式隘截;
1.4 借助scales 包中的函數(shù)設(shè)置特殊格式汹胃,比如百分?jǐn)?shù)(percent)着饥、科學(xué)計(jì)數(shù)法(scientific)、美元格式(dollar) 等呵哨。
2. 修改坐標(biāo)軸標(biāo)簽孟害、圖例名及圖例位置
函數(shù)xlab(), ylab(), 設(shè)置x 軸、y 軸標(biāo)簽
前面已使用color 美學(xué)击你,則可以在labs() 函數(shù)中使用參數(shù)color 修改顏色的圖例名.
圖例位置是在theme 圖層通過(guò)參數(shù)legend. position 設(shè)置丁侄,可選取值有“none,” “l(fā)eft,” “right,” “bottom,” “top.”
3. 設(shè)置坐標(biāo)軸范圍
xlim(), ylim() 函數(shù)朝巫,設(shè)置x 軸和y 軸的范圍
4.變換坐標(biāo)軸
ggplot2 提供的坐標(biāo)變換函數(shù)scale_x_log10() 等是變換坐標(biāo)系劈猿,能夠在視覺(jué)效果相同的情況下,使用原始數(shù)據(jù)的坐標(biāo)刻度
5.設(shè)置圖形標(biāo)題
用labs() 函數(shù)的參數(shù)title, subtitle, caption 設(shè)置標(biāo)題庐镐、副標(biāo)題必逆、腳注標(biāo)題(默認(rèn)右下角)
如果想改成頂部居中揽乱,需要加theme 圖層專門設(shè)置
6. 設(shè)置fill, color 顏色
數(shù)據(jù)的某個(gè)維度信息可以通過(guò)顏色來(lái)展示凰棉,顏色直接影響圖形的美感撒犀。
可以直接使用顏色值,但是更建議使用RColorBrewer(調(diào)色板)或colorspace 包荆姆。
6.1 離散變量
6.2 連續(xù)變量
7. 添加文字標(biāo)注-ggrepel 包
ggrepel 包提供了geom_label_repel() 和geom_text_repel() 函數(shù),為圖形添加文字標(biāo)注仆救。
首先要準(zhǔn)備好標(biāo)記點(diǎn)的數(shù)據(jù),然后增加文字標(biāo)注的圖層构诚,需要提供標(biāo)記點(diǎn)數(shù)據(jù)范嘱,以及要標(biāo)注的文字給label 美學(xué)员魏,若來(lái)自數(shù)據(jù)變量撕阎,則需要用映射
library(ggrepel)
best_in_class = mpg %>% # 選取每種車型hwy 值最大的樣本
group_by(class) %>%
slice_max(hwy, n = 1)
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
geom_label_repel(data = best_in_class, aes(label = model))
若要在圖形某坐標(biāo)位置添加文本注釋虏束,則用annotate() 函數(shù),需要提供添加文本的中心坐標(biāo)位
4 統(tǒng)計(jì)變換照藻、坐標(biāo)系幸缕、位置調(diào)整
- 統(tǒng)計(jì)變換(Statistics):構(gòu)建新的統(tǒng)計(jì)量進(jìn)而繪圖晰韵,稱為‘‘統(tǒng)計(jì)變換’’雪猪,簡(jiǎn)稱‘‘統(tǒng)計(jì)’’。
ggplot2 中的提供了30 多種‘‘統(tǒng)計(jì)’’译仗,均以stat_xxxx() 的方式命名古劲$趾铮可以分為兩類:
- 可以在幾何對(duì)象函數(shù)geom_*() 中創(chuàng)建滑绒,通常直接使用后者即可:
-
不能在幾何對(duì)象函數(shù)geom_*() 中創(chuàng)建
-
例子:
用stat_summary() 做統(tǒng)計(jì)匯總并繪圖杠览。通過(guò)傳遞函數(shù)做統(tǒng)計(jì)計(jì)算纵势,首先注意x 和y 美學(xué)映射到calss 和hwy; fun = mean 是根據(jù)x 計(jì)算y钦铁,故對(duì)每個(gè)車型計(jì)算一個(gè)平均的hwy;fun.max, fun.min 同樣根據(jù)x 分別計(jì)算y 的均值加減標(biāo)準(zhǔn)差佛点;統(tǒng)計(jì)計(jì)算的結(jié)果將傳遞給幾何對(duì)象參數(shù)geom 用于繪圖:
ggplot(mpg, aes(x = class, y = hwy)) +
geom_violin(trim = FALSE, alpha = 0.5, color = "green") + # 小提琴圖
stat_summary(fun = mean,
fun.min = function(x) {mean(x) - sd(x)},
fun.max = function(x) {mean(x) + sd(x)},
geom = "pointrange", color = "red")
用stat_smooth(), 與geom_smooth() 相同, 添加光滑曲線:
- method: 指定平滑曲線的統(tǒng)計(jì)函數(shù)超营,如lm 線性回歸, glm 廣義線性回歸, loess 多項(xiàng)式回歸, gam 廣義加法模型(mgcv 包) , rlm 穩(wěn)健回歸(MASS 包) 等
- formula: 指定平滑曲線的方程演闭,如y ~ x, y ~ poly(x, 2), y ~ log(x) 颓帝,需要與method 參數(shù)搭配使用
- se: 設(shè)置是否繪制置信區(qū)間
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
stat_smooth(method = "lm",
formula = y ~ splines::bs(x, 3),
se = FALSE) # 不繪制置信區(qū)間
坐標(biāo)系(Coordinante)
ggplot2 默認(rèn)坐標(biāo)系是直角坐標(biāo)系coord_cartesian()见间,常用的坐標(biāo)系操作還有:
坐標(biāo)軸翻轉(zhuǎn)工猜,從水平圖到豎直圖:
ggplot(mpg, aes(class, hwy)) +
geom_boxplot() + # 箱線圖
coord_flip() # 從豎直變成水平
直角坐標(biāo)下的條形圖篷帅,轉(zhuǎn)化為極坐標(biāo)下的風(fēng)玫瑰圖:
ggplot(mpg, aes(class, fill = drv)) +
geom_bar() +
coord_polar()
位置調(diào)整(Position adjustments)
(1) 條形圖中的條形位置調(diào)整:
position_stack(): 豎直堆疊
position_fill(): 豎直(百分比) 堆疊魏身,按比例放縮保證總高度為1
position_dodge(), position_dodge2(): 水平堆疊##使用更多
ggplot(mpg, aes(class, fill = drv)) +
geom_bar(position = position_dodge(preserve = "single"))
(2) 散點(diǎn)圖中的散點(diǎn)位置調(diào)整:
- position_nudge(): 將散點(diǎn)移動(dòng)固定的偏移量
- position_jitter(): 給每個(gè)散點(diǎn)增加一點(diǎn)隨機(jī)噪聲(抖散圖)
- position_jitterdodge(): 增加一點(diǎn)隨機(jī)噪聲并躲避組內(nèi)的點(diǎn)箭昵,特別用于箱線圖+ 散點(diǎn)圖
有時(shí)候需要將多個(gè)圖形排布在畫板中,借助patchwork 包更方便泡一。
library(patchwork)
p1 = ggplot(mpg, aes(displ, hwy)) +
geom_point()
p2 = ggplot(mpg, aes(drv, displ)) +
geom_boxplot()
p3 = ggplot(mpg, aes(drv)) +
geom_bar()
p1 | (p2 / p3)
分面鼻忠、主題杈绸、輸出
- 1 分面(Facet): 利用分類變量將圖形分為若干個(gè)‘‘面” (子圖)瞳脓,即對(duì)數(shù)據(jù)分組再分別繪圖,稱為‘‘分面’’钝吮。
(1) facet_wrap(): 封裝分面奇瘦,先生成一維的面板系列劲弦,再封裝到二維中。 - 分面形式:~ 分類變量, ~ 分類變量1 + 分類變量2
- scales 參數(shù)設(shè)置是否共用坐標(biāo)刻度邑跪,"fixed"(默認(rèn), 共用), "free"(不共用)画畅,也可以用free_x, free_y 單獨(dú)設(shè)置
- 參數(shù)nrow 和ncol 可設(shè)置子圖的放置方式
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ drv, scales = "free")
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ drv + cyl)
(2) facet_grid(): 網(wǎng)格分面轴踱,生成二維的面板網(wǎng)格淫僻,面板的行與列通過(guò)分面變量定義。
- 分面形式:行分類變量~ 列分類變量
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_grid(drv ~ cyl)
-
主題(theme)
你可以為圖形選擇不同風(fēng)格的主題(外觀)棕所,ggplot2 提供了8 套可選主題:
-
使用或修改主題琳省,只需要添加主題圖層:
ggplot(mpg, aes(displ, hwy, color = drv)) +
geom_point() +
theme_bw()
更多的主題岛啸,還可以用ggthemes 包坚踩,其中包含一些頂級(jí)期刊專用繪圖主題瓤狐;當(dāng)然也可以用theme()函數(shù)定制自己的主題(略)础锐。
- 3 輸出(output)
用ggsave() 函數(shù),將當(dāng)前圖形保存為想要格式的圖形文件拦宣,如png, pdf 等:
ggsave("my_plot.pdf", width = 8, height = 6, dpi = 300)## 參數(shù)width 和height 通常只設(shè)置其中一個(gè)
ggplot2 圖形示例
Nathan Yau 將數(shù)據(jù)可視化的過(guò)程總結(jié)為如下的4 個(gè)思索:
- 你擁有什么樣的數(shù)據(jù)?
- 你想要表達(dá)什么樣的數(shù)據(jù)信息?
- 你會(huì)什么樣的數(shù)據(jù)可視化方法?
- 你從圖表中能獲得什么樣的數(shù)據(jù)信息?
一般的6類:
類別比較圖鸵隧、數(shù)據(jù)關(guān)系圖意推、數(shù)據(jù)分布圖菊值、時(shí)間序列圖、局部整體圖昵宇、地理空間圖
ggpubr 包提供了很多函數(shù)瓦哎,輕松繪制適合用于期刊論文發(fā)表的圖形
(1)類別比較圖:類別比較圖典徊,通常是展示和比較分類變量或分類變量組合的頻數(shù)
熱圖:鄰接矩陣卒落、混淆矩陣儡毕、相關(guān)系數(shù)矩陣也可以用熱圖來(lái)可視化展示
ComplexHeatmap 包可繪制更復(fù)雜的熱圖:帶層次聚類的熱圖扑媚。
(2)數(shù)據(jù)關(guān)系圖
主要包括:
數(shù)據(jù)相關(guān)性圖:展示兩個(gè)或多個(gè)變量之間的關(guān)系掠手,比如散點(diǎn)圖、氣泡圖、曲面圖等
-
數(shù)據(jù)流向圖:展示兩個(gè)或多個(gè)狀態(tài)或情形之間的流動(dòng)量或關(guān)系強(qiáng)度两残,比如網(wǎng)絡(luò)圖等
網(wǎng)絡(luò)圖:網(wǎng)絡(luò)圖可以可視化實(shí)體(個(gè)體/事物)間的內(nèi)部關(guān)系人弓,比如社會(huì)媒體網(wǎng)絡(luò)着逐、朋友網(wǎng)絡(luò)耸别、合作網(wǎng)絡(luò)、疾病傳播網(wǎng)絡(luò)等吟榴。
可視化網(wǎng)絡(luò)圖的包有:igraph, tidygraph + ggraph. 還有更加強(qiáng)大的visNetwork 包囊扳。 結(jié)點(diǎn)數(shù)據(jù)锥咸,包括id(用于邊數(shù)據(jù)),label(用于圖顯示)熊锭,group(設(shè)置分組顏色)碗殷,value(權(quán)重速缨,關(guān)聯(lián)結(jié)點(diǎn)的大醒)等
邊數(shù)據(jù)搁吓,包括from(起點(diǎn))堕仔,to(終點(diǎn))晌区,label(用于圖顯示)契讲,value(權(quán)重滑频,關(guān)聯(lián)邊的粗細(xì))等
library(visNetwork)
visNetwork(nodes, edges)
(3) 數(shù)據(jù)分布圖:主要展示數(shù)據(jù)中數(shù)值出現(xiàn)的頻率或分布規(guī)律银伟,比如直方圖绘搞、概率密度圖夯辖、箱線圖等
(4)時(shí)間序列圖:展示數(shù)據(jù)隨時(shí)間的變化規(guī)律或者趨勢(shì)蒿褂。比如,括折線圖娄帖、面積圖等昙楚。
折線圖與面積圖:用geom_line() 與geom_area()繪制
(5)局部整體圖:堪旧,展示部分與整體的關(guān)系淳梦。比如谭跨,餅圖李滴、樹狀圖等
(6)地理空間圖:是在地圖上展示數(shù)據(jù)關(guān)系所坯,即與地理位置信息聯(lián)系起來(lái)繪圖芹助。地理位置通常是用經(jīng)度闲先、緯度表示伺糠。
sf 包實(shí)現(xiàn)了將簡(jiǎn)單要素表示為R 中的data.frame, 以及一系列處理此類數(shù)據(jù)的工具训桶。
sf 格式數(shù)據(jù)框中,屬性要素是正常的列谤专,幾何要素(geometry) 存放為列表列置侍。
(7)動(dòng)態(tài)交互圖-ggplotly 包
只要對(duì)ggplot2 繪制的圖形對(duì)象套一個(gè)ggplotly() 函數(shù)拦焚,則圖形變成可交互狀態(tài):當(dāng)鼠標(biāo)移動(dòng)到圖形元素上時(shí)耕漱,將自動(dòng)顯示對(duì)應(yīng)的數(shù)值。
library(plotly)
p = gapminder %>%
filter(year == 2007) %>%
ggplot(aes(gdpPercap, lifeExp, size = pop, color = continent)) +
geom_point() +
theme_bw()
ggplotly(p)
gganimate 包是基于ggplot2 的動(dòng)態(tài)可視化拓展包灾梦,讓圖形元素隨時(shí)間等逐幀變化起來(lái)若河,可導(dǎo)出為.gif 動(dòng)圖寞宫。
library(gganimate)
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop)) +
geom_point() +
geom_point(aes(color = continent)) +
scale_x_log10() +
labs(title = " 年份: {frame_time}", x = " 人均GDP", y = " 預(yù)期壽命") +
transition_time(year)
anim_save("output/gapminder.gif") # 保存為gif 文件