欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

R语言学习ggplot2绘制统计图形包全面详解

程序员文章站 2022-06-28 14:29:46
目录一、序二、ggplot2是什么?三、ggplot2能画出什么样的图?四、组装机器五、设计图纸六、机器的零件1. 零件——散点图1) 变换颜色2) 拟合曲线3) 变换大小4) 修改透明度5) 分层6...

一、序

作为一枚统计专业的学僧,首先需要掌握的编程语言一定是r。虽然自己对r谈不上精通,但却有着不一样的热爱,尤其热衷于使用r语言绘制各种各样觉得十分酷炫的图。每每磕完一个绘图作品,仿佛过了一个愉快的寒暑假,充实而满足。而在r语言中,谈到绘图,就不得不聊聊ggplot2这个大神器。

刚开始接触学习的时候,其实是非常抵触,觉得非常非常难的,但随着一张张图片跃然于屏幕之上,心中的抵触满满消失,取而代之的甚至多出了一丝喜爱。而这丝喜爱愈酿愈醇厚,愈酿愈香甜。这就促使我写一写这篇博文。回顾我之前学习ggplot2所走过的路,使大家能够避免走上我曾经走过的死胡同,从而走上一条康庄大道。也希望大家能够爱上r这门编程语言,享受使用ggplot2绘图的乐趣。

本文其实借鉴了网上很多的教程与参考文献,具体这些学习资料的网址,也会在文末进行说明。

二、ggplot2是什么?

一句话概括:它是一个用来绘制统计图形(不只是统计图形)的r包!

为什么叫ggplot呢?其中的gg当然不是good game的意思,而是grammar of graphics,直译就是绘图的语法,这是一门学问,绘图的学问。后面会介绍其与众不同的语法。

作者是hadley wickham,下面我们先瞻仰一下大神,沾点灵气,为后续的ggplot学习之路打好基础。

R语言学习ggplot2绘制统计图形包全面详解

说起这位作者,可就厉害了。他是rstudio公司的首席科学家,在博士期间其实就已经开发出了ggplot包,后面觉得写的不行,于是推陈出新,天空一声巨响,ggplot2闪亮登场。由于这个包实在是太好用了,所以渐渐的,如今python等多个编程语言都有了其对应的库。

当然,如果仅仅凭借ggplot2,wickham还无法成为rstudio公司的首席科学家,他还是dplyrdevtoolsreadxlrvest等包的作者,是一位全能型大神。

与此同时,在工作之外,他擅长烘焙和调制鸡尾酒,并且还有自己的家庭食谱网站。真的非常的腻害!

更新:大神还荣获2019年的统计学诺贝尔奖——copss 奖!

好了,言归正传,我们接着介绍ggplot2

三、ggplot2能画出什么样的图?

前面一直在夸它的好,得看看它究竟能创作出什么样的图!(由于博客的限制,不能使用svg的高清无码矢量图,故只能使用略带模糊的jpg图片)

R语言学习ggplot2绘制统计图形包全面详解

R语言学习ggplot2绘制统计图形包全面详解

前面两个图都是标准的统计学的我们需要画的图,只不过是将箱线图、柱状图、直方图、散点图、拟合回归以及相关系数,全部融合在了一张图上,信息量非常丰富。集百家之所长,成一家之言!但这还没什么,ggplot2还能做出令你更加吃惊的统计图。就比如下面的回归树图:

R语言学习ggplot2绘制统计图形包全面详解

还有下面这个像岩浆一样的族谱图:从祖先到你,如何薪火相传。

R语言学习ggplot2绘制统计图形包全面详解

以及最后一个犯罪率的变化情况。

R语言学习ggplot2绘制统计图形包全面详解

好看的图片千千万,有趣的绘图包只有ggplot2。这里只介绍极小的一部分情况,说明一下它能做些什么。屏幕中的图,如果不自己生成,就永远只是别人家的图,而不是自己的,所以下面我们就来讲讲如何像搭积木,组装机器一样,组装成一个独属于你的妖娆且风骚的图片。

