分享

数据可视化之——ggplot2

 啊司com 2017-01-14

引言

ggplot2是用来做统计绘图的包,Hadley Wickham的又一力作,它与R中其他的绘图不太一样,它有一个深度的语法基础。你也许要问了,不就是绘图吗,还有语法?是的,还真有,简单来说,这个绘图语法告诉我们:一个统计图形是一个从数据到美学属性(颜色,形状,大小)以及几何对象(点,线,条)的映射。

话不多说,直接进入正题,在这之前先加载一个演示数据集。

演示数据

演示数据采用pgdat数据集,如果你想要获取该数据集的源代码,可以通过点击微信公众号中的数据挖掘--案例数据--pgdat数据集得到。该数据为2015-2016赛季NBA顶级控球控卫(包括库里,康利,保罗,沃尔,维斯布鲁克,欧文)的常规赛单场数据统计。

  • pts —— 得分,衡量球员的攻击能力

  • ast —— 助攻,控卫组织能力的体现

  • tov —— 失误,体现控场能力

通过上面的数据我们可以通过图形化的展示来回答一些有趣的问题,比如

  • 在这些控卫中,谁的得分能力最强?又是谁的助攻能力最好?

  • 进一步地,谁的得分稳定性较好?

  • 大家整个赛季的出勤率怎么样?

在这个过程中,本文将会详细展示如何用ggplot2创建一些基本的图形,并利用这些图形来回答以上问题。

核心组成部分

每一张ggplot2图形都有三个核心组成部分:

数据,即待展示的维度变量构成的数据集,一般为数据框形式

美学映射:用数据集的变量定义一个可视化属性的映射

图层,至少一个图层去描述每一个观测,图层一般用geom系列函数

例如:

ggplot(pgdat, aes(x = pts, y = ast)) + geom_point()

以上语句定义了一个散点图: 

数据: 采用pgdat数据集

美学映射: 把得分pts映射到x轴,把助攻映射到y轴

图层: 采用散点

注意函数调用的结构,数据和美学映射用ggplot()函数,而添加图层用+号。

其他美学属性

在上图基础上,还可以添加美学属性变量,例如颜色、形状、大小等,对应在aes函数添加colour, shape,size对应的变量即可,例如,在上图中我们将球员作为颜色变量添加到美学映射当中:

ggplot(pgdat, aes(x = pts, y = ast,colour = player)) + geom_point()

这里自动将不同的球员映射成了不同的颜色,有没有觉得很方便?

美学映射确实很方便,但是当你想要设置固定的美学属性的时候,切忌不能把参数写到aes里面,而是应该放到外面,否则画出的图形很有可能不是你想要的效果。看看下面的例子,自行体会下。

ggplot(pgdat, aes(x = pts, y = ast)) + geom_point(aes(colour = 'blue'))

ggplot(pgdat, aes(x = pts, y = ast)) + geom_point(colour = 'blue')

分面

分面是展示附加的分类变量的另外一种技术。分面首先按指定的分类变量做数据的分割,然后对分割后的子集数据作图,最后将成型的多个图形以表的形式展示出来。

有两种类型的分面: facet_gridfacet_wrapfacet_wrap()函数比较常用,这里用其做展示,facet_grid()也不难,你可以自行查阅帮助文档学习。下面本文采用facet_wrap()来对不同球员的得分和助攻数据做展示。

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()

geom_smooth()默认方法设置method = “loess”,表示局部多项式回归拟合。这里通常用span参数来调整拟合曲线的平滑程度,span取值0到1,值越大曲线越平滑。

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)

geom_smooth()的平滑方法还有多种,比如“lm”,“rlm”,“gam”等等。

ggplot(pgdat, aes(x = pts, y = ast)) + geom_point() + geom_smooth(method = 'lm')

geom_boxplot() 箱型图

不同球员的得分的数据展示:

ggplot(pgdat, aes(x = player, y = pts)) + geom_point()

发现数据变少了,那是因为一个赛季的得分数据有相同的,都叠加在一起成为一个点了,怎么办? 采用geom_jitter(),它把数据在水平方向加上一个小的随机干扰,下图看起来是不是好多了^_^

ggplot(pgdat, aes(x = player, y = pts)) + geom_point() + geom_jitter()

这样展示还不直观,直接上geom_boxplotgeom_violin

ggplot(pgdat, aes(player, pts)) + geom_boxplot()

ggplot(pgdat, aes(player, pts)) + geom_violin()

稍微解读一下这两张图带给我们的信息,可以看出:

  • 1.库里的得分能力明显高出其他人一截,而这里面属康利的得分能力最弱;

  • 2.威少的高位异常值较多,说明其得分爆发力较强;

  • 3.沃尔和保罗得分较稳定,欧文虽然平均得分不低,但是其得分稳定性较差。

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() 直线

画连接数据点的直线。两者的区别是geom_line()只能从左往右连线,而geom_path()则不限制连线的方向,所以geom_line()一般用在时间序列数据的探索和展示上。

# 定义参赛场次变量
pgdat <> group_by(pgdat,player) %>% mutate(num=rev(seq_along(rk)))
# 得分时序图
ggplot(pgdat, aes(x = num,y = pts,colour=player)) + geom_line(size=0.8) + facet_wrap(~player)

来看看助攻失误的路径图:

# 助攻失误路径图
ggplot(pgdat, aes(x = ast,y = tov)) + geom_path(aes(colour=player),size=0.8) + geom_point() + facet_wrap(~player)

通过上图可以看出,康利的助攻不多,但失误最少,其中有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语句会自动打印出图,但是如果该语句是在循环操作或者自定义的函数中时,需要强制用print函数输出,如下:

p <> ggplot(pgdat, aes(x = pts, y = ast)) + geom_point()
print(p)

保存图片

ggsave函数保存图片:

# 保存图片到硬盘
ggsave('plot.png')

ggsave函数中还有很多参数可以设置,比如图片的大小、保存位置、保存格式等等,具体设置参考帮助文档help(ggsave)。

缓存图片

saveRDS函数可以缓存图片到硬盘,缓存和调用方式如下:

saveRDS(p, 'plot.rds')
q <> readRDS('plot.rds')

该方式仅适合短期缓存,长期缓存的图形结构会发生变化,不推荐使用。

当你熟悉了ggplot2的一套语法习惯以后,你会发现用它来画图十分方便。后续的可视化的文章将会继续介绍如何基于ggplot2包采用编程的思维来作图,以提高作图效率。

未完待续。。。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多