前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言从入门到精通:Day17 (ggplot2绘图)

R语言从入门到精通:Day17 (ggplot2绘图)

作者头像
用户6317549
发布2019-12-17 12:13:58
5K0
发布2019-12-17 12:13:58
举报
文章被收录于专栏:科研猫科研猫
在之前的教程中,我们在学习各类数据分析方法的过程中学习创建了各种各样的普通图形和特殊图形,它们大部分都是利用R的基础绘图系统创建的。经过这么长时间对R语言的学习,相信对于R中的四种独立图形系统,你肯定也不会感到惊奇。除了基础图形,grid、lattice和ggplot2软件包也提供了图形系统,它们克服了R基础图形系统的低效性,大大扩展了R的绘图能力。

四种常见的作图系统中,ggplot2包基于一种全面的图形“语法”,提供了一种全新的图形创建方法。这个包极大地扩展了R绘图的范畴,提高了图形的质量。它通过全面一致的语法帮助我们将多变量的数据集进行可视化,并且很容易生成R自带图形难以生成的图形。

与基础图形不同的是,要调用ggplot2函数需要下载并安装该包

> install.packages("ggplot2")

第一次使用前还要进行加载

> library(ggplot2)

本次教程中,将用三个数据集解释ggplot2包的使用。

  • 第一个是lattice包中的singer数据集,它包括纽约合唱团歌手的身高和语音变量等。
  • 第二个是mtcars数据集,它包含32辆汽车的详细信息。
  • 最后一个是car包中的Salaries数据集,包含了大学教授的收入信息,并用来探索性别差异对他们收入的影响。

详细介绍ggplot2之前,有必要先熟悉一些ggplot2的语法,下面三幅图是由简单到复杂的三个示例(见图1,2,3)。图1是最简单的散点图,基本语法或者做图步骤为:

函数ggplot()初始化图形并且指定要用到的数据来源(mtcars)和变量(wt、mpg)

函数aes()指定每个变量扮演的角色(aes代表aesthetics,即如何用视觉形式呈现信息)。这里,变量wt的值映射到沿x轴的距离,变量mpg的值映射到沿y轴的距离。函数ggplot()虽然设置图形,但没有自己的视觉输出,而是使用一个或多个几何函数向图中添加了几何对象(简写为geom),包括点、线、条、箱线图和阴影区域。在散点图的例子中,函数geom_point()在图形中画点,创建了一个散点图。最后,函数labs()是可选的,可添加注释(包括轴标签和标题)。

图1,散点图

图2与图1最大的区别在于添加了一条“平滑”曲线,这里用到了函数geom_smooth()。对于图3,ggplot2包提供了分组和小面化(faceting)的方法。分组指的是在一个图形中显示两组或多组观察结果。小面化指的是在单独、并排的图形上显示观察组。ggplot2包在定义组或面时使用因子(factor)(主要涉及函数facet_grid())。

ggplot2很强大,能够创建各种各样的信息图。可惜,强大也带来了复杂性。不像其他的R包,ggplot2凭借其自身就可以被认为一种综合图形编程语言。它有自己的学习曲线,有时这个曲线比较陡,但是坚持住,这些努力都是值得的。

图2,线性拟合结果图

图3,“分组”示例图

了解了ggplot2的基本语法之后,我们首先介绍几何函数及其能够创建的图形类型,然后详细了解函数aes(),以及如何利用它来对数据进行分组。接下来,将考虑刻面和网格图形的建立。最后,将研究如何调整ggplot2图形的外观,包括修改坐标轴和图例、改变配色方案以及添加注释。

函数ggplot()指定要绘制的数据源和变量,几何函数则指定这些变量如何在视觉上进行表示(使用点、条、线和阴影区)。表1列出了几种常见的几何函数(目前有37个几何函数可供使用)。

表1,几何函数

举个最简单的例子,函数geom_boxplot()可以绘制箱线图,如图4。

图4,箱线图示例

每个几何函数都有一组自己的选项,可以通过帮助文档来了解,我们也给大家列出了一些常见选项。为了给大家展示这些选项的作用,这里给出两个例子(图5,6)。图6中将小提琴图和箱线图结合起来,这对于基础图形来说,就很难实现了。

表2,几何函数中的常见选项

图5,展示常见选项的图例

图6,小提琴图和箱线图的组合

讲到这里,必须要强调使用ggplot2的最终目的还是为了更好的理解数据。而为了理解数据,在一个图中画出两个或更多组的观察值通常是很有帮助的。在R中,组通常用分类变量的水平(因子)来定义。分组是通过ggplot2图将一个或多个带有诸如形状、颜色、填充、尺寸和线类型的视觉特征的分组变量来完成的。函数ggplot()中的aes()函数负责分配变量(图形的视觉特征),所以这是一个分配分组变量的自然的地方。下面通过数据集Salaries中的性别和学术等级分组,绘制获得博士学位年数与薪水的关系图(图7)。

图7,博士毕业年数和薪水的散点图

代码中还提供了条形图的分组绘图,留给大家自己尝试。

在基础图形中可以实现的图形“组合”在ggplot2中自然也不是难事,可以使用函数facet_wrap()和函数facet_grid()创建。这里提供了三个图形来展示这两个函数的语法规则(图8,9,10)。

图8,语法facet_wrap(~var, nrow=4)示意图

图9,语法facet_grid(.~var)示意图

图10,语法facet_grid(var~.)示意图

我们在前面已经见过了函数geom_smooth()的例子,该函数中的参数含义依次为:method代表要使用的平滑函数,如lm、glm等;参数formula代表在函数中使用的公式,和回归分析中的参数formula类似;参数se代表是否绘制置信区间;参数level代表使用的置信区间水平;参数fullrange指定拟合是否覆盖全图或仅仅是数据。下面是使用了函数geom_smooth()绘制的两个薪水和毕业年数的关系图(图11,12)。

图11,博士毕业年数与目前薪水之间的关系

图12,男性和女性博士毕业年数和薪水之间的关系

在基础图形中,函数par()被用来调整图形参数,ggplot2中则有自己的函数来完成这些改动,比如前面例子中已经出现过的函数labs()。首先是可以灵活控制坐标轴外观的函数,如图13(用到函数scale_x_continuous()等,具体见代码)。

图13,坐标轴改动示意图

如果我想要把图13里面在右边的图例换个位置,那也不是一件难事,如图14。

图14,图例修改示意图

ggplot2中改变图案中特定元素的方法很多,其中,函数theme()能帮助我们调整字体、背景或者颜色等,我们可以将自己定义好的theme保存起来,这样可以使我们的图有鲜明的个人风格(如图15,代码已提供)。

图15,函数theme()的示例图

基础图形中,参数mfrow和函数layout()可以绘制组合图形,ggplot2里面函数grid.arrange()可以实现这一点(如图16,具体见代码)。

图16,函数grid.arrange()示例

最后,ggpolt2绘制出的图形可以通过常规的图片保存方法导出,也可以利用函数ggsave(),大家不妨自己动手尝试一下。

ggplot2包学习起来可能有些困难,同时网上也有很多学习资料,一系列ggplot2的函数及相应的例子可以在http://docs.ggplot2.org上找到,但最重要的还是要多动手!多动手!多动手!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科研猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档