Chapter 7

Positioning


文章目录

  • Chapter 7
  • Positioning
    • 7.1 介绍(Introduction)
    • 7.2 分面(Facetting)
      • 7.2.1 封装分面(Facet wrap)
      • 7.2.2 网格分面(Facet grid)
      • 7.2.3 标度控制(Controlling scales)
        • 7.2.3.1 固定标度与自由标度
        • 7.2.3.2 一个案例
      • 7.2.4 缺失分面变量(Missing facetting variables)
      • 7.2.5 分组和分面(Grouping vs. Facetting)
      • 7.2.6 连续变量(Continuous variables)

7.1 介绍(Introduction)

这部分讨论Positioning,特别是图层如何在页面上布局,以及坐标系统如何工作。有四个组件控制位置:

  • Position adjustments:调整层中重叠对象的位置;
  • Position scales:控制如何将数据中的值映射到图上的位置;

这部分主要介绍另外两个:

  • Facetting:分面是一种在页面上自动布局多个情节的机制。它将数据分成子集,然后在不同的分面中绘制每个子集;
  • Coordinate systems:控制两个独立的位置标度形成一个二维坐标系,最常见的坐标系是笛卡尔坐标系。

7.2 分面(Facetting)

每个小图都代表不同的数据子集。分面可以快速地分析数据各子集模式的异同。

本节讨论怎样较好微调分面,特别是和位置标度相关的方法。

  • facet_null():默认,无分面,单一图形
  • facet_wrap():封装型,本质上是一维,为节省空间封装成二维
  • facet_grid():网格型,生成一个由两个独立的部分组成的二维面板,面板的行和列可以通过变量来定义

两种绘图系统区别示意图