四、组装机器

ggplot2绘图三步走:

  • 按照**“设计图纸”**
  • 用一个个**“零件”**
  • 自己进行**“组装”**

后面会一一进行介绍,这三步。但其实只要有一个概念,用ggplot2就是像ps一样,一个图层一个图层的叠加,最后组成我们的目标绘图。

它的优势非常明显:

  1. 用户能在更抽象层面上控制图形,使创造性绘图更容易
  2. 采用图层的设计方式,使其更具灵活性
  3. 图形美观,同时避免繁琐细节
  4. 将常见的统计变换融入到了绘图中

五、设计图纸

想要了解ggplot2,我们必须先了解下面这些概念:

  1. 数据(data)和映射(mapping):将数据映到图像
  2. 几何对象(geometric):代表在图中看到的实际元素,如点、线、多边形等
  3. 统计变换(statistics):对数据进行某种汇总,如直方图,或将二维关系用线性模型解释
  4. 标度(scale):将数据的取值映射到图形空间,例如用:颜色、大小、形状表示不同取值
  5. 坐标系(coordinate):数据如何映射到图形所在平面,提供作图所需的坐标轴和网格线
  6. 分面(facet):将数据分解为子集,进行联合展示
  7. 图层(layer):对所需的绘图操作进行一层一层叠加,最终得到所需图形

这些概念能帮助你加深对其的理解,但是还是不懂?没关系!我们刚开始只需要掌握下面的零件构造就好了!

六、机器的零件

在最最最开始,你需要安装r并且建议安装r studio,都是免费的,并且都需要安装,然后可以直接从r studio打开。

然后我们需要先安装ggplot2包,在r或者r studio中使用下述语句,即可完成安装。

install.packages('ggplot2')

接着,我们就可以学习其中的每个零件的用法了。

1. 零件——散点图

如果我们想要看两个变量之间的关系,最简单,最方便的做法就是绘制散点图,那我们如何使用ggplot2绘制这样一个图形呢?

library(ggplot2)
p <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy))
p + geom_point()

R语言学习ggplot2绘制统计图形包全面详解

首先需要使用library()ggplot2包进行加载(记得每次重新打开都需要进行加载!),当然也可以使用require()。然后就可以愉快地进行绘图了。

我们需要找到一个映射,也就是一对一的对应关系,这个我们在程序中如何给定呢?这就需要使用ggplot()这个函数。

首先在data =后面需要加上数据集的名称,在例子中是mpg一个关于汽车的数据集(注意:这个数据集是ggplot2包中特有的,加载了包才会有这个数据集)。在这个数据集里面有很多变量,其中有ctyhwy等一系列变量。 每个变量都有一列数值,也就是样本的信息,我们需要看ctyhwy两个变量对应的信息,就需要指定x轴是谁,y轴对应的是谁。在代码中,首先需要使用aes()将两个坐标轴的信息对应起来。aes代表的是aesthetic mappings,具有美感的映射,然后在里面分别使用x =y =来制定需要映射的变量。至此,我们的对应关系就找出来了。

但是!此时,你运行p这个变量是没有图像信息反馈出来的,因为你只是指定了关系,而没有说明应该以什么形式进行展现。可能是散点、折线、曲线等等。不过由于我们是进行散点图的绘制,所以使用的是后面还要+ geom_point()就可以展现出散点图了,其中geom表示的是geometric object,几何对象的意思。

接着,我们再对散点图进行一点点润色。(黑黑的点真的好丑)

1) 变换颜色

p <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(year)))
p + geom_point()

R语言学习ggplot2绘制统计图形包全面详解

