学习之旅16-R数据可视化-图形处理(二)

13 篇文章 0 订阅
7 篇文章 0 订阅

前言

  • 上一节我们对ggplot2包中的高级绘图有了一定了解,但是里面的很多参数并没有详细介绍,本节我们将继续对具体的参数函数进行讲解。

6、ggplot数据可视化 (二)

6.1 准备工作

  • 我们总是想从庞大的数据集中获取我们想要的信息,比如对于mpg数据集中的数据,我们想知道大引擎的车是否比小引擎的车更加耗油?或许更耗油,但是我们可能需要进一步知道之间的具体关系:正相关还是负相关,线性还是非线性。任何的画图都是基于数据的。在ggplot2 中我们通过ggplot()函数开始绘图。
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy))

在这里插入图片描述

  • 之前我们说过,R里面的绘图是通过一层一层添加图层来完成最终绘图的,对于以上代码我们仅仅只是通过ggplot()创建了一个图层,指定了我们的数据data 来自mpg,并且通过mapping = aes(x = displ, y = hwy)指定了数据集mpg中的displ是映射到x轴的变量,hwy是映射到y轴的变量,但是并没有具体给出用那种可视化对象来展示我们的两个变量。
  • 关于mapping :ggplot中的每个几个对象函数都有一个mapping 参数,而且该参数总是和aes()成对出现,aes()函数里面的x参数和y参数分别指定了映射到x轴的变量和映射到y轴的变量。(ggplot函数在对应的data里面去获取需要映射的变量)

6.2 图形映射

  • 什么是映射,我们学习数学的时候应该对这个名词很熟悉了,下面我用一张图来解释一下:

在这里插入图片描述

  • 图片的最大价值在于促使我们发现从未预料到的事情。这就是我们为什么作图的原因:将庞大的数据集本身各个属性映射到一个简略的图形上面。对于数据集来说,分为变量(列)和观测(行),每一列变量就相当于数据集的一个属性。对于mpg数据集来说共有234行×11列,即表示有11个属性。
> str(mpg)
tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
 $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
 $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
 $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
 $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
 $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
 $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
 $ drv         : chr [1:234] "f" "f" "f" "f" ...
 $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
 $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
 $ fl          : chr [1:234] "p" "p" "p" "p" ...
 $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...
  • 以上代码我们可以看到,我们仅仅把mpg数据集里面的displ变量映射到x轴,把hwy变量映射到y轴(即11个属性我们只映射了2个),并且通过点几何对象来展现图形效果。若我们想要再次映射一个属性,则在对应的mapping = aes()函数中添加变量即可。我们将车型class 映射为颜色图形属性(即图中对象的可视化属性:数据点大小、形状、颜色),当然我们也可以映射为图形的大小size,图形的形状shape以及图形的透明度等等。
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+geom_point(size = 0.5)#左图
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = class))+geom_point(size = 0.5)#右图

在这里插入图片描述

  • 当然我们很少将无序(class)变量映射为有序图形属性(size),注意区分以下几张图形的不同。
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, shape = class))+geom_point(size = 0.5)
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = class))+geom_point(size = 0.5)
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = class))+geom_point(size = 0.5, shape = 4)
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+geom_point(size = 0.5, shape = 4, color = "blue") 

在这里插入图片描述
在这里插入图片描述

  • ggplot2中只能同时使用6种图形,对于多的变量值将不会出现在图形中。对于每个图形属性来说,aes()函数都可以将名称与一个需要待显示的变量关联起来,即每个图形属性映射集合在一起,然后传递给该图层的映射参数。
  • 注意以下代码和对应图形,不管我们在aes()函数中怎样设置color的颜色,我们最终出来的图形颜色都是一致的。这是为什么呢?我们接着往下看。
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = "blue"))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = "yellow"))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = "pink"))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = "red"))

在这里插入图片描述
在这里插入图片描述

  • 以下代码和图形又有什么区别呢?我们回想一下在数据集mpg中是否有有变量"blue"、“yellow”、“pink”以及“red”呢,显然是没有这些变量的,当我们在aes()函数中使用这些没有的变量来映射时相当于增加了一列,这列的名字叫"blue"、“yellow”、“pink”以及“red”而已,我们并没有对里面的每个数据进行不同的映射,因此出来的颜色都是一样。
  • 同理下面的第1,2个代码以及对应的图形也是一样,我们给数据集mpg新增了一个变量(即新增了一列1),而对于color=1我们同样相当于只指定了一个映射颜色(即mpg数据集里面的234个样本的新一列的列名为1);而color=1:234也是增加了一列,只不过每个样本指定的是不一样而已(第1个样本叫1,第2个样本叫2…第234个样本叫234),因此映射出来的颜色是不一样的。
  • 同样的我们的数据集里面也没有displ < 5的这个样本集(非变量名对象),displ<5相当于是一个逻辑命令,只有False和TRUE 2个属性,因此映射到生成图像就反应了2种颜色。
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = 1))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color = 1:234))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color=displ < 5))
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy, color=displ))

