R语言学习笔记——柱形图

今天分享R语言中的柱形图,所有图表语法都基于ggplot2包中的ggplot函数完成 。

其实R语言本身就带有各种作图函数,比如plot、bar、pie等,而且语法非常简单明了,为什么还要用ggplot2这种语法独立性很强、自成体系的作图包来作图呢?

一个例子就能感受到:

plot(mpg$cty,mpg$hwy)#R语言内置散点图函数(无需加载任何辅助工具包)

ggplot(mpg,aes(cty, hwy)) + geom_point(colour="steelblue")+labs(x = "City mpg", y = "Highway") #ggplot2包中的ggplot函数(需先加载ggplot2工具包支持)

这只是一个很简单的例子,两个图所表达的是同样的数据变量,同样的图表形式,而且在精确度上几乎毫无差异。

但是,即便两种味道同样的食物,外观的好坏也会影响食欲,这两个图表给人的感受,就像是一款诺基亚手机与一款iPhone手机给人带来的对比一样,即便功能差异不大,但是外观上的艺术感已经将两者拉开了层次。

这也是为啥我曾经刚接触R语言,还在糊里糊涂的学各种内置图表函数时,突然看到大神们早已用上了ggplot,立马选择入门ggplot的原因。

今天给大家介绍ggplot函数中柱形图的用法(一大家子呢,单序列柱形图、簇状柱形图、堆积柱形图、百分比堆积柱形图、以及分面柱形图)。

其实严格来讲,在R预言的作图函数中,是并不严格区分柱形图与条形图,因为二者无论是形式上还是功能上都表达着同样的数据类型和信息。他们有一个通用的名称——Barplot。

二者之间的转换往往只需要添加一个额外的参数而已。

coord_flip()

今天先介绍柱形图:

这里就暂且使用ggplot2包中内置的数据集mpg。

通过head(mpg)函数可以查看该数据集前6条记录,通过str(mpg)查看数据集各变量类型,summary(mpg)可以查看该数据集简单的统计汇总结果。

单序列柱形图:

ggplot(mpg,aes(class,displ))+geom_bar(stat="identity",fill="steelblue")

以上参数中,mpg是数据集名称,aes内的参数依次是x值——class(分类变量),y值——displ(连续变量)。

geom_bar是在ggplot坐标系系统之上添加的柱形图图层,stat是对其中的数值型变量所做的统计变换(默认为count),fill是颜色填充设定,可以是某一分类变量,也可以直接映射为颜色。

ggplot(mpg,aes(reorder(class,displ),displ)+geom_bar(stat="identity",fill="steelblue")

以上最简单的单序列柱形图,其实还有非常多的参数调整设定,这里不再一一详解,感兴趣可以参考ggplot2——数据分析与图形艺术这本该包作者的书。

多系列簇状柱形图:

with(mpg,table(class,year))

通过汇总可以看到class与year之间的交叉表关系,以下将以这两个变量来制作系列簇状柱形图。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='identity')

因为year是int型变量,所以在参数设定市需要用factor变成因子型。以上图表是未做任何设定时的两系列柱形图,可以看到两个系列位置重叠无法看到无法看清楚1999年的柱形图实际高度。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='identity',alpha=0.3)

即便是通过alpha参数来设置柱形图的透明度,也还是很难将1999年与2008年的柱形图清晰的区别开。这里我们想要看到的效果是,1999年与2008年的柱形图互不重叠而是并列放置。需要调整postion参数。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='dodge')

将position参数调整为dodge之后,达到了我们想要的效果,此时两个序列并列,可以清晰的看到彼此高度。

当然我们也可以设置两个序列堆叠。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='stack')

通过设定position参数为stack,我们可以以堆叠形式处理两年的指标,同样达到目标。

如果我们想要观察每一个品类中两年度所占份额百分比,同样也可以通过修改position参数实现。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='fill')

此时便可以得到各品类两年数据份额占比,仔细观察你会发现,图例颜色顺序与图表中颜色顺序相反,果然到处都是坑啊。

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='stack')+guides(fill = guide_legend(reverse = TRUE))

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='fill')+ guides(fill = guide_legend(reverse = TRUE))

通过设定柱形图填充顺序与图例显示顺序,使得图例中的颜色顺序与图表中一致。

最后一种图表类型是分面组图:

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='fill')+facet_grid(. ~ drv)

ggplot(data=mpg,aes(x=class,fill=factor(year)))+geom_bar(position='fill')+facet_grid(drv~.)

除此之外,我们还可以套用现有主题、对图表各细分元素进行精修(图例、坐标轴标签、数据标签、柱形间距、背景及颜色主题等),这些细节有很多的专用参数进行调整设置,详细内容还是最好看看哈德利那本专著,会理解的比较透彻。

通过设定分面参数:facet_grid,我们可以将某一分类变量做成每一个分类项的分面组图。

