R可视乎|分面一页多图

简介: 双变量数据可视化可能对于我们比较简单, 但是如果变量是三个或者更多,怎么在一幅图一起显示呢?今天我们就来讨论这个问题,解决方案有两种。

O@7E1_TJNJUD6QH}GE`LV_A.png


双变量数据可视化可能对于我们比较简单, 但是如果变量是三个或者更多,怎么在一幅图一起显示呢?今天我们就来讨论这个问题,解决方案有两种。


1.数据介绍

library(ggplot2)
head(mpg)

使用R包自带的mpg数据集,前几行展示如下。

library(ggplot2)head(mpg)

S`NSBG2Y[LIUQBFF_{5~Z@6.jpg


2.使用图形属性


比如说:散点图点的形状/透明度/颜色用第三个属性表示。


2.1.散点图的点的形状表示第三个属性(离散)

ggplot(data=mpg)+
  geom_point(mapping = aes(x=displ,y=cty,shape=as.factor(cyl)),size=2,color='skyblue')


2.2.散点图点的透明度表示第三个属性

ggplot(data=mpg)+  geom_point(mapping = aes(x=displ,y=cty,alpha=cyl),size=5,color='purple')


WU@F~T21P0V5P[DCLCA}29X.png


geom_point()中可以改变的参数alpha,colour,fill,group,shape,size,stroke(边缘的厚度)。所以我们还可以通过其他参数来引进更多的属性,但是越多图就显得越复杂。看下面这个图,但是可读性不是很高

image.gif

3.使用分面


我们可以将图片按照第三个属性进行分面处理。ggplot2的分面有两种方式,分别使用 facet_wrap facet_grid 函数。


3.1.facet_wrap()

当想通过单个变量进行分面,则可以使用函数`facet_wrap()`其第一个参数是一个公式,创建公式的方式是在~符号后面加一个变量名,并且该变量应该是离散的。facet_wrap的参数如下

facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed",           shrink = TRUE, as.table = TRUE, drop = TRUE)


facets:分面参数如 ~cut,表示用 cut 变量进行数据分类

nrow:绘制图形的行数

ncol:绘制图形的列数,一般nrow/ncol只设定一个即可

scales:坐标刻度的范围,可以设定四种类型。fixed

表示所有小图均使用统一坐标范围;free表示每个小图按照各自数据范围自由调整坐标刻度范围;free_x为自由调整x轴刻度范围;free_y为自由调整y轴刻度范围。

shrinks:也和坐标轴刻度有关,如果为TRUE(默认值)则按统计后的数据调整刻度范围,否则按统计前的数据设定坐标。

as.table:和小图排列顺序有关的选项。如果为TRUE(默认)则按表格方式排列,即最大值(指分组level值)排在表格最后即右下角,否则排在左上角。

drop:是否丢弃没有数据的分组,如果为TRUE(默认),则空数据组不绘图。

strip.position:条子位置,默认为"top",可改为bottom", "left", "right"


具体例子如下:

x轴是displ,y轴是hwy,用class(离散,7个分类)进行分面。

ggplot(data=mpg)+  geom_point(mapping = aes(x=displ,y=hwy))+  facet_wrap(~class,nrow = 2)


S{[`VW[ZPL[QPX){CQB`]KI.png


3.2.facet_grid()


如果想通过两个变量对图进行分面,则使用`facet_grid()`。这个函数第一个参数也是公式,但该公式包含由~隔开的两个变量。

facet_grid(facets, margins = FALSE, scales = "fixed", space = "fixed", shrink = TRUE,           labeller = "label_value", as.table = TRUE, drop = TRUE)

和facet_wrap比较,除不用设置ncol和nrow外(facets公式已经包含)外还有几个参数不同:

margins:这不是设定图形边界的参数。它是指用于分面的包含每个变量元素所有数据的数据组。很好用的参数!


具体例子如下


用drv与cyl变量进行分面,x轴方向是cyl,y轴方向是drv的值。注意的是俩都是分类型变量。

ggplot(data=mpg)+  geom_point(mapping = aes(x=displ,y=hwy))+  facet_grid(drv~cyl)


{(BA$0A)){A2P{{Q2J{6CAS.png


4. 思考及拓展


4.1. 如果使用连续变量进行分面,得到的图会非常的多,每个数值分一次面,可读性很差,不建议使用该方法。


4.2. 使用facet_grid(drv~cyl)生成的图中,空白单元的意义说明drv与cyl在该单元没有关系。以下代码可以看出两者之间的关系。

ggplot(data=mpg)+geom_point(mapping = aes(drv,cyl))


4.3. facet_grid()可以转换为facet_wrap图,只需改为facet_grid(drv~.)或facet_grid(.~cyl)。

ggplot(data=mpg)+  geom_point(mapping = aes(x=displ,y=hwy))+  facet_grid(drv~.)ggplot(data=mpg)+  geom_point(mapping = aes(x=displ,y=hwy))+  facet_grid(.~cyl)


4.4.要在每个面板中重复相同的数据,只需构造一个不包含faceting变量的数据框架。

ggplot(mpg, aes(displ, hwy)) +  geom_point(data = transform(mpg, class = NULL), colour = "grey85") +  geom_point(color='purple') +  facet_wrap(~class)



S`W)1AXIMT6TPF~QE~B8HR9.png



4.5. 去除条子框以及改变条子位置

加入参数:strip.position = "top"(默认),可改为其他(见上面参数详解)并加入theme将strip.placement="outside"就可以去除条子的框了。

ggplot(economics_long, aes(date, value)) +  geom_line() +  facet_wrap(vars(variable), scales = "free_y", nrow = 2, strip.position = "top") +  theme(strip.background = element_blank(), strip.placement = "outside")



RA8VRDOG6ILMS7Y)3O{)I5X.png

目录
相关文章
|
JSON API 数据格式
实时获取小红书笔记详情的API使用与解析
小红书是一个以分享消费经验、生活方式为主的社交平台,拥有大量的用户和内容。为了更好地了解用户在小红书上的行为和内容,许多开发者选择使用小红书开放平台提供的API接口。本文将介绍如何通过小红书笔记详情API实现实时数据获取,并给出相应的代码示例。
|
Java Maven Docker
Docker----安装部署私有Dockerhub即Harbor
Docker----安装部署私有Dockerhub即Harbor
1722 0
Docker----安装部署私有Dockerhub即Harbor
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
758 3
python知识点100篇系列(15)-加密python源代码为pyd文件
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
654 0
|
机器学习/深度学习 人工智能 供应链
精准农业:AI在农业生产中的应用
【10月更文挑战第1天】随着科技的发展,人工智能(AI)逐渐渗透到农业领域,通过精准监控和管理提升了农业生产效率和质量。AI在精准农业中的应用包括:精准农田管理,如个性化灌溉和施肥;作物病虫害识别与预测,及时发现并预防病虫害;智能农机自动化作业,提高作业效率;农产品质量检测与分类,确保品质;农业供应链优化,预测需求和价格。尽管面临数据收集、技术接受度等挑战,AI在精准农业中的未来前景广阔,有望实现全程自动化作业、数据驱动决策及智能预警系统,推动农业可持续发展。
1082 11
|
算法 Java C++
branch and price求解VRPTW问题代码详解
branch and price求解VRPTW问题代码详解
1047 0
branch and price求解VRPTW问题代码详解
|
运维 监控 Ubuntu
在Linux中,如何查看系统日志文件?
在Linux中,如何查看系统日志文件?
|
存储 数据库 索引
什么是B树及其变种B+树?
B+树是B树的一种优化变种,更适合用于数据库和文件系统的索引。
406 0
|
传感器 编解码 缓存
实战贴:开源GUI LittlevGL在MCU上的移植
实战贴:开源GUI LittlevGL在MCU上的移植
570 2
|
数据可视化 数据挖掘 Windows
单细胞免疫组库VDJ| 从零开始scRepertoire分析,解决真实场景中可能的问题(上)
单细胞免疫组库VDJ| 从零开始scRepertoire分析,解决真实场景中可能的问题
1826 0

热门文章

最新文章