在这里插入图片描述
在这里插入图片描述

  • 通过以上的讲解,我们对于aes()函数有了进一步的了解,即所有需要的映射都写在里面,而写在外面的就是手动改变图形的属性,比如写在外面的color=“red”,此时的颜色不会传达关于变量的信息,仅仅只是改变图形的外观

6.3 几何对象

  • 以下两张图的相似程度有多大呢?

在这里插入图片描述

  • 不同的几何对象函数添加不同的可视化对象:

在这里插入图片描述

  • 通过上一节我们知道,对于同样的变量 x=displ 和y=hwy,我们可以通过不同的可视化对象来表示数据,在ggplot2中,我们称他们使用了不同的几何对象(几何函数)。几何对象就是上图中用来表示数据的几何图形对象(散点,条形,折线,曲线等等),散点图使用点几何对象,条形图使用条形几何对象,折线图使用直线几何对象,曲线则使用了平滑曲线几何对象。以上两个图形的代码如下:
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+geom_point()#左图
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+geom_smooth( method = 'loess', formula = 'y ~ x')#右图
  • 对于每个几个对象函数都有一个mapping 参数,也就是我们上面映射中提到的aes()函数里面的mapping参数。但是不是每种图形属性都适合每种几何对象,比如我们可以设置点的大小,但是不能设置线的“形状”,而可以设置线型(实线、虚线等)
> ggplot(data = mpg)+geom_smooth(mapping = aes(x = displ, y = hwy, size = drv))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Warning message:
Using size for a discrete variable is not advised. 
> ggplot(data = mpg)+geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
  • 上面的代码都有警告信息,对于第一个代码,我们将drv无序变量映射到有序属性(size)一般是不建议的,同时两个代码对于用geom_smooth()函数拟合,我们一般需要指定拟合方法。(默认非线性method = ‘loess’,线性method = ‘lm’,一次拟合还是二次拟合)

在这里插入图片描述

  • 上面代码中我们仅仅使用了一个几何对象,接下来我们使用多种几何对象来画图。但是需要注意,我们在ggplot()里面指定的相当于全局变量,这里面的映射都会作用后面所有的几何对象,就不会像第二个代码一样,需要那个映射指定哪个,即geom_pint()仅有两个变量的映射,即映射到x轴和y轴,故没有颜色的区别,而geom_smooth()指定了第3个变量的映射为不同颜色。因此我们在绘图的时候根据实际需要是使用全局变量还是在不同的图层显示不同的图形属性。
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+geom_point()+geom_smooth(method = 'loess', formula = 'y ~ x')
> ggplot(data = mpg)+geom_point(mapping = aes(x = displ, y = hwy))+geom_smooth(mapping = aes(x = displ, y = hwy, color = drv), method = 'loess', formula = 'y ~ x')

在这里插入图片描述

  • 其他参数:
    show.legend = FALSE 隐藏对应显示的图例,下面代码中:第1个代码隐藏点图例,第2个代码隐藏线图例。默认为TRUE(显示)
    se = FALSE 隐藏置信区间,默认为TRUE(显示),第3个代码显示置信区间,第4个代码隐藏置信区间(由样本统计量所构成的总体参数的估计区间)。
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+geom_point(show.legend = F)+geom_smooth(method = 'loess', formula = 'y ~ x')
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+geom_point()+geom_smooth(method = 'loess', formula = 'y ~ x', show.legend = F)
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+geom_point()+geom_smooth(method = 'loess', formula = 'y ~ x')
> ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+geom_point()+geom_smooth(method = 'loess', formula = 'y ~ x',se = F)

在这里插入图片描述
在这里插入图片描述

6.4 统计变化

  • 绘图时用于计算新数据的算法称为stat(statistical transformation,统计变化),以某种方式对数据的信息进行汇总。上一节我们在利用geom_bar()绘制频数条形图的时候进行过讲解,但是没有具体展开,这里我们再次回顾一下,diamonds数据集里面包含了各类砖石的基本信息,这里我们需要统计不同切工(cut变量)所包含的数量:
> ggplot(data = diamonds)+geom_bar(mapping = aes(x = cut), position=position_dodge(0.5), width = 0.5)
> #position=position_dodge(0.5)指定条形间距, width = 0.5指定条形宽度
> ggplot(data = diamonds)+geom_bar(mapping = aes(x = cut, y = ..count..), position=position_dodge(0.5), width = 0.5)

在这里插入图片描述

  • 很多图形在绘制的是原始数据集中数据,比如散点图(每个点就是对应数据集里面的具体数据),而对于条形图、直方图的一些图形可以绘制出新的数据(不在原始数据集里面),即衍生出来的数据。对于上图我们可以看到,x轴显示的是count,而aes()中我们并没有指定映射到y轴的变量,对于geom_bar()对于y轴默认为count,即等同于aes(x = cut, y = …count…)对应频数类型为计数,由于该数值为统计变化衍生而来的,故前后有两点。
  • 我们需要注意的是:大部分几何对象函数和统计变换函数是可以互相使用的,比如我们可以通过stat_count()函数来替换之前的geom_bar()函数,通过?geom_bar()我们可以看到默认的stat = “count” 而stat_count()默认的geom = “bar”,这进一步说明两者可以互换使用。