这里我们指定了其散点的颜色,在aes()中使用了colour =,其后面的year也是mpg数据集中的一个变量。里面只有1999和2008两年,每个样本都有一个年份。(colour =写在aes()里面可以自动分配颜色,写在外面就是强制指定点的颜色,如加上‘blue'等)

不过为了将数字转化成factor因子形式,我们这里使用了factor()将数值变成了因子(可以自己尝试不添加factor()看看会出现什么样的结果,其实会出现颜色的深浅表示数值的大小)。

这里使用了p <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(year))),我们默认将后面这部分赋值给了变量p,后面的p全部都是指代这行语句。

这行代码还有另外一个地方发生了变化,data =消失,只是这个都可以省略,只要在对应的位置有数据集这个变量就好了(这里是mpg)。同理,其实x =y = 在这里都可以省略。

在出现了散点之后,还是觉得空荡荡的,我们再加点别的零件。

2) 拟合曲线

p + geom_point() + stat_smooth()

R语言学习ggplot2绘制统计图形包全面详解

相比于原先的操作,只是再加了一行 + stat_smooth(),stat表示的是statistical transformation,统计学变换。因为我们需要用插值的方法来绘制拟合直线,并且附带置信区间。

3) 变换大小

p + geom_point(aes(colour = factor(year), size = displ)) + 
  stat_smooth()   # 排量越大,点越大

R语言学习ggplot2绘制统计图形包全面详解

想要变换点的大小,只需再在aes()中加上size =,后面接上一个新的变量名称displ代表着汽车的排量,每个点的尺寸越大,代表着排量越大,其对应关系如右边图例所示。

在此基础上我们还想在一张图上添加更多的信息,同时也可以解决点与点之间的重叠的问题,不会因为遮盖而使得我们有部分点看不到。那么我们应该怎么做呢?

透明度!

4) 修改透明度

p + geom_point(aes(colour = factor(year),
                   size = displ), alpha = 0.5) +
  stat_smooth() + scale_size_continuous(range = c(4, 10))

R语言学习ggplot2绘制统计图形包全面详解

同样,我们只需使用alpha =即可其范围在0 — 1之间,越小表示越透明。注意,在这里,我们是写在aes()的外面,代表对所有的点都强制透明度为0.5。

在修改完透明度后,我们发现,图像已经有一点梦幻般的感觉了。但仔细一看,会发现,这张图实在是太拥挤了,1999年与2008年全部挤在了一块儿,那有没有什么简单的方法可以将两年直接分开呢?

使用分层操作!

5) 分层

p + geom_point(aes(colour = class, size = displ), alpha = 0.5) +
  stat_smooth() + scale_size_continuous(range = c(4, 10)) +
  facet_wrap(~ year, ncol = 1)

R语言学习ggplot2绘制统计图形包全面详解

这次变化的内容其实有点多,我们来细细捋一捋,首先是分层。

其实分层操作用起来非常的简单,就一行代码:facet_wrap(~ year, ncol = 1)facet_wrap()是关键,facet与wrap两个词组合,就是逐面地包起来。里面我们选择按照year这个变量来分层,就可以将1999与2008分开。一定要注意!这里在year前面有个~,回归中的用法。而最后的ncol = 1代表着我们的小窗口是1列,指定了1列之后,默认就是两行啦。(因为年份一共只有两种)如果不加这句,会默认横着排列,或者想要指定几行,则使用nrow = 1

第二个修改的地方是colour = class。同样的,class也是数据集中的一个变量,代表不同种类的汽车,而因为汽车的种类非常多,所以颜色也就变的很多了。

第三个修改点是:添加了scale_size_continuous(range = c(4, 10)),也就是指定我们size的变化范围。在本图中,就是控制点的绝对大小的范围, 不要太大,也不要太小。

至此,散点图该润色的地方,已经润色的差不多了,唯独还有一个小小的缺陷:能否加个标题,并且将这些英文简写的名称改得更容易懂一些。毕竟做统计图不是为了自娱自乐,而是要给别人看的,要让大家明白你在做什么,在分析什么。

所以我们还需要进行一点点修改。

6) 改中文

