ggplot2绘图I

ggplot2
可视化
Author

hcl

Published

October 10, 2022

ggplot2 绘图语法是从数据产生图形的一系列语法:

选取整洁数据将其映射几何对象(如点、线等),几何对象具有美学特征(如坐标轴、颜色等),若需要则对数据做统计变换调整标度,将结果投影到坐标系,再根据喜好选择主题

ggplot(data = < DATA > ,
       mapping = aes( < MAPPINGS > )) +
       < GEOM_FUNCTION > (
            mapping = aes( < MAPPINGS > ),
            stat = < STAT > ,
            position = < POSITION > ) +
       < SCALE_FUNCTION > +
       < COORDINATE_FUNCTION > +
       < FACET_FUNCTION > +
       < THEME_FUNCTION >

映射(mapping)

  • aes(): 美学映射, 就是将数据集中的变量数据映射(关联)到相应的图 形属性
  • 映射:指明了变量与图形所见元素之间的联系,告诉 ggplot 图形元素 想要关联哪个变量数据
  • 最常用的映射(美学)有:
    • x: x 轴
    • y: y 轴
    • color:颜色
    • size:大小
    • shape:形状
    • fill:填充
    • alpha:透明度
  • 最需要的美学是 x 和 y, 分别映射到变量 displ 和 hwy, 再将美学color 映射到drv,此时图形就有了坐标轴和网格线
ggplot(data = mpg,
       mapping = aes(x = displ, y = drv, color = drv))

  • 映射不是直接为出现在图形中的颜色、外形、线型等设定特定值,而是建立数据中的变量与可见的图形元素之间的联系
  • 经常将图形的美学 color, size 等映射到数据集的分类变量,以实现不同分组用不同的美学来区分
  • 若要为美学指定特定值,比如 color = “red”, 是不能放在映射aes() 中的

几何对象

每个图形都是采用不同的视觉对象来表达数据,称为是”几何对象”。不同类型的”几何对象”从不同角度来表达数据,如散点图、平滑曲线、线形图、条形图、箱线图等。

ggplot2 提供了 50 余种 “几何对象”,不同的几何对象支持的美学会有些不同,但均以geom_xxxx()的方式命名,常用的有:

  • geom_point(): 散点图
  • geom_line(): 折线图
  • geom_smooth(): 光滑(拟合)曲线
  • geom_bar()/geom_col(): 条形图
  • geom_histogram(): 直方图
  • geom_density(): 概率密度图
  • geom_boxplot(): 箱线图
  • geom_abline(): 参考直线

要绘制几何对象,只需添加图层。绘制散点图:

ggplot(mpg, aes(displ, hwy, color = drv)) +
  geom_point()

美学映射也可以放在几何对象中,效果同上:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv))

为图形美学设置特定值,但注意不能放在映射 aes() 中

ggplot(mpg, aes(displ, hwy)) +
  geom_point(color = "blue")

图层是依次叠加的,再添加一个几何对象:光滑曲线,区分两种写法:

ggplot(mpg, aes(displ, hwy, color = drv)) +
  geom_point() +
  geom_smooth()

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv)) +
  geom_smooth()

出现这种不同涉及 ggplot2”全局” 与” 局部” 的约定:

  • ggplot() 中的数据和映射,是全局的,可供所有几何对象共用;
  • 而位于” 几何对象” 中的数据和映射,是局部的,只供该几何对象使用;
  • “几何对象” 优先使用局部的,局部没有则用全局的。

标度

通常 ggplot2 会自动根据输入变量选择最优的坐标刻度方案,若要手动设置或调整,就需要用到标度函数,统一格式为:scale_<MAPPING>_<KIND>()

标度函数控制几何对象中的标度映射:不只是x,y轴,还有color,fill,shape,size产生的图例。它们是数据中的连续或分类变量的可视化表示,这需要关联到标度,所以要用到映射

常用的标度函数有:

  • scale_*_continuous(): * 为 x 或 y
  • scale_*_discrete(): * 为 x 或 y
  • scale_x_date()
  • scale_x_datetime()
  • scale_log10(), scale_sqrt(), scale_*_reverse(): *为 x 或 y
  • scale_gradient(), scale_gradient2(): * 为 color,fill 等

scales 包提供了很多现成的设置刻度标签风格的函数

图例与坐标轴的组件

修改坐标轴刻度及标签