但是考虑到大家日常在excel中作图比较多一点儿,R语言中的作图方法与excel截然不同:

excel中通过汇总过后的宽数据作图(也是office能够识别的唯一格式)

但是R语言秉承的作图规则是标准数据源(长数据,也就是类型数据库格式的数据源)

图表所支持的数据存储格式的巨大差别往往成为初学者在R语言图表面前磕磕碰碰、引起困惑的重大原因。(本人也是初学者哦~)

所以,想要玩转R语言可视化,必须能够适应长数据这种标准数据存储格式的特点。理解变量类型是如何对图表呈现产生的影响。

想要适应R语言作图:个人觉得有两条路子可以参考:

1、假设你已经完全沉浸在或者无法脱离excel的宽数据作图形式,这样也就意味着你导入的数据集往往也是宽数据格式。你需要非常熟练的使用R语言中的数据重塑辅助工具包:dplyr、tidyr、reshape2等将宽数据重塑为R作图支持的长数据格式。好处是可以循序渐进的适应R语言作图数据的习惯,但是需要额外学很多数据重塑工具与函数。

2、假如你对于长数据有很好的理解(比如经常用统计分析软件,大部分都接触的标准长数据,也就是一维表),那么你完全可以直接在excel中将宽数据转化为长数据(二维转一维),或者直接将数据库中的长数据导入R,只需做一些基本的设定即可,至少不会在数据长宽格式转换上浪费太多时间和精力。

我比较提倡第二种,因为,excel不是标准的可视化软件(虽说功能不可小觑,但是因为兼顾着数据汇总的办公属性,所以对于数据存储的格式没有做过多的设定,灵活性太高,为了适应这种情景,微软的工程师们所开发的图表引擎也要使用这种汇总后的二维数据表作为作图数据,这很明显,因为从数据库刚导出的一维表(长数据),很多场合是不适合直接在excel中作图的)。

而像Eviews、SPSS、Stata以及R、Python等专业的统计分析工具甚至Tableau、PowerBI等数据可视化软件,都是默认接受长数据作图的。(在数据导入前都会做变量格式设定,尽管也会提供一些长宽数据转换的工具)。

以上只是想说,excel中的作图理念与主流的统计分析软件、数据可视化软件是背道而驰的,用久了它,想迁移到别的软件上去需要花费更多的转换成本。所以最好在开始就尝试着搞明白各个作图软件的对于所支持的作图数据的格式设定方式,不要被excel作图理念所限制。

关于R语言中数据长宽转换的函数,点击阅读原文有小魔方推荐的关于reshape2包的详细使用教程,可以自己了解。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2016-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程心路

人人都可以用C语言写推箱子小游戏

C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了。这个是我学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提...

1K4
来自专栏数据魔术师

运筹学教学|运输问题代码分享(C++代码及详细注释)

经过了长时间的学习……小编终于学会了运输问题(Transportation Problem),可以说是很骄傲了!然而……今天老板突然给了小编一个规模巨大的问题去...

5817
来自专栏阮一峰的网络日志

数据压缩与信息熵

1992年,美国佐治亚州的WEB Technology公司,宣布做出了重大的技术突破。 该公司的DataFiles/16软件,号称可以将任意大于64KB的文件,...

3745
来自专栏人工智能

斯坦福的Stanford.NLP.NET:集合多个NLP工具

-欢迎 该项目包含使用使用 IKVM.NET 将 Stanford NLP.jar 软件包重新编译到.NET 中的构建脚本,这些软件经过测试可以有效工作,该工具...

2768
来自专栏人工智能

手把手带你用机器学习写unity AI

2017unity机器学习社区挑战赛参加地址:https://connect.unity.com/challenges/ml-agents-1 打开下载的uni...

2527
来自专栏AI科技评论

开发 | 如何利用 TVM 优化深度学习GPU op?教你用几十行Python代码实现2-3倍提升

数天前,陈天奇团队宣布推出 TVM,在微博上表示,「我们今天发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机,cuda, op...

4448
来自专栏js编程在工科课程中的简单应用

3.1 Contour绘制

首先一起学习利用百度的开源项目绘制contour,百度搜索“echarts heatmap”,找到热力图的一个案例(http://echarts.baidu.c...

1260
来自专栏ThoughtWorks

TW洞见〡3D打印的各种问题及解决方案

文章作者来自ThoughtWorks:贺思聪 ,图片来自网络。 3D打印机已经买回来几个月了,基本上每天都要打印一些东西,期间遇到了很多的问题积累了很多的经验...

40012
来自专栏大数据挖掘DT机器学习

《小美好》短评文本情感分析+生成词云

因为最近看了一下《致我们单纯的小美好》,虽然情节是有点“二”吧,但是看了觉得真的很怀念初高中的日子,一时玩心大发,于是就想搞点有意思的东西。。。首先去爬了豆瓣...

4239
来自专栏技术总结

算法(1)

2467

扫码关注云+社区

领取腾讯云代金券