耳听为虚,眼见为实,数据可视化(Visualise)是整个数据分析中重要的一环,主要旨在借助于图形化手段,清晰有效地传达与沟通信息,实现对于相当稀疏而又复杂的数据集的深入洞察,可视化工作的好坏直接决定了我们是否能有效的发现问题,看到结论。
说到底我们都是视觉动物,看得见的东西很好理解不是?今天就给大家分享,数据可视化领域重要的R包--ggplot2。
按照《图形的语法》一书中的观点,一张统计图形就是
从数据到点、线或方块等几何对象的颜色、形状或大小等图形属性的一个映射,
其中还可能包含对数据进行统计变换(如求均值或方差),
最后将这个映射绘制在一定的坐标系中就得到了我们需要的图形。
图中可能还有分面,就是生成关于数据的不同子集的图形。
ggplot2正是基于Leland Wilkinson在Grammar of Graphics中提出的理论,取首字母缩写再加上plot,得名ggplot。
ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离
ggplot2是按图层作图
ggplot2保有命令式作图的调整函数,使其更具灵活性
ggplot2将常见的统计变换融入到了绘图中。
先来介绍一些ggplot2中的基本概念:
图形属性(aes) 横纵坐标、点的大小、颜色,填充色等
几何对象(geom_) 上面指定的图形属性需要呈现在一定的几何对象上才能被我们看到,这些承载图形属性的对象可能是点,可能是线,可能是bar
统计变换 (stat_) 比如求均值,求方差等,当我们需要展示出某个变量的某种统计特征的时候,需要用到统计变换
ggplot2将基本图形要素分为:
不同的几何对象((geom)、
不同的几何对象属性(aes)、
不同的子窗口(facet)等。
我们的作图过程,就是将自己所需要表达的信息对应于上述各种图形工具。上述图形工具应当可以进行自由的组合,来用于表达复杂多变的信息。
1. ggplot2的逻辑
用过photoshop的都明白图层的概念,ggplot2的逻辑其实就是真正实现了一个图层叠加的概念,一个图层一个图层一步一步地画出来:一句语句代表一个图层,最后把所有图层重叠起来形成最终的图片。
举个栗子:
library(ggplot2) #加载包
p ggplot(mtcars, aes(wt, mpg)) + #开始绘图
geom_point(aes(colour = qsec)) #添加点
p
p + geom_smooth()
可以看出,ggplot的绘图有以下几个特点:
第一,有明确的起始(以ggplot函数开始)与终止(一句语句一幅图);
其二,图层之间的叠加是靠“+”号实现的,越后面其图层越高。
其三,就是对于分组数据的处理
p + facet_grid( ~ gear)
2. ggplot2的要素
ggplot图的元素可以主要可以概括如下【参考:黄宝臣】:
最大的是plot(指整张图,包括background和title),
其次是axis(包括stick,text,title和stick)
legend(包括backgroud、text、title)
facet,又可以分为外部strip部分(包括backgroud和text)
内部panel部分(包括backgroud、boder和网格线grid,其中粗的叫grid.major,细的叫grid.minor)
大致见下图,这部分内容的熟悉程度直接影响到对于theme的掌握,因此希望大家留心:
3. ggplot2图层以及其他函数的分类
下面来详细理解下ggplot2里的绘图命令
ggplot2里的所有函数可以分为以下几类:
用于运算(fortify_,mean_等)
初始化、展示绘图等命令(ggplot,plot,print等)
按变量组图(facet_等)
真正的绘图命令(stat_,geom_,annotate)这三类就是实现一个函数一个图层的核心函数。
微调图型:严格意义上说,这一类函数不是再实现图层,而是在做局部调整:
scale_:直译为标尺,这就是与aes内的各种美学(shape、color、fill、alpha)调整有关的函数。
guides:调整所有的text。
coord_:调整坐标。
theme:调整不与数据有关的图的元素的函数。
4. 绘图
我们再来解构下面的代码,来分析一下ggplot2是怎么作图的。
首先,我们来看一下mtcars这个数据集长什么样:
View(mtcars)
作图代码:
p ggplot(mtcars, aes(wt, mpg)) + #code 1
geom_point(aes(colour = qsec),stat = "sum") + #code 2
facet_grid( ~ gear) + #code 3
annotate("text", x = 4, y = 30, label = "paste(italic(R) ^ 2, \" = 0.75\")", parse = TRUE) #code4
p
code 1 :ggplot首先载入了这个mtcars的集合,然后指定给了mpg作为其y坐标位置,wt为x坐标位置。
code 2: 指定了qsec作为其染色的标准(分组),然后开始绘制,读取mtcars$mpg[1]、mtcars$wt[1],确定位置,然后为其染成mtcars$qsec[1]颜色;再绘制第二点。。。
code 3 : 按照gear属性在不同的子窗口(facet)展示数据特征。
code 4 : 在指定的位置(x,y)注释(label)指定的文字。
说到这里,介绍下ggplot2大致内置了哪些图:
点(point, text):往往只有x、y指定位置,有shape但没有fill
线(line,vline,abline,hline,stat_function等):一般是基于函数来处理位置
射(segment):特征是指定位置有xend和yend,表示射线方向
面(tile, rect):这类一般有xmax,xmin,ymax,ymin指定位置
棒(boxplot,bin,bar,histogram):往往是二维或一维变量,具有width属性
带(ribbon,smooth):透明是特征是透明的fill
补:包括rug图,误差棒(errorbar,errorbarh)
有了这些基本元素就可以按照你的需要一步步加图层了(使用“+”)。
总结
总结一下,一个极具诚意的作图应该长成下面这个样子:
ggplot(data = , aes(x = , y = )) +
geom_XXX(...) + #真正的绘图命令
stat_XXX(...) + #统计变换
annotate(...) + #注释,标注信息
scale_XXX(...) + #与aes内的各种美学(shape、color、fill、alpha)调整有关的函数。
coord_XXX(...) + #调整坐标
guides(...) + #调整所有的text
theme(...) #调整不与数据有关的图的元素的函数
这几期的玩转数据只是抛砖引玉,数据挖掘,统计分析博大精深,小编也在持续学习中。
数据准备,清洗,统计分析,可视化及模型构建又很多的R包可以实现。我最喜欢的就是Hadley Wickham 大神的作品。下面的包都可以通过加载tidyverse来一起载入。诗一样的作品有没有。
ggplot2, for data visualisation.
dplyr, for data manipulation.
tidyr, for data tidying.
readr, for data import.
purrr, for functional programming.
tibble, for tibbles, a modern re-imagining of data frames.)
再膜拜下大神,我们一起交流学习进步。