用 scale_*_continuous() 修改连续变量坐标轴的刻度和标签:

  • 参数 breaks 设置各个刻度的位置
  • 参数 labels 设置各个刻度对应的标签
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  scale_y_continuous(breaks = seq(15, 40, by = 10),
                     labels = c(" 一五", " 二五", " 三五"))

用 scale_*_discrete() 修改离散变量坐标轴的标签

ggplot(mpg, aes(x = drv)) +
  geom_bar() + # 条形图
  scale_x_discrete(labels = c("4" = " 四驱", "f" = " 前驱",
                              "r" = " 后驱"))

修改坐标轴标签、图例名及图例位置

  • 用 labs() 函数的参数 x, y, 或者函数 xlab(), ylab(), 设置 x轴、 y 轴标签
  • 若前面已使用 color 美学,则可以在 labs() 函数中使用参数color 修改颜色的图例名
  • 图例位置是在 theme 图层通过参数 legend.position 设置,可选取值有”none”, “left”, “right”, “bottom”, “top”.
ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv)) +
  labs(x = " 引擎大小 (L)", y = " 高速燃油率 (mpg)",
       color = " 驱动类型") + # 或者
  # xlab(" 引擎大小 (L)") + ylab(" 高速燃油率 (mpg)")
  theme(legend.position = "top")

设置坐标轴范围

用 coord_cartesian() 函数的参数 xlim 和 ylim, 或者用 xlim(),ylim() 函数,设置 x 轴和 y 轴的范围:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv)) +
  coord_cartesian(xlim = c(5, 7), ylim = c(10, 30)) # 或者

# xlim(5, 7) + ylim(10, 30)

变换坐标轴

设置图标标题

用 labs() 函数的参数 title, subtitle, caption 设置标题、副标题、脚注标题(默认右下角)

p = ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv)) +
  geom_smooth(se = FALSE) +
  labs(title = " 燃油效率随引擎大小的变化图",
       subtitle = " 两座车 (跑车) 因重量小而符合预期",
       caption = " 数据来自 fueleconomy.gov")
p

图形标题默认居左,若要居中,需要加 theme 图层专门设置

p + theme(plot.title = element_text(hjust = 0.5),
          # 标题居中
          plot.subtitle = element_text(hjust = 0.5))

设置fill, color颜色

数据的某个维度信息可以通过颜色来展示,颜色直接影响图形的美感。可以直接使用颜色值,但是更建议使用 RColorBrewer(调色板)或 colorspace包。

  1. 离散变量
  • manual: 直接指定分组使用的颜色
  • hue: 通过改变色相 (hue) 饱和度 (chroma) 亮度 (luminosity) 来调整颜色
  • brewer: 使用 ColorBrewer 的颜色
  • grey: 使用不同程度的灰色

用 scale_*_manual() 手动设置颜色,并修改图例及其标签

ggplot(mpg, aes(displ, hwy, color = drv)) +
  geom_point() +
  scale_color_manual(
    " 驱动方式",    # 修改图例名
    values = c("red", "blue", "green"),
    # breaks = c("4", "f", "r"),
    labels = c(" 四驱", " 前驱", " 后驱")
  )

用 scale_*_brewer() 调用调色版中的颜色

ggplot(mpg, aes(x = class, fill = class)) +
  geom_bar() +
  scale_fill_brewer(palette = "Dark2") # 使用 Dark2 调色版

  1. 连续变量
  • gradient: 设置二色渐变色
  • gradient2: 设置三色渐变色
  • distiller: 使用 ColorBrewer 的颜色
  • identity 使用 color 变量对应的颜色,对离散型和连续型都有效

用 scale_color_gradient() 设置二色渐变色

ggplot(mpg, aes(displ, hwy, color = hwy)) +
  geom_point() +
  scale_color_gradient(low = "green", high = "red")

用 scale_*_distiller() 调用调色版中的颜色

ggplot(mpg, aes(displ, hwy, color = hwy)) +
  geom_point() +
  scale_color_distiller(palette = "Set1")

添加文字标注

ggrepel 包提供了 geom_label_repel() 和 geom_text_repel() 函数,为图形添加文字标注。

首先要准备好标记点的数据,然后增加文字标注的图层,需要提供标记点数据,以及要标注的文字给label美学,若来自数据变量,则需要用映射。

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))

若要在图形某坐标位置添加文本注释,则用 annotate()函数,需要提供添加文本的中心坐标位置,和要添加的文字内容

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  annotate(
    geom = "text",
    x = 6,
    y = 40,
    label = " 引擎越大\n燃油效率越高!",
    size = 4,
    color = "red"
  )

鄂ICP备2022016232号-1