使用数据集:mpg数据集的一个子集(气缸数cylinders (4, 6, 8),驱动系统drive train (4, f),和6个classes

library(ggplot2)
mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
mpg2
#> # A tibble: 205 x 11
#>    manufacturer model      displ  year   cyl trans      drv     cty   hwy fl    class
#>    <chr>        <chr>      <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>
#>  1 audi         a4           1.8  1999     4 auto(l5)   f        18    29 p     compact
#>  2 audi         a4           1.8  1999     4 manual(m5) f        21    29 p     compact
#>  3 audi         a4           2    2008     4 manual(m6) f        20    31 p     compact
#>  4 audi         a4           2    2008     4 auto(av)   f        21    30 p     compact
#>  5 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact
#>  6 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact
#>  7 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact
#>  8 audi         a4 quattro   1.8  1999     4 manual(m5) 4        18    26 p     compact
#>  9 audi         a4 quattro   1.8  1999     4 auto(l5)   4        16    25 p     compact
#> 10 audi         a4 quattro   2    2008     4 manual(m6) 4        20    28 p     compact
#> # ... with 195 more rows

7.2.1 封装分面(Facet wrap)

facet_wrap()函数先生成一个长的面板条块(有任意数目的变量生成),再将它封装在二维中

设置排列的参数:

  • ncolnrow:控制行列数,只需要设置一个;
  • as.table:是否以表格的形式显示布局,有True和False两个选项;
base <- ggplot(mpg2, aes(displ, hwy)) + geom_blank() +   #这里可以使用其他几何对象,如geom_point()xlab(NULL) + ylab(NULL)base + facet_wrap(~class, ncol = 3)
base + facet_wrap(~class, ncol = 3, as.table = FALSE)

  • dir:控制环绕的方向horizontal或vertical,有 “h” 和 “v” 两个选项。
base + facet_wrap(~class, nrow = 3)
base + facet_wrap(~class, nrow = 3, dir = "v")

7.2.2 网格分面(Facet grid)

facet_grid()函数在二维网格中展示图形

在进行封面绘制时,需要设定哪些变量作为分面绘图的行,哪些变量作为列,规则如下:

  • 不进行分面:不使用函数facet_grid()或添加命令facet_null(),此时将会生成一个单独的面板
base + facet_null()

  • 一行多列:. ~ a
base + facet_grid(. ~ cyl)

  • 一列多行:b ~ .
base + facet_grid(drv ~ .)

  • 多行多列:a ~ b
base + facet_grid(drv ~ cyl)

7.2.3 标度控制(Controlling scales)

对于两种分面(wrap和grid),通过参数scales来控制面板位置标度的固定和自由:

  • scales = "fixed": x 和 y的标度在所有分面中都相同(默认)
  • scales = "free_x": x 的标度可变,y 固定
  • scales = "free_y": y 的标度可变,x 固定
  • scales = "free": x 和 y 的标度都可变

7.2.3.1 固定标度与自由标度

固定标度可以让我们在相同的基准上对子集进行比较:

mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
p <- ggplot(mpg2, aes(cty, hwy)) + geom_abline() +geom_jitter(width = 0.1, height = 0.1)
p + facet_wrap(~cyl)

自由标度可以帮助我们看到更多细节:

p + facet_wrap(~cyl, scales = "free")

7.2.3.2 一个案例

在变量y单位、数量级不同时,单独固定x轴,不限制y轴对数据的可视化将很直观。

economics数据集为例:

economics_long
#> # A tibble: 2,870 x 4
#>    date       variable value  value01
#>    <date>     <chr>    <dbl>    <dbl>
#>  1 1967-07-01 pce       507. 0
#>  2 1967-08-01 pce       510. 0.000265
#>  3 1967-09-01 pce       516. 0.000762
#>  4 1967-10-01 pce       512. 0.000471
#>  5 1967-11-01 pce       517. 0.000916
#>  6 1967-12-01 pce       525. 0.00157
#>  7 1968-01-01 pce       531. 0.00207
#>  8 1968-02-01 pce       534. 0.00230
#>  9 1968-03-01 pce       544. 0.00322
#> 10 1968-04-01 pce       544  0.00319
#> # ... with 2,860 more rows#按不同variable变量分面
ggplot(economics_long, aes(date, value)) + geom_line() + facet_wrap(~variable, scales = "free_y", ncol = 1)

注意facet_grid()存在一个限制:网格分面中每一列共享一个x轴,而每一行共享一个y轴,同列中的所有面板都必须具有相同的x标度,并且同行中的所有面板都必须具有相同的y标度。

facet_grid()中,有个叫space的附加参数,当space = "free"时,每行的高度和该行的标度范围一致,这对分类标度很有用:

reorder()函数使得模型(model)和生产商(manufacturer)按城市油耗英里数(cty)重新排序。

mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
mpg2$model <- reorder(mpg2$model, mpg2$cty)
mpg2$manufacturer <- reorder(mpg2$manufacturer, -mpg2$cty)
ggplot(mpg2, aes(cty, model)) + geom_point() + facet_grid(manufacturer ~ ., scales = "free", space = "free") +theme(strip.text.y = element_text(angle = 0))

7.2.4 缺失分面变量(Missing facetting variables)

先设置俩数据框,df1和df2,其中df1中有分面变量gender,而df2里没有这个变量。这时我们可以通过增加df2的图层(并且把它放在前面,要不就盖住df1的数据点了),让df2中的数据出现在每个分面中。

df1 <- data.frame(x = 1:3, y = 1:3, gender = c("f", "f", "m"))
df2 <- data.frame(x = 2, y = 2)ggplot(df1, aes(x, y)) + geom_point(data = df2, colour = "red", size = 4) + geom_point(size = 2) + facet_wrap(~gender)

7.2.5 分组和分面(Grouping vs. Facetting)

通过调整颜色、形状等图形属性可以来分组,而分面则是另一种分组方法。根据子集相对位置的不同,可以有选择的使用这两种绘图技巧:

  • 通过分面分组:每个组在其各自的面板中相距很远,并且组之间没有重叠,但很难分辨细微差异;
  • 通过**美学(图形属性)**分组:各组数据彼此靠近并且可能重叠,但很容易分辨细微差异。

通过创建一些随机数组举个栗子:

df <- data.frame(x = rnorm(120, c(0, 2, 4)),  #生成均值分别为0,2,4的120个正态分布随机数y = rnorm(120, c(1, 2, 1)),z = letters[1:3]
)ggplot(df, aes(x, y)) + geom_point(aes(colour = z))

ggplot(df, aes(x, y)) + geom_point() + facet_wrap(~z)

其他方法:

  • 利用dplyr分类汇总:

    准备工作

    需要加载两个包magrittrdplyr,要使用其中函数

    • magrittr包:R语言高效的管道操作magrittr(点我了解)

    ​ 关于%>%:magrittr包被定义为一个高效的管道操作工具包,通过管道的连接方式,让数据或表达式的传递更高效,使用操作符%>%,可以直接把数据传递给下一个函数调用或表达式。magrittr包的主要目标有2个,第一是减少代码开发时间,提高代码的可读性和维护性;第二是让你的代码更短,再短,短短短…

    • dplyr包:R语言数据处理利器——dplyr简介(点我了解)

    安装加载

    install.packages(c("magrittr", "dplyr"))
    library(magrittr)
    library(dplyr)
    

在前边创建的df数据集基础上,利用管道操作符%>%创建新的数据集df_sum

group_by()用于对数据集按照给定变量分组,返回分组后的数据集。对返回后的数据集使用以上介绍的函数时,会自动的对分组数据操作:

df_sum <- df %>% group_by(z) %>% summarise(x = mean(x), y = mean(y)) %>%rename(z2 = z)
df_sum  #均值
#> # A tibble: 3 x 3
#>   z2         x     y
#>   <fct>  <dbl> <dbl>
#> 1 a     -0.219 0.918
#> 2 b      2.04  1.82
#> 3 c      3.92  1.28

接下来创建散点分面图:第一个图层映射df数据;第二个图层映射df_sum数据,并设置颜色等图形属性;最后按照z分面:

ggplot(df, aes(x, y)) + geom_point() + geom_point(data = df_sum, aes(colour = z2), size = 4) + facet_wrap(~z)

  • 将所有数据放在每个面板的背景中,再突出显示所需分组数据(与[7.2.4](# 7.2.4 缺失分面变量(Missing facetting variables))方法原理一致):

dplyr数据包中的select()参数,选择子数据集df2

df2 <- dplyr::select(df, -z)  #-z表示删除df数据集中的变量zggplot(df, aes(x, y)) + geom_point(data = df2, colour = "grey70") +geom_point(aes(colour = z)) + facet_wrap(~z)

7.2.6 连续变量(Continuous variables)

连续变量也可以用来分面,但必须首先离散化它们。ggplot2提供了三个函数:

  • cut_interval(x, n):将数据分成n个相同长度的部分
  • cut_width(x, width):将数据按宽度划分
  • cut_number(x, n = 10):将数据划分为n个相同数目点的部分,每个分面上点数为n

如下图所示:

# Bins of width 1
mpg2$disp_w <- cut_width(mpg2$displ, 1)
# Six bins of equal length
mpg2$disp_i <- cut_interval(mpg2$displ, 6)
# Six bins containing equal numbers of points
mpg2$disp_n <- cut_number(mpg2$displ, 6)plot <- ggplot(mpg2, aes(cty, hwy)) +geom_point() +labs(x = NULL, y = NULL)
plot + facet_wrap(~disp_w, nrow = 1)

plot + facet_wrap(~disp_i, nrow = 1)

plot + facet_wrap(~disp_n, nrow = 1)


参考资料:

  • R语言可视化之《ggplot2:数据分析与图形艺术》
  • 书籍:《ggplot2:数据分析与图形艺术》
  • Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4

ggplot2学习笔记10:分面(Facetting)详解相关推荐

  1. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

  2. 我的学习笔记——CSS背景渐变(Gradients)详解

    我的学习笔记--CSS背景渐变(Gradients)详解 一.线性渐变(Linear Gradients) 1.语法 background-image: linear-gradient(directi ...

  3. IP地址和子网划分学习笔记之《子网划分详解》

    一,子网划分概述 IP地址和子网划分学习笔记相关篇章: 1.IP地址和子网划分学习笔记之<预备知识:进制计数> 2.IP地址和子网划分学习笔记之<IP地址详解> 3.IP地址和 ...

  4. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

    i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解 1 前言 2 FlexCAN简介 2.1 MB(邮箱)系统 2.1.1 正常模式下 2.1.2 激活了CAN FD情况下 2. ...

  6. 对联智能生成的原理(学习笔记附代码实现与详解)

    文章均从个人微信公众号" AI牛逼顿"转载,文末扫码,欢迎关注! 过年的脚步越来越近,是不是该给家里贴上一副对联呢?除了买买买,有没有想过自己动手写出一副对联?来吧,撸起袖子加油干 ...

  7. redis学习笔记(2)之redis主从详解

    redis主从详解 主从详解 主从配置 拓扑 原理 数据同步 概念 复制偏移量 复制积压缓冲区 主节点运行ID Psync命令 全量复制流程 部分复制流程 心跳 缓冲大小调节 读写分离 内容来源为六星 ...

  8. redis学习笔记(7)之redis哨兵详解

    redis哨兵详解 sentinel命令 客户端连接 素材代码 思路 实现过程 哨兵的切换实现原理 发布订阅基础 哨兵的实现原理 部署建议 需要关注的问题 代码流程 内容来源为六星教育,这里仅作为学习 ...

  9. Apollo星火计划学习笔记——Apollo决策规划技术详解及实现(以交通灯场景检测为例)

    文章目录 前言 1. Apollo决策技术详解 1.1 Planing模块运行机制 1.2 Apollo决策功能的设计与实现 1.2.1参考路径 Reference Line 1.2.2 交规决策 T ...

  10. mmdetection学习笔记(二)配置文件详解

    配置文件详解 四项基础配置 1. _base_/datasets 2. _base_/models 3. _base_/schedules 4. _base_/default_runtime.py 基 ...

最新文章

  1. Linux--Ubuntu12.04下安装JDK
  2. Android开发自定义View
  3. FFmpeg4.1编译:mac+android-ndk-14b+ffmpeg4.1成功编译
  4. 燕赵志愿云如何认证_人物|志愿者讲解员王静雅:用心讲好河北历史故事
  5. python元组类型_Python数据类型之元组
  6. ruby 怎么抛异常_Ruby中的异常处理
  7. asp.net Linux 界面,在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法
  8. c# 获取word表格中的内容_Java 在Word中创建嵌套表格
  9. Bootstrap文件上传插件File Input的使用
  10. Unity3D开发的赛车单机小游戏详细介绍(附有游戏下载链接)
  11. php5.4之分布式缓存memcache(windows7下安装配置)
  12. js 编写一道程序题输入长和宽之后点击按钮可弹出长方形面积。
  13. CSDNITeye招贤榜
  14. Windows 7下的虚拟光驱
  15. linux课程--实验三 vi 基本操作
  16. B. Shashlik Cooking
  17. linux 磁盘隔离,Linux 磁盘坏道故障修复
  18. 交友H5盲盒源码PHP开源版
  19. python——json数据格式的转换
  20. 【新学期、新Flag】例文:我的新学期Flag

热门文章

  1. python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO
  2. 前端性能优化(二)01-页面性能优化之浏览器——浏览器的主要作用 浏览器的组成结构
  3. OpenLayers实现小车的轨迹查询的功能
  4. EAS F7控件弹出表格隐藏某列
  5. 微信小程序云开发 --实现加法操作
  6. 机器学习中的随机过程(伯努利过程与泊松过程)
  7. 解决winrar解压出现crc校验错误的一个方法
  8. 系统集成项目管理工程师-第三章 信息系统集成专业技术知识
  9. PlasticSCM版本控制系统的基本使用教程
  10. Matplotlib绘制雷达图