ggplot2 总结

ggplot2使用总结,各种坑和技巧

What is ggplot2

ggplot2tidyverse家族中进行数据可视化的核心package

gg: Grammar of Graphics

How to use ggplot2

安装

install.packages("tidyverse")

搭配RStudio食用更佳。

功能速览

  1. Rstudio提供一系列的Cheatsheets用于快速入门及核心功能速查,ggplot2部分可下载
  2. 各函数详细参数及示例参见Reference
  3. ggplot2还支持拓展包,针对特殊功能,如动态图片主题设定图表注释增强型统计图表等,拓展包提供了更好的封装,简化使用。

可视化理念

  • 作者意图

    All plots are composed of the data, the information you want to visualise, and a mapping, the description of how the data’s variables are mapped to aesthetic attributes.[1]
    Hadley Wickham

  • 我的理解
    ggplot2,把图分为数据,几何图形,图形属性等几个部分,图的各个部分被定义为组件形式,组件实现数据与几何对象的映射,通过图形属性定义组件之间的组合形式进行绘图。

    传统绘图按类绘图,抽象程度过高,导致绘制复杂对象(形态和数量)时不够灵活,ggplot2 降低了图的耦合度,将对象层级由类型图降低到图组件,虽然ggplot2 实现方式偏向于函数式编程,但每个函数操作的仍是单个图组件对象,这便于工程化时进行移植与复用。

    如今主流可视化方案中都采用数据与几何对象映射的思想,这样又将图与数据进行了解耦合,对于定义好的映射关系,只要输入数据格式一定,图就可以自动匹配。因此将数据处理步骤与绘图进行隔离。

Tricks and Bugs

Framework

个人习惯按以下核心框架绘图。

p <- 
 # 创建空白ggplot对象
 ggplot() +
 # 添加一个或多个几何对象
 # 个人不太喜欢把data和aes放在ggplot()里全局设置
 # 如果多个几何对象分别使用不同数据源,指定全局设置会造成混乱
 geom_point(data = , aes(x = , y = ), ...) + 
 # 设置坐标轴标题
 labs(x = , y = , ...) + 
 # 设置坐标轴缩放
 scale_x_continuous(limits = , breaks = , ...) + 
 # 添加标注
 annotate(...) + 
 # 设置主题样式
 theme_bw(...) + 
 # 覆写部分主题配置
 theme(...)

各类图都可以在此模板基础上进行调整与自定义,详细配置建议参考[2]

以下内容为我在日常使用中调整和配置的tricks。

Structure

ggplot2 的典型结构如下,panel部分用于承载几何对象,其他每个部分都可单独设置。

Geoms

各种Geoms的实现方法官方示例十分详细,请移步

# 查看设置点的形状
ggpubr::show_point_shapes()
# 查看设置线的形状
ggpubr::show_line_types()

Scales

Themes

用于调整theme(...)中的内容。

  • 背景色

    # 无填充则设置为 element_blank()
    # 绘图区
    panel.background = element_rect(fill, color, ...),
    # 绘图区外侧
    plot.background = element_rect(fill, color, ...)
  • 网格线

    # 主网格
    panel.grid.major = element_line(colour, size, ...)
    # 次网格
    panel.grid.minor = element_line(colour, size, ...)
  • 绘图边距
    查看默认绘图边距[3],其他边距内容参见[4]

    # 默认主题
    theme_grey()$plot.margin
    [1] 5.5pt 5.5pt 5.5pt 5.5pt
    # 其他主题(推荐)
    theme_get()$plot.margin 
  • ggplot2 调整图例

Color

ggplot2 颜色配置

Font

绘图使用Times New Roman字体。

  1. 定义字体样式
    windowsFonts(RMN = windowsFont("Times New Roman"))
  2. 在需要设置字体的位置设置family属性
    family = "RMN"

Facetting

ggplot2 分面绘图

Annotations

ggplot2 添加注释

Layout

ggplot2 多图组合主要通过grid等一系列包实现[5]

规则排列

# 并排多图,nrow指定图像排列行数
p + grid.arrange(p1, p2, nrow = 1)
# 多图不规则排列,将需要排列的图像加入列表 gl,通过layout_matrix指定排列形式
p + grid.arrange(
  grobs = gl,
  widths = c(2, 1, 1),
  layout_matrix = rbind(c(1, 2, NA),
                        c(3, 3, 4))
  )

对于重叠图可以使用annotation_custom,指定子图排布位置。

# g 是子图元素
p + annotation_custom(
    grob = g,
    # 定位坐标,左下右上点
    xmin = 1,
    xmax = 5,
    ymin = 5,
    ymax = 10
  )

Output

图像输出直接使用ggsave()[6]

ggsave(
  # 图像名称
  filename,
  # 图对象
  plot,
  width = NA,
  height = NA,
  units = c("in", "cm", "mm"),
  # 分辨率
  dpi = 300,
  # 对于tiff类型图像,建议加入此选项压缩图片
  compression = "lzw")

Elsevier推荐出图尺寸,可以据此调整width

Note

  • ggplot2 提供了强大的自定义功能,可以通过长期使用形成适应自己研究体系的绘图模板,方便绘图的标准化,未来使用时可将更多精力放在数据处理上。

  • 但更高的灵活度意味着简单功能可能也需要复杂代码实现(或者根本实现不了,需要绕路😂),如果折腾精力不够,建议简单图还是使用传统绘图软件。

  • 对于特别复杂的图,各种高端炫酷的以及3D类还是建议AI+PS(懂得都懂😏)、地理空间类则建议使用PythonGeopandas,机器学习类的图也是Python提供的轮子更多。

  • 交互类图表不是ggplot2擅长的地方,特别是用于RMarkdown文档展示的图,推荐使用各种图表js的R版本实现,ggplot2还是老老实实做静态图片吧。这里有我远古时期在全R环境下实现的交互式网页,动态图还是用前端工具做吧😂

ggplot2 虽好, 可不要贪杯🍻哦

Acknowledgements

Reference