R for Data Science - Learning Notes (III)

Communications & Cooperations

Posted by Paradise on December 2, 2020

教材介绍:https://book.douban.com/subject/26757974/

相关资源:https://github.com/hadley/r4ds

CHPT22 - Graphics for Communication with ggplot2

此前介绍的绘图操作仅限于 EDA 过程中的可视化,本章介绍用于 Report 的可视化技巧,即图片的修饰和美化。

标题与副标题、图片脚注、坐标轴与图例标题,数学公式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
library(tidyverse)
base <- ggplot(mpg, aes(displ, hwy)) + 
    geom_point(aes(color=class)) + geom_smooth(se=FALSE)

# 使用 labs 函数在图中添加标题和图片标签
base + labs(
    title="Fuel efficiency generally decreases with engine size",
    subtitle="Two seaters(sport cars) are an exception because of light weight",
    caption="Data from fueleconomy.gov"
)

# 使用 labs 函数自定义 axis 和 legend 标题
base + labs(
    x="Engine displacement (L)",
    y="Highway fuel economy (mpg)",
    color="Car type"
)

# 使用 quote 函数输出数学公式格式
df = data.frame(x=rnorm(30), y=rnorm(30))
df %>% ggplot(aes(x, y)) + geom_point() + labs(
    x = quote(sum(x[i]^2, i==1, n)),
    y = quote(alpha + beta + frac(delta, beta))
)

点注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 使用 geom_text 函数添加点注释
bestcar <- mpg %>% group_by(class) %>% filter(row_number(desc(hwy)) == 1)
base + geom_text(aes(label=model), data=bestcar)

# 使用 geom_label 函数添加点注释(注释带有边框)
base + geom_label(
    aes(label=model), data=bestcar, alpha=0.5,
    nudge_y=2	# 用于移动注释和点的相对位置
)

# 上述两者皆有注释重叠情况,可使用 geom_label_repel 函数优化
base + geom_point(size=3, alpha=1, data=bestcar) + 
    ggrepel::geom_label_repel(aes(label=model), data=bestcar)

# 使用 label 代替图中的 legend
class_avg <- mpg %>% group_by(class) %>% 
    summarise(displ=median(displ), hwy=median(hwy))
ggplot(mpg, aes(displ, hwy, color=class)) + 
    ggrepel::geom_label_repel(
        aes(label=class), data=class_avg,
        size=5, label.size=0, segment.color = NA
    ) + 
    geom_point() + 
    theme(legend.position="none")

单个注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用 geom_text 函数添加单个注释
anno1 <- mpg %>% summarise(displ=max(displ), hwy=max(hwy), label='Annotaions')
base + geom_text(
    aes(label=label), data=anno1, vjust='top', hjust='right'
)
# 使用 str_wrap 函数对注释文本进行排版
anno2 <- tibble(displ=Inf, hwy=Inf, 
                label='abcdef一二三四五六' %>% stringr::str_wrap(width=10)
                )
base + geom_text(
    aes(label=label), data=anno2, vjust='top', hjust='right'
)

# 其他常用添加注释(非文本)的函数
geom_hline; geom_vline      # 辅助线
geom_rect                   # 矩形框
geom_segement               # 利用 arrow 参数可以添加 箭头

坐标刻度、图例样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Scales
base <- ggplot(mpg, aes(displ, hwy)) + geom_point(aes(color=class))
# R 会自动调整 scales,当运行 base,相当于:
base + scale_x_continuous() + scale_y_continuous() + scale_color_discrete()

# 调整y轴示数的 breaks,隐藏x轴示数
base + 
    scale_y_continuous(breaks=seq(15, 40, by=5)) + 
    scale_x_continuous(labels = NULL)

# 使用 theme 和 guides 调整 legend 的样式
base + 
    theme(legend.position="bottom") + 
    guides(
        color=guide_legend(nrow=1, override.aes=list(size=4))
    )

坐标转换、坐标缩放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 坐标的对数化
# 变量直接对数化,坐标刻度也跟随改变
ggplot(diamonds, aes(log(carat), log(price))) + geom_hex()
# 转换坐标轴,坐标刻度不变
ggplot(diamonds, aes(carat, price)) + geom_hex() + 
    scale_x_log10() + scale_y_log10()

# 设置坐标轴取值范围
base + coord_cartesian(xlim = c(5,7), ylim = c(10,30))

# 不同图片使用相同的scale方便进行比较
suv <- mpg %>% filter(class=="suv")
compact <- mpg %>% filter(class=="compact")
# 借助 limits 参数以及 range、unique 函数创建统一坐标尺度
x_scale <- scale_x_continuous(limits=range(mpg$displ))
y_scale <- scale_y_continuous(limits=range(mpg$hwy))
color_scale <- scale_color_discrete(limits=unique(mpg$drv))
# 使用统一的坐标尺度
ggplot(suv, aes(displ, hwy, color=drv)) + geom_point() + 
    x_scale + y_scale + color_scale
ggplot(compact, aes(displ, hwy, color=drv)) + geom_point() + 
    x_scale + y_scale + color_scale

