ggplot2学习笔记10:分面(Facetting)详解
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()
函数先生成一个长的面板条块(有任意数目的变量生成),再将它封装在二维中
设置排列的参数:
ncol
,nrow
:控制行列数,只需要设置一个;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
分类汇总:准备工作:
需要加载两个包
magrittr
和dplyr
,要使用其中函数- 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)详解相关推荐
- IP地址和子网划分学习笔记之《IP地址详解》
在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...
- 我的学习笔记——CSS背景渐变(Gradients)详解
我的学习笔记--CSS背景渐变(Gradients)详解 一.线性渐变(Linear Gradients) 1.语法 background-image: linear-gradient(directi ...
- IP地址和子网划分学习笔记之《子网划分详解》
一,子网划分概述 IP地址和子网划分学习笔记相关篇章: 1.IP地址和子网划分学习笔记之<预备知识:进制计数> 2.IP地址和子网划分学习笔记之<IP地址详解> 3.IP地址和 ...
- JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- 小猫爪: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. ...
- 对联智能生成的原理(学习笔记附代码实现与详解)
文章均从个人微信公众号" AI牛逼顿"转载,文末扫码,欢迎关注! 过年的脚步越来越近,是不是该给家里贴上一副对联呢?除了买买买,有没有想过自己动手写出一副对联?来吧,撸起袖子加油干 ...
- redis学习笔记(2)之redis主从详解
redis主从详解 主从详解 主从配置 拓扑 原理 数据同步 概念 复制偏移量 复制积压缓冲区 主节点运行ID Psync命令 全量复制流程 部分复制流程 心跳 缓冲大小调节 读写分离 内容来源为六星 ...
- redis学习笔记(7)之redis哨兵详解
redis哨兵详解 sentinel命令 客户端连接 素材代码 思路 实现过程 哨兵的切换实现原理 发布订阅基础 哨兵的实现原理 部署建议 需要关注的问题 代码流程 内容来源为六星教育,这里仅作为学习 ...
- Apollo星火计划学习笔记——Apollo决策规划技术详解及实现(以交通灯场景检测为例)
文章目录 前言 1. Apollo决策技术详解 1.1 Planing模块运行机制 1.2 Apollo决策功能的设计与实现 1.2.1参考路径 Reference Line 1.2.2 交规决策 T ...
- mmdetection学习笔记(二)配置文件详解
配置文件详解 四项基础配置 1. _base_/datasets 2. _base_/models 3. _base_/schedules 4. _base_/default_runtime.py 基 ...
最新文章
- Linux--Ubuntu12.04下安装JDK
- Android开发自定义View
- FFmpeg4.1编译:mac+android-ndk-14b+ffmpeg4.1成功编译
- 燕赵志愿云如何认证_人物|志愿者讲解员王静雅:用心讲好河北历史故事
- python元组类型_Python数据类型之元组
- ruby 怎么抛异常_Ruby中的异常处理
- asp.net Linux 界面,在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法
- c# 获取word表格中的内容_Java 在Word中创建嵌套表格
- Bootstrap文件上传插件File Input的使用
- Unity3D开发的赛车单机小游戏详细介绍(附有游戏下载链接)
- php5.4之分布式缓存memcache(windows7下安装配置)
- js 编写一道程序题输入长和宽之后点击按钮可弹出长方形面积。
- CSDNITeye招贤榜
- Windows 7下的虚拟光驱
- linux课程--实验三 vi 基本操作
- B. Shashlik Cooking
- linux 磁盘隔离,Linux 磁盘坏道故障修复
- 交友H5盲盒源码PHP开源版
- python——json数据格式的转换
- 【新学期、新Flag】例文:我的新学期Flag