R 作为入门级编程语言,被经常运用在数据整理、数据可视化、以及机器学习中。
本篇文章将主要介绍在R中如何可视化数据 (基础+进阶)。
R绘图的原理
使用R绘图,我们需要在脑海中明确几个必要元素。首先,需要有一张空白的画布, 如下图所示。其次,我们需要根据数据确定X轴、Y轴,以及X轴Y轴的取值范围,因为一个平面直角坐标系在R绘图过程中是必不可少的。接下来,我们就可以选择适当的图表类型(折线图、柱状图、点状图等),并根据数据坐标在坐标系中描绘数据。最后,我们还可以在画布上添加额外信息,例如图表名称,图例等,当然我们也可以根据需求使每个数据点在图表中呈现不同的颜色和形状、并排绘制多个图表等。
在拥有空白画布的基础上,我们可以使用R自带的可视化功能语句plot()来描绘散点图、折线图、柱状图等,辅助用户用于观察整个数据集的潜在趋势。
根据R绘图原理,使用如上语句,我们首先在空白的画布上描绘出了我们提到的第一个元素,平面直角坐标系
Figure 1 plot()确定平面直角坐标系
在R语言里,图表的绘制我们都可以使用编程,将一个任务(一个图表)拆分成若干个子任务(前文提到的,图表中的若干元素),然后叠加或扩充子任务(叠加元素来形成图表)来实现绘图。R plot()也是如此。
在拥有坐标系的基础上,我们便可以描绘数据点,注意此处默认图表类型是点状图。
在plot()语句括号中,逗号前我们定义了数据点的X轴坐标值,逗号后定义了对应数据点的Y轴坐标值,两个都是用数组的方式表达。因此如下plot()语句定义了5个数据点,分别是(1,3),(2,5),(3,8),(4,9),(5,13)。
Figure 2 plot()描绘数据点(点状图)
根据R绘图原理,在已经拥有数据点的基础上,我们可以通过扩充了plot()语句来定义图表的其他元素。我们把图表类型从点状图改变为折线图,即在plot()语句中,我们加入一个逗号,在逗号后定义 type =”l” 。
Figure 3 plot()更改图表类型 (折线图)
参考:type的取值及定义
根据不同的数据集及需求我们可以绘制更为复杂的可视化图表。
例如像我们提到的,可视化图表中的散点颜色,大小,以及形状都可以通过扩充plot()中的元素改变。
在原点状图基础上,我们定义了散点的大小(cex=4), 散点形状(pch=11)以及散点颜色(col=”green”)
Figure 4 plot()更改散点属性(大小,形状,颜色)
参考:pch所有的参数定义。
在更为复杂的图表中,我们可以叠加运行若干子元素语句来完成任务。在Figure 4基础上,我们可以使用text() 在特定的坐标增加文本。下图代码中,text(3,12, “This is text”) 表示在坐标点(3,12)插入“This is text”。
Figure 5 plot()在特定位置添加文本信息
和text()同理, legend() 语句可对图表呈现方式进行标注方便理解, lines() 语句允许我们在散点图的基础上加入折线图并且调整折线的粗细、长短、类型。这些语句都可以被灵活使用,使可视化图表在原有基础上达到更理想的效果。
R数据可视化工具
在R语言里,除了R自带的可视化工具plot(),还有很多精彩的工具包,比如ggplot2, 以及gganimate。
ggplot2
ggplot2 是R中被广泛应用的绘图包。与R plot()的基本作图系统相比,ggplot2旨在运用简单的编程语言绘制及美化数据可视化图表。我们将使用R Studio中自带的数据集mpg来进行ggplot2可视化演示根据R绘图原理,我们需要在ggplot2中将一个图表拆分成若干个子元素并进行叠加绘制。不同于R plot(),我们可以将ggplot()的绘制理解为两个步骤:首先我们先将需要的数据以及颜色等一些参数输入ggplot()中,其次叠加geom_*()语句,来绘制指定的图表的几何图像类型,比如散点图、折线图、柱状图等。
参考R绘图原理,ggplot2中我们可以将图表拆分为如下常用元素:
1. 数据(data): 需要可视化的数据
2. 映射(mapping): 数据中可调配的参数,如X、Y值,颜色等
3. 几何对象(geom_*): 图表的几何图像类型
4. 标度(scale_*):变量以何种参数(何种颜色、形状)映射到图形上
5. 主题(theme_*):图表主题设定,通常ggplot()工具包带有一些订制主题,方便进行图表美化
6. 分面(facet): 根据数据种类进行拆分和分层画图
7. 注释(annotate): 如plot()中的text(),进行文字标注
8. 标签(lab): 定义标注的X、Y轴名称,主标题、副标题等
在开始前,我们需要下载并调用ggplot2
注意:下载以及调用时工具包名称为”ggplot2”,但声明时,我们需要声明ggplot()语句
在如下程序中,我们首先完成了ggplot()参数的输入。
在这里,我们首先声明了第一个和第二个元素。data=mpg表示使用的数据集为mpg,mapping中是定义了映射到图表X轴、Y轴的数据属性,以及每个数据点的颜色(映射在X轴上的数据属性是displ,Y轴是hwy,颜色则按照数据集中class的种类标注,比如:如果数据集mpg中class有三个种类:A\B\C,那么数据的颜色标注则会按照A\B\C区分。)
注意:此时我们完成了第一个步骤:将数据以及颜色元素参数输入ggplot()中。现在,我们没有生成任何图表——运行此行语句只会生成一个空白画布。
在绘完数据点后,参考plot(),在ggplot2中我们也通过使用第三个元素,geom_point()来改变几何对象类型。
参考:geom_xxx()常用类型
Reference: ggplot2 Quick Reference: geom | Software and Programmer Efficiency Research Group (usi.ch)
http://sape.inf.usi.ch/quick-reference/ggplot2/geom
笔者常使用的包括geom_bar(), geom_line(), geom_hex(),geom_point()(分别为柱状图,条形图,六边形,散点图)叠加生成不同的可视化图表。
注意:ggplot() 中每一个叠加子元素语句都需要用 “+”连接。而plot()中,我们则需要声明一个新语句。
Figure 6 ggplot 散点图
在原有图表的基础上,我们还可以给图表进一步美化。比如,在如下语句中, 根据ggplot()常用图表元素清单,我们叠加并扩充了如下子元素:
第二个元素,ggplot()的映射(mapping)中我们扩充了color = displ,它命令图表的颜色按displ种类标注
第四个元素,scale_colour_gradient() 使我们的图表具有了渐变的色彩
第六个元素,theme_bw()使背景帆布变成白色
第八个元素,labs(),xlab(),和ylab()则重修修订了主题,副标题,角标,以及X、Y轴名称。
gganimate
除了可绘制静态图表的功能包,R还有很多强大的功能包,其中gganimate就是笔者常用来描绘动态图表的功能包。在ggplot2的基础上,gganimate允许用户定义一个变量作为每一帧变化的参照。如果通过上文,你已经对ggplot2已经有一定了解,那么在原有的语句中添加一些简单的指令,就可以实现图表的动态化。
与ggplot2同理,我们需要首先下载以及调用gganimate。
在RStudio Console中我们可以看到,在使用gganimate之前,我们还需要安装其他的功能包 包括gifski和 av。
与ggplot2相似,我们首先需要生成静态图表
在生成静态图表的基础上,动图及为多张静态图按一定规则堆在了一起。这里的规则便是我们提到的,按照声明的变量,比如:时间或类别顺序。
上述代码中,与ggplot2不同的是黄色划线部分。
”title = ‘ Year: {frame_time} ’‘’代表了每一帧图表的标题。
’frame_time’ 与最后一行transition_time(year)相对应,说明动图的每一帧是按照year的递增顺序变化的。ease_aes(‘linear’)则规定了图表是以一种较柔和的幅度变化的。gganimate提供了很多变化方式,可在官方文档中找到:
官方文档
https://gganimate.com/
transition_*:定义数据按照哪个参变量进行“移动”
view_*(): 定义坐标轴随数据变化(即为图表可以根据数据值范围拉大或缩小)
shadow_*():定义数据出现的方式(存在旧数据的历史记忆以影子的形态相继出现)
enter_*()/exit_*():定义新数据出现和旧数据褪去的方式
ease_aes():美观定义,控制变化的节奏
最后,看看我们的成果:
同理,动态折线图和柱状排名图在gganimate中都是可以被实现的。
总结
总结一下:要在R中实现数据的可视化绘制,首先我们便要明确R绘图原理。很多功能包的使用,比如ggplot(), gganimate(), 其中的元素便是根据R绘图原理,将一个宏观的图表进行元素拆分,并进行分别叠加声明。另外,在绘图时,千万不要急于对图表进行美观。绘制出基本的图表和几何类型永远是最首要也是最耗时的任务。因为在实际情况中,数据集往往并不如我们想象的完美,我们需要使用R语言对数据进行很多整合、清理。在基本图表已经完美的情况下,我们才能对图表进行美观修饰。至于绘图时的语法,我们只要熟悉了R绘图原理,明白了绘图时需要定义的元素有哪些,不论哪个工具包,就都可以手到擒来了。
编辑:王菁
校对:林亦霖