> ggplot(t1, aes( x = id))+geom_bar(position=position_dodge(0.5), width = 0.5)+geom_text(aes(label = ..count..),stat = "count")
> ggplot(t1, aes( x = id))+stat_count(position=position_dodge(0.5), width = 0.5)+geom_text(aes(label = ..count..), stat = "count")

在这里插入图片描述

  • 之所以可以这样做是因为:每个几何对象函数都有一个默认统计变换,每个统计变换函数都有一个默认的几何对象,所以我们在使用几何对象函数时不必担心底层的统计变换,但是当我们需要显示使用某种统计变换的原因有下面几点:
    (1)是否需要覆盖默认的统计变换?
    (2)是否需要将计数改为统计比例?
    (3)是否要在代码中强调统计变换?
  • 针对以上问题,我们来看几个例子:
> id <- c(1,1,2,2,3)
> age <- c(18,21,15,20,20)
> pos <- c("java","python","mysql","R","linux")
> score <- c(80,85,90,98,79)
> t1 <- data.frame(id,age,pos,score)
> t1
  id age    pos score
1  1  18   java    80
2  1  21 python    85
3  2  25  mysql    90
4  2  20      R    98
5  3  20  linux    79
> str(t1)
'data.frame':	5 obs. of  4 variables:
 $ id   : num  1 1 2 2 3
 $ age  : num  18 21 25 20 20
 $ pos  : chr  "java" "python" "mysql" "R" ...
 $ score: num  80 85 90 98 79
  • 上面我们创建了一个t1的数据集,我们可以看到id有3个唯一的值(分别是1,2,3),那当我们使用geom_bar()来绘制图形时,此时默认将对应不同的id进行计数统计(id=1的有2个,id=2的有2个,id=3的只有一个),geom_bar()等价于geom_bar(stat = “count”),stat_count()等价于stat_count(geom = “bar”)。为了显示对应的数据标签,我们使用geom_text()函数来添加,但是必须指定数据标签对应的变量是哪个(即aes(label = …count…) 默认的统计变量…count…),同时指定统计变化为stat = “count”(否则会提示找不到count),此时画出来的图形如下:
> ggplot(t1, aes( x = id))+geom_bar()+geom_text(aes(label = ..count..),stat = "count")
> ggplot(t1, aes( x = id))+stat_count()+geom_text(aes(label = ..count..), stat = "count")

在这里插入图片描述

  • 但是当我们不使用默认的统计(计数),此时条形的高度就不再是对应变量的统计数,而是我们需要哪个变量就将哪个变量映射到y轴,但是需要注意的是对于指定映射到y轴我们必须用stat=“identity”。这里我们在详细解释一下stat=“count” 和stat=“identity”:

geom_bar()函数中有两个有效值:count和identity。
默认情况下,stat=“count”,这意味着每个条的高度等于每组中的数据的个数,并且,它与映射到y的图形属性不相容.所以,当设置stat="count"时,不能设置映射函数aes()中的y参数。如果设置stat=“identity”,这意味着条形的高度表示数据数据的值,而数据的值是由aes()函数的y参数决定的,就是说,把值映射到y,所以,当设置stat="identity"时,必须设置映射函数中的y参数,把它映射到数值变量。
count表示条形的高度是变量的数量,identity表示条形的高度是变量的值。

> ggplot(t1, aes( x = id, y = age))+geom_bar(stat = "identity")+geom_text(aes(label = age), stat = "identity", vjust = -0.7)
> ggplot(t1, aes( x = id, y = age))+geom_col()+geom_text(aes(label = age), vjust = -0.7)

在这里插入图片描述

  • 以上代码正好回答了上面的第一个问题(即是否需要覆盖默认的统计变换?)。但是我们也发现了这两个代码不一样的地方:虽然geom_bar()和geom_col()都能画出同样的条形图,但是对于geom_bar()来说stat对应的参数有两个,尤其是我们不需要默认的统计变化时(即把需要的变量映射到y轴),我们就必须必须设置映射函数中的y参数(aes(x = id, y = age)),此时我们可以看到对应的数据标签就是变量age对应的值(而不是统计数)。注意geom_text()也必须指定stat=“identity”。但是对于geom_col()来说仅仅就一个默认参数identity改变不了,因此不能使用stat=“count”。

geom_bar针对计数的柱状图,即count, 是只给ggplot映射x值(x也一般是因子)。自动计算x的每个因子所拥有的数据点的个数,将这个个数给与y轴。
如: gplot2(t1, aes(x = id)) +geom_bar()
geom_col针对最常见的柱状图 ,即既给ggplot映射x值(x值一般是因子型的变量,才能成为柱,而没有成为曲线),也映射y值。
如: ggplot2(t1, aes(x = id, y = age)) +geom_col()
总结:区别在于给ggplot是否映射y值。

参考文献
1.关于映射与统计变化
2.R数据科学——ggplot2可视化(2)
3.ggplot2超详细讲解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值