p + geom_point(aes(colour = class, size = displ), alpha=0.5) +
  stat_smooth() + scale_size_continuous(range = c(4, 10)) +
  facet_wrap(~ year,ncol = 1) +
  labs(y = '每加仑高速公路行驶距离', x = '每加仑城市公路行驶距离',
       title = '汽车油耗与型号', size = '排量', colour = '车型') +
  theme(text = element_text(family = "stheiti"),
        plot.title = element_text(hjust = 0.5))

R语言学习ggplot2绘制统计图形包全面详解

看到这么长的代码,首先要做的就是淡定,不要虚!我们慢慢来解释。

其实我们只添加了两个地方,labs()theme()

labs()修改的是我们标签的名称。我们前面在aes()中用了x =y =size =以及colour =,这些都是会有标签名称的,默认都是前面显示的一些英文。而这里,我们只需要在labs()中,写上其对应的名称即可。另外我们还附送一个title =,就是我们图像的标题。

theme()更偏向于格式的修改。text = element_text(family = "stheiti")是对字体进行修改,变为黑体。windows系统的各位,可以不添加这行,一样会显示前面labs()中设定的中文。而如果是mac或者linux系统,由于字体的缺失,会显示成一个一个的框框,在图像上显示不了中文字。

第二行plot.title = element_text(hjust = 0.5)是调整标题的位置,不加这行,标题会居左,加上才会居中。hjust = 0.5其实就是左右移动的意思,0.5表示居中。

2. 零件——直方图与条形图

学完了零件——散点图,我们再来学学其它零件。

我们先着重介绍直方图与条形图。可能会有有人问,这两个不都是方块儿条吗,有什么区别。其实这两个图有本质的区别:一个是针对连续的变量(直方图,histogram),将连续的变量砍成一段一段,再进行计数;一个是针对离散的变量(条形图,bar),直接对每类的样本来数数。

1) 直方图

p1 <- ggplot(mpg, aes(x = hwy))
p1 + geom_histogram()

R语言学习ggplot2绘制统计图形包全面详解

这里不再用前面的变量p,而是变成p1,其映射是不需要y的,只需要指定x =数据集中的一个变量即可。然后+ geom_histogram()会使用默认的参数进行直方图的绘制。

2) 润色

p1 + geom_histogram(aes(fill = factor(year), y = ..density..),
                    alpha = 0.3, colour = 'black') +
  stat_density(geom = 'line', position = 'identity', size = 1.5,
               aes(colour = factor(year))) +
  facet_wrap(~ year, ncol = 1)

R语言学习ggplot2绘制统计图形包全面详解

这里又进行了很多操作,下面将其进行分解。

首先是facet_wrap(~ year, ncol = 1)按年分层,这里不再详述。我们来聊聊geom_histogram()中的参数。

fill = factor(year) 放在aes() 中表示按年进行填充颜色。为什么不用前面说到的colour = ?这是ggplot绘图中一个非常重要的点!(敲黑板!)对于线与点这种面积为0的结构,它的颜色就直接使用colour =进行指定,而对条形图,柱状图,扇形图(特殊的柱状图),箱线图等等有面积的图形,其面积的颜色,我们需要用fill =来指定。

添加y = ..density.. 是将原本的频数直方图变成频率密度直方图,目的是为了在直方图上添加密度曲线,两者可以同时在一张图上展现。

alpha = 0.3 是指定填充颜色的透明度, colour = 'black'则是强制指定柱状图边框的颜色为黑色。注意这两个参数是放在aes()外面,就是强制设定的意思。

stat_density()表示添加统计学中的密度曲线,进行密度估计。geom = 'line'指定为线形, position = 'identity'表示一个一一映射, size = 1.5 是强制修改线的尺寸,为原先的1.5倍。最后的aes(colour = factor(year))为修改拟合密度曲线的颜色,这里就是用的colour =而不是fill =

3) 条形图

p2 <- ggplot(mpg, aes(x=class))
p2 + geom_bar()