颜色风格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 颜色风格的设置(scale_color_brewer)
base <- ggplot(mpg, aes(displ, hwy, color=class)) + geom_point()
all_scales <- list(
    style1=c("YlOrRd","YlOrBr","YlGnBu","YlGn","Reds","RdPu",
             "Purples","PuRd","PuBuGn","PuBu","OrRd","Oranges",
             "Greys","Greens","GnBu","BuPu","BuGn","Blues"),
    style2=c("Set1","Set2","Set3",
             "Pastel2","Pastel1","Paired","Dark2","Accent"),
    style3=c("Spectral","RdYlGn","RdYlBu",
             "RdGy","RdBu","PuOr","PrGn","PiYG","BrBG")
)
base + scale_color_brewer(palette=all_scales[[3]][6])

# 手动设置颜色风格(scale_color_manual)
presidential %>% mutate(id=33+row_number()) %>% 
    ggplot(aes(start, id, color=party)) + geom_point() + 
    geom_segment(aes(xend=end, yend=id)) + 
    scale_color_manual(
        values = c(Republican="red", Democratic="blue")
    )

# 使用 viridis 包优化颜色风格(scale_fill_viridis)
df <- tibble(x=rnorm(1000), y=rnorm(1000))
# ggplot(df, aes(x,y)) + geom_hex() + coord_fixed()
ggplot(df,aes(x,y)) + geom_hex() + viridis::scale_fill_viridis() + coord_fixed()

# 使用 ggplot2 的内置主题
base+theme_dark(base_line_size=0)

CHPT23 - R Markdown Formats

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# (1) Introduction
# 在 render 函数中设置输出文件格式
rmarkdown::render("example.Rmd", output_format = "word_document")
# 或者在 RStudio knit 按钮的下拉菜单中选择 knit 的格式

# (2) Output Options
# 查看输出html文件时可以设置哪些参数(Then cmd:Ctrl+3)
?rmarkdown::html_document()
# 使用 expanded output field 改写 default 的参数(Rmd 文档)
output: 
    html_document: 
        toc: true
        toc_float: true
# 输出多个不同格式的文件
output: 
    html_document: 
        toc: true
        toc_float: true
    pdf_document: default

# (3) Documents
# 支持的文件格式:
# pdf、word、odt(OpenDocument Text)、rtf(Rich Text Format)、md、github
# 使 code chunk 隐藏的方法:
knitr::opts_chunk$set(echo = FALSE)
# 在html文件中,可以通过option设置(点击可以使代码出现)
output: 
    html_document: 
        code_folding: hide

# (4) Notebooks
# html_document 主要用于与决策者交流
# 而 html_notebook 用于与其他 analysist 交流

# (5) Presentations(类似 PPT 的功能)
# RMarkdown 支持的三种展示格式:
ioslides_presentation()
slidy_presentation()
beamer_presentation()
# 另外两种由 package 提供的格式( revealjs 与 rmdshower 包)

# (6) Dashboards(仪表盘)
# 用于可视化地和快速地交流大量的信息
# 通过 headers 控制输出的布局:
#Each level 1 header(#) begins a new page in the dashboard
#Each level 2 header(##) begins a new column
#Each level 3 header(###) begins a new row

# 具体案例:
render("R4DS5_dashboard.Rmd", output_file = "dashboard.html")
# learn more about flexdashboard:
# see <http://rmarkdown.rstudio.com/flexdashboard/>

渲染结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# (7) Interactivity(交互)
# 任何 html format(document/notebook/presentation/dashboard)都可以包含交互性内容

# htmlwidgets (使用 leaflet 包产生交互性网页)
library(leaflet)
leaflet()%>%
    setView(110.922,21.603,zoom = 2)%>%
    addTiles()%>%
    addMarkers(110.922,21.603,popup = "HOME")
# 其他提供 htmlwidgets 的包:dygraphs/DT/rthreejs/DiagrammeR
# learn more about htmlwidgets: <http://www.htmlwidgets.org/>

# shiny
# htmlwidgets 提供客户端的互动,与 R 完全脱离,内部使用 HTML 和 JavaScript 进行控制
# 而 Shiny 允许使用 R 代码生成互动页面
# 在 Rmd 的 header 中 call shiny
title: "shiny"
output: html_document
runtime: shiny
# 用 Input 函数添加互动性内容
library(shiny)
textInput("name", "What is your name?")
numericInput("age", "How old are you?",NA,min=0,max=150)
# 具体效果见 html 文件:
render("R4DS5_shiny.Rmd",output_file = "shiny.html")
# learn more about shiny<http://shiny.rstudio.com/>

# (8) Websites
# learning more: <http://bit.ly/RMarkdownWebsites>

# (9) Other Formats
# The bookdown package makes it easy to write books.
# Read <Authoring Book with R Markdown>
# see <http://www.bookdown.org>

# The prettydoc package provides lightweight document formats with attractive themes

# The rticles package 
# see more: <http://rmarkdown.rstudio.com/formats.html>
# create your own formats: <http://bit.ly/CreateNewFormats>

渲染结果

CHPT24 - R Markdown Workflow

SKIP


END