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

目录
相关文章
|
前端开发 JavaScript 安全
开源一款剪贴板跨设备共享工具
`shigen`,编程博主,擅长多种语言,近期自制了一个名为`copyhub`的工具,用于局域网内跨设备同步剪贴板。设计灵感源于对现有共享工具的安全顾虑,采用`Flask`和`Redis`实现,前端直接HTML+JS,简化架构。用户通过取件码交换内容,不涉及复杂功能。代码已开源并在个人腾讯云服务器上部署。更多详情见shigen的GitHub和哔哩哔哩频道。一起探索,每天进步!
384 1
开源一款剪贴板跨设备共享工具
|
安全 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文件供直接导入使用。
399 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组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
442 0
【R语言实战】——fGARCH包在金融时序上的模拟应用
【R语言实战】——fGARCH包在金融时序上的模拟应用
|
12月前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
906 10
|
12月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
638 2
|
12月前
|
缓存 前端开发 JavaScript
前端性能优化:让你的网站更快、更流畅
前端性能优化:让你的网站更快、更流畅
220 0
|
存储 Python
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
|
机器学习/深度学习 分布式计算 大数据
一文读懂Apache Beam:统一的大数据处理模型与工具
【4月更文挑战第8天】Apache Beam是开源的统一大数据处理模型,提供抽象化编程模型,支持批处理和流处理。它提倡"一次编写,到处运行",可在多种引擎(如Spark、Dataflow、Flink)上运行。Beam的核心特性包括抽象化概念(PCollection、PTransform和PipelineRunner)、灵活性(支持多种数据源和转换)和高效执行。它广泛应用在ETL、实时流处理、机器学习和大数据仓库场景,助力开发者轻松应对数据处理挑战。
2917 1
|
算法 Java C++
branch and price求解VRPTW问题代码详解
branch and price求解VRPTW问题代码详解
852 0
branch and price求解VRPTW问题代码详解