引言ggplot2是用来做统计绘图的包,Hadley Wickham的又一力作,它与R中其他的绘图不太一样,它有一个深度的语法基础。你也许要问了,不就是绘图吗,还有语法?是的,还真有,简单来说,这个绘图语法告诉我们:一个统计图形是一个从数据到美学属性(颜色,形状,大小)以及几何对象(点,线,条)的映射。 话不多说,直接进入正题,在这之前先加载一个演示数据集。 演示数据演示数据采用pgdat数据集,如果你想要获取该数据集的源代码,可以通过点击微信公众号中的数据挖掘--案例数据--pgdat数据集得到。该数据为2015-2016赛季NBA顶级控球控卫(包括库里,康利,保罗,沃尔,维斯布鲁克,欧文)的常规赛单场数据统计。
通过上面的数据我们可以通过图形化的展示来回答一些有趣的问题,比如
在这个过程中,本文将会详细展示如何用ggplot2创建一些基本的图形,并利用这些图形来回答以上问题。 核心组成部分每一张ggplot2图形都有三个核心组成部分: 数据,即待展示的维度变量构成的数据集,一般为数据框形式 美学映射:用数据集的变量定义一个可视化属性的映射 图层,至少一个图层去描述每一个观测,图层一般用geom系列函数 例如: ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() 以上语句定义了一个散点图: 数据: 采用pgdat数据集 美学映射: 把得分pts映射到x轴,把助攻映射到y轴 图层: 采用散点
其他美学属性 在上图基础上,还可以添加美学属性变量,例如颜色、形状、大小等,对应在aes函数添加colour, shape,size对应的变量即可,例如,在上图中我们将球员作为颜色变量添加到美学映射当中: ggplot(pgdat, aes(x = pts, y = ast,colour = player)) + geom_point() 这里自动将不同的球员映射成了不同的颜色,有没有觉得很方便?
ggplot(pgdat, aes(x = pts, y = ast)) + geom_point(aes(colour = 'blue')) ggplot(pgdat, aes(x = pts, y = ast)) + geom_point(colour = 'blue') 分面分面是展示附加的分类变量的另外一种技术。分面首先按指定的分类变量做数据的分割,然后对分割后的子集数据作图,最后将成型的多个图形以表的形式展示出来。 有两种类型的分面: ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + facet_wrap(~player) geom系列函数上面的geom_point()只是众多geom系列函数中的一个,本文接下来介绍几个常用函数: geom_smooth() 平滑曲线对数据做拟合,画出平滑曲线及其标准差 ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + geom_smooth()
ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + geom_smooth(span=0.2) ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + geom_smooth(span=1)
ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + geom_smooth(method = 'lm') geom_boxplot() 箱型图不同球员的得分的数据展示: ggplot(pgdat, aes(x = player, y = pts)) + geom_point() 发现数据变少了,那是因为一个赛季的得分数据有相同的,都叠加在一起成为一个点了,怎么办? 采用 ggplot(pgdat, aes(x = player, y = pts)) + geom_point() + geom_jitter() 这样展示还不直观,直接上 ggplot(pgdat, aes(player, pts)) + geom_boxplot() ggplot(pgdat, aes(player, pts)) + geom_violin() 稍微解读一下这两张图带给我们的信息,可以看出:
geom_histogram() 直方图直方图用来刻画数据的分布: ggplot(pgdat, aes(pts)) + geom_histogram() ggplot(pgdat, aes(pts,fill = player)) + geom_histogram() + facet_wrap(~player) geom_bar() 柱状图可以用柱状图来展示球员的出勤率: ggplot(pgdat, aes(player)) + geom_bar(aes(fill=player),width=0.4) 铁人威少整个赛季82场比赛仅缺席两场,而康利和欧文缺席了1/3的比赛。 geom_path() 和 geom_line() 直线画连接数据点的直线。两者的区别是 # 定义参赛场次变量 来看看助攻失误的路径图: # 助攻失误路径图 通过上图可以看出,康利的助攻不多,但失误最少,其中有7场0失误,十分难得;威少的助攻最多,但其失误高居不下;助攻失误比控制的最好的还要属在联盟打拼了十年以上的传统控卫保罗了。 添加坐标轴标签和标题添加坐标轴标签用xlab和ylab,添加标题用ggtitle ggplot(pgdat, aes(x = num,y = pts,colour=player)) + geom_line(size=0.8) + facet_wrap(~player) + xlab('参赛场次') + ylab('得分') + ggtitle('2015-2016赛季NBA顶级控卫得分') 至此,ggplot的基本绘图功能就介绍完了。接下来介绍下图片的输出。 图片的输出显示图片通常运行不带赋值操作的ggplot语句会自动打印出图,但是如果该语句是在循环操作或者自定义的函数中时,需要强制用 p <> ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() 保存图片用 # 保存图片到硬盘
缓存图片
saveRDS(p, 'plot.rds')
当你熟悉了ggplot2的一套语法习惯以后,你会发现用它来画图十分方便。后续的可视化的文章将会继续介绍如何基于ggplot2包采用编程的思维来作图,以提高作图效率。 未完待续。。。 |
|