R语言学习ggplot2绘制统计图形包全面详解

直接简单地计算不同车种类在数据集中的数量,使用 + geom_bar(),用默认参数即可绘制。我们直接从图上也可以看出,geom_bar()geom_histogram(),两者绘制出来的图形,一个有间隔,一个没有间隔。这就正好对应了我们的离散与连续的区别。

我们想进一步比较不同年份,两者的汽车种类的数量是否有差别,我们可以使用并立条形图。

a. 并立条形图
p3 <- ggplot(mpg, aes(class, fill = factor(year)))
p3 + geom_bar(position = 'dodge')

R语言学习ggplot2绘制统计图形包全面详解

只需添加参数position = 'dodge',并立条形图带回家!当然前面要说明用什么变量来并立,这里是年份:fill = factor(year)

同样,我们可以做不同的条形图。

b. 堆叠条形图
p3 <- ggplot(mpg, aes(class, fill = factor(year)))
p3 + geom_bar(position = 'dodge')

R语言学习ggplot2绘制统计图形包全面详解

c. 分面条形图
p3 + geom_bar(aes(fill = class)) + facet_wrap(~ year)

R语言学习ggplot2绘制统计图形包全面详解

只需动一动手指,就可享受到买一送三的奢华体验!

3. 零件——饼图

饼图可以说是条形图的一种特殊形式,其绘制方法可以从代码中看出。

p4 <- ggplot(mpg, aes(x = factor(1), fill = factor(class))) +
  geom_bar(width = 1)
p4 + coord_polar(theta = "y")

R语言学习ggplot2绘制统计图形包全面详解

首先x轴,只有一个柱子,柱子的宽度我们设置为1,geom_bar(width = 1),也就是铺满整个图,而柱子按照class变量来分类,并且是堆叠的(默认是堆叠条形图)。这时的图,也就是p4是一个“千层饼”。然后我们按照y轴为原点,用coord_polar(theta = "y"),把这个千层饼卷成千层卷,就成了我们的饼图了。

后面会专门开个博客来细讲饼图的一些细节操作。

4. 零件——箱线图

geom_boxplot()绘制箱线图。

p5 <- ggplot(mpg, aes(class, hwy, fill = class))
p5 + geom_boxplot()

R语言学习ggplot2绘制统计图形包全面详解

但是箱线图怎么看都觉得不够炫酷,我们可以用小提琴图来使绘图变得更加美丽动人。

5. 零件——小提琴图

p5 + geom_violin(alpha = 0.3) + geom_jitter(shape = 21)

R语言学习ggplot2绘制统计图形包全面详解

使用geom_violin()绘制小提琴图,同样改变透明度。小提琴图相比于箱线图多了各个类别分布的信息,是图像变得更加漂亮。

然后我们用geom_jitter()添加扰动点,其实就是将数据点等间隔的排列,显得更加高大上。其中的shape = 21指定的是扰动点的形状,我们用21号,也就是空心点(默认是实心点)。

至此,主要的零件都已经介绍完成了。但我们可以看到,ggplot绘制出来的图,背景都是灰格子,我们可不可以将其去掉呢?

当然可以!

6. 零件打磨

下面的一系列变化都基于前面绘制的箱线图。我们通过修改theme()中一系列参数,来对背景进行修改。

# 不要灰底
p5 <- ggplot(mpg, aes(class, hwy, fill = class))
p6 <- p5 + geom_boxplot()
p6 + theme_bw()

R语言学习ggplot2绘制统计图形包全面详解

# 不要网格线
p6 + theme_bw() + theme(panel.grid = element_blank())

R语言学习ggplot2绘制统计图形包全面详解

# 不要刻度标签
p6 + theme_bw() + theme(panel.grid = element_blank(),
                        axis.text = element_blank())

R语言学习ggplot2绘制统计图形包全面详解

# 不要刻度线
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank())

R语言学习ggplot2绘制统计图形包全面详解

# 不要xy轴标题
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank(),
                        axis.title = element_blank())

R语言学习ggplot2绘制统计图形包全面详解

# 不要外层边框
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank(),
                        axis.title = element_blank(),
                        panel.border = element_blank())

R语言学习ggplot2绘制统计图形包全面详解

# 不要图例
p7 <- p6 + theme_bw() + theme(panel.grid = element_blank(), 
                              axis.text = element_blank(),
                              axis.ticks = element_blank(),
                              axis.title = element_blank(),
                              panel.border = element_blank(),
                              legend.position = "none")
p7

R语言学习ggplot2绘制统计图形包全面详解

7. 超级变变变

到这里还有没有进一步的提升空间呢?比如定制自己喜欢的配色?当然可以!

这里我们使用scale_fill_manual()函数,来对箱线图中填充的颜色进行修改。观察这个函数,可以发现,由于是箱线图中填充的颜色,所以函数中间是fill。如果将中间的fill替换成colour,也就是scale_colour_manual(),就可以对点与线的颜色进行定制了!

关于具体的配色,在文末会有推荐的网站,大家只需选中自己喜欢的配色,复制粘贴即可。

# 黄棕变
color = c('#ffffd4', '#fee391', '#fec44f', '#fe9929',
          '#ec7014', '#cc4c02', '#8c2d04')
p7 + scale_fill_manual(values = color)

R语言学习ggplot2绘制统计图形包全面详解

变!

# 红蓝变
color = c('#b2182b', '#ef8a62', '#fddbc7', '#f7f7f7', 
          '#d1e5f0', '#67a9cf', '#2166ac')
p7 + scale_fill_manual(values = color)

R语言学习ggplot2绘制统计图形包全面详解

变!!

# 清新脱俗变
color = c('#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4',
          '#fed9a6', '#ffffcc', '#e5d8bd')
p7 + scale_fill_manual(values = color)

R语言学习ggplot2绘制统计图形包全面详解

8. 其他常用零件

最后我们再介绍一些其他常用的零件:

函数 图形 选项
geom_bar() 条形图 color, fill, alpha
geom_boxplot() 箱线图 color, fill, alpha, notch, width
geom_density() 密度图 color, fill, alpha, linetype
geom_histogram() 直方图 color, fill, alpha, linetype, binwidth
geom_hline() 水平线 color, alpha, linetype, size
geom_jitter() 抖动点 color, alpha, size, shape
geom_line() 线图 color, alpha, linetype, size
geom_point() 散点图 color, alpha, size, shape
geom_rug() 地毯图 color, sides
geom_smooth() 拟合曲线 method, formula, color, fill, linetype, size
geom_text() 文字注解 … …
geom_violin() 小提琴图 color, fill, alpha, linetype
geom_vline() 垂线 color, alpha, linetype, size
… … … … … …

七、实践出真知

别人家的男票再帅,也是别人家的。

同理可证,代码一定要自己一行一行的敲,并且每次可以自己多试几种类似的情况,看看图形会怎么变。带着问题去学习,去探索,一定会很快入门ggplot2这个大杀器!

八、学习资源

ggplot2官方参考文档

ggplot2速查(cheat sheet)

ggmap(可以画出美得令人窒息的地图)

ggplot2很多很多衍生包

一个专治“疑难杂症”的地方(stack overflow)

调色板(用于配色,很全面,但偶尔需要*)

另一个配色网站

函数与使用方法速查

九、参考资料

ggplot2官方参考文档

30分钟学会ggplot2

ggplot2 elegant graphics for data analysis (use r)

ggplot2高级绘图。

最后本文的ppt(利用 r 包 xaringan 制作而成)于github上可获得:
https://github.com/kannyjyk/ggplot2-xaringan

以上就是r语言学习ggplot2绘制统计图形包全面详解的详细内容,更多关于r语言ggplot2绘制统计图形包的资料请关注其它相关文章!