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

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

前言

  • 之前我们讨论过关于数据的处理,对于任何的数据分析我们都是建立在数据的基础上,R语言也不例外。我们在利用R来做数据分析的时候必然少不了这些环节:在这里插入图片描述
    通过以上的数据处理,我们会最终得到结果,形成数据报告或者图表展现,但最好的呈现方式还是我们的图表,因此接下来我们将学习关于ggplot2的高级绘图。

5、gglot2数据可视化

5.1 关于R图形系统

  • 在之前的学习中学习之旅12-R初识图形.我们简单的创建了一些图形,大部分都是利用R基础绘图系统创建的,但是在R中除了基础图形还有grid、lattice和ggplot2软件包也提供了图形系统,它们克服了R基础图形系统的低效性,大大扩展了R的绘图能力。本章主要就ggplot2进行讲解

在这里插入图片描述

5.2 ggplot2包

  • ggplot2包提供了一个基于全面而连贯的语法的绘图系统。它弥补了R中创建图形缺乏一致性的缺点,使得用户可以创建有创新性的、新颖的图形类型。
  • ggplot2中最简单的绘图方式是利用qplot()函数,即快速绘图函数。格式为:
>library(ggplot)
>qplot(x, y,..,data=, color=, shape=, size=, alpha=, geom=, method=, formula=, facets=, xlim=, ylim=, xlab=, ylab=, main=, sub=)
>qplot(mpg, wt, data = mtcars, colour = cyl)

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

  • 在ggplot2中,图是采用串联起来(+)函数创建的,每个函数修改属于自己的部分。下面举一个简单的例子:
> ggplot(data = mtcars,aes(x=wt,y=mpg))
  • 此时图形没有任何视觉输出,仅仅是定义了一个画布,aes()函数指定每个变量角色,变量wt的值映射到x轴的距离,变量mpg的值映射到y轴的距离。

在这里插入图片描述

> ggplot(data = mtcars, aes(x=wt, y=mpg))+geom_point()+labs(title ='汽车重量与里程散点图', x='重量', y='英里/加仑')
># geom_point()函数绘制散点图,labs()函数添加注释(标题,标签)
  • 以下几何函数选项指定修改图形样式:

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

5.3 条形图

  • 条形图或许是最常用的数据可视化方法,通常用来展示不同的分类(x轴)某个数值型变量的取值变化(y轴),比如不同年份GDP情况,不同商品价格情况等等,但是不适应于展示商品价格随时间的变得趋势,也就是说不适用与表示连续的变化(连续变化通常用折线图来展示)。
  • 需要注意的是:有时条形图的条形高等表示的是数据集中变量的频数,有时则表示变量取值本身。

5.3.1 简单绘制条形图

> time <- c(1, 2, 3, 4, 5, 7)
> dat <- c(8.3 ,9.3, 10.3, 10, 19.2, 15.7)
> t1 <- data.frame(time,dat)
> t1
  time  dat
1    1  8.3
2    2  9.3
3    3 10.3
4    4 10.0
5    5 19.2
6    7 15.7
> str(t1)
'data.frame':	6 obs. of  2 variables:
 $ time: num  1 2 3 4 5 7
 $ dat : num  8.3 9.3 10.3 10 19.2 15.7
> ggplot(t1, aes(time, dat))+geom_bar(stat = "identity", width = 0.5)
  • 我们建立了一个t1的数据框,变量有time和dat,我们可以看到time 和dat都是num数值型(连续型),因此我们在用ggplot画条形图时,对于缺失的time=6的值将不会出现。
  • geom_bar()函数绘制条形图,stat = "identity"表示柱高分类所占比例,width=0.5修改对应柱子宽度,颜色默认灰色。

在这里插入图片描述

  • 我们通过factor()将time转化为因子后,缺失的time=6将会绘制图形
> ggplot(t1, aes(factor(time), dat))+geom_bar(stat = "identity", width = 0.5)
> ggplot(t1, aes(factor(time), dat))+geom_bar(stat = "identity", fill="lightblue", color="black", width = 0.5)
>#fill="lightblue" 指定填充色, color="black"指定外框颜色

在这里插入图片描述

在这里插入图片描述

5.3.2 绘制簇状条形图

  • 基于某个分类变量的条形图如何绘制?我们通过gcookbook包中的数据集作为例子:
> install.packages("gcookbook")
> library(gcookbook)
> cabbage_exp
  Cultivar Date Weight        sd  n         se
1      c39  d16   3.18 0.9566144 10 0.30250803
2      c39  d20   2.80 0.2788867 10 0.08819171
3      c39  d21   2.74 0.9834181 10 0.31098410
4      c52  d16   2.26 0.4452215 10 0.14079141
5      c52  d20   3.11 0.7908505 10 0.25008887
6      c52  d21   1.47 0.2110819 10 0.06674995
> str(cabbage_exp)
'data.frame':	6 obs. of  6 variables:
 $ Cultivar: Factor w/ 2 levels "c39","c52": 1 1 1 2 2 2
 $ Date    : Factor w/ 3 levels "d16","d20","d21": 1 2 3 1 2 3
 $ Weight  : num  3.18 2.8 2.74 2.26 3.11 1.47
 $ sd      : num  0.957 0.279 0.983 0.445 0.791 ..
 $ n       : int  10 10 10 10 10 10
 $ se      : num  0.3025 0.0882 0.311 0.1408 0.2501 ..
  • cabbage_exp数据集中Cultivar和Date 为分类变量(factor-因子),Weight 为num型(连续型)变量。
  • 一般的条形图通常只对应一个绘制在x轴的分类变量和一个绘制在y轴的连续型变量。有时候我们分类的变量需要对比时,就需要额外添加一个分组变量,此时我们通过fill参数来绘制簇状条形图,这里的fill参数用来指定条形的填充色,因此我们必须使用参数position="dodge"使得两组变量在水平方向错开,不然就会出现堆积条形图(图)。
  • ggplot2中提供了两种色标功能,用于使用rcolorbrewer调色板,关于rcolorbrewer调色板我们将在后面的章节进行详细讲解。
    scale_fill_brewer()用于箱形图,条形图,小提琴图,点图等。
    scale_color_brewer()用于行和点。
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar )) + geom_bar(stat = "identity", width= 0.5)
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar )) + geom_bar(stat = "identity", position = "dodge" width= 0.5)

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

  • 与映射给条形图x轴的变量类似,映射给条形填充色参数的变量也应该是分类变量(factor)而不是连续型变量。通过str(cabbage_exp)我们知道sd也是一个连续变量,此时我们fill填充色的参数修改为sd,最终的图形也无法再次进行分组,会再次出现堆积条形图。
> ggplot(cabbage_exp, aes(Date, Weight, fill=sd )) + geom_bar(stat = "identity", position = "dodge", width= 0.5)

在这里插入图片描述

  • 对于某个分类变量的组合中若有缺失项,则缺失的部分会省略不绘制,同时邻近的条形将自动扩充到相应位置。以下数据我们可以看出Cultivar 变量c52只有两个,因此绘制出来的填充条形图将没有Date21对应的c52,同时会被Date21对应的c39填充。
> t1 <- cabbage_exp[1:5,1:3]
> t1
  Cultivar Date Weight
1      c39  d16   3.18
2      c39  d20   2.80
3      c39  d21   2.74
4      c52  d16   2.26
5      c52  d20   3.11
> ggplot(t1, aes(Date, Weight, fill=Cultivar)) + geom_bar(stat = "identity", position = "dodge",color="black", width= 0.5)

在这里插入图片描述

5.3.3 绘制频数条形图

  • 对于数据集我们有时可能会统计基于某个变量的数量(即频数),那么我们该如何绘制呢?
  • 我们同样通过geom_bar()函数来指定,只不过我们在用aes()函数指定每个变量时仅指定我们需要统计的变量即可。但是这里需要注意的是我们也要区分统计的变量是离散型还是连续型
> diamonds
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows
> str(diamonds)
tibble [53,940 x 10] (S3: tbl_df/tbl/data.frame)
 $ carat  : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ..
 $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ..
 $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ..
 $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ..
 $ depth  : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ..
 $ table  : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
 $ price  : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ..
 $ x      : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ..
 $ y      : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ..
 $ z      : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ..
  • diamonds数据集中每行数据对应于一颗砖石的品质信息,通过分析我们可以看到对应的变量有num、factor、int,那对于离散型(factor)我们在统计时将计算对应变量的频数,形成我们常见的频数条形图(高度表示频数的大小,各条形之间有间隔,横轴上的数据是孤立的,是一个具体的数据)。对于连续型(carat )此时我们会得到一张直方图(直方图实际上是用长方形的面积表示频数,中间无空隙,横轴上的数据是连续的,是一个范围)
> ggplot(diamonds, aes(x=cut))+geom_bar(fill="lightblue", color="black", width = 0.5)
> ggplot(diamonds, aes(x=carat))+geom_bar(fill="lightblue")

在这里插入图片描述

5.3.4 对正负条形图分别着色

  • 有时我们的数据中会出现负值,我们在绘图的时候希望将正负值分别着色绘制图形,此时如何处理呢?
  • 以R自带的climate的数据集为参考,该数据集包括1800年至2011年的全球气温变化数据。
> data1 <- subset(climate, Source=="Berkeley" & Year >=1900)
> data1$pos <- data1$Anomaly10y >= 0 #创建一个新变量进行标示正负值
> data1
      Source Year Anomaly1y Anomaly5y Anomaly10y Unc10y   pos
101 Berkeley 1900        NA        NA     -0.171  0.108 FALSE
102 Berkeley 1901        NA        NA     -0.162  0.109 FALSE
103 Berkeley 1902        NA        NA     -0.177  0.108 FALSE
104 Berkeley 1903        NA        NA     -0.199  0.104 FALSE
..
202 Berkeley 2001        NA        NA      0.793  0.027  TRUE
203 Berkeley 2002        NA        NA      0.856  0.028  TRUE
204 Berkeley 2003        NA        NA      0.869  0.028  TRUE
205 Berkeley 2004        NA        NA      0.884  0.029  TRUE
> ggplot(data1, aes(Year, Anomaly10y, fill=pos))+geom_bar(stat = "identity", position = "identity")
> ggplot(data1, aes(Year, Anomaly10y, fill=pos))+geom_bar(stat = "identity", position = "identity", color="black", size=0.25)+scale_fill_manual(values = c("#CCEEFF","#FFDDDD"), guide=FALSE)
  • x轴为Year,y轴为Anomaly10y,将pos映射给填充色参数(fill)并绘制条形图,注意position = "identity"参数避免系统因对正负值绘制堆积条形图的警官信息。边框颜色color=“black”,边框线宽度size=0.25(毫米),scale_fill_manual()
    参数对图形颜色进行重新调整,guide=FALSE移除默认的图例
    在这里插入图片描述

5.3.5 条形宽度与条形间距

  • 一般默认的条形图的宽度间距都是相当较大的,我们通过geom_bar()函数中的width参数来控制条形的宽度,默认值为0.9。条形的间距可以通过position=position_dodge()来指定宽度,默认也是0.9,所以有时我们会看到position=“dodge” 其实等价于position=position_dodge(0.9),当我们需要调整间距是就需要写出完成的命令。以下4个命令都是等价的:
    geom_bar(position=“dodge”)
    geom_bar(width = 0.9, position=position_dodge())
    geom_bar(position=position_dodge(0.9))
    geom_bar(width = 0.9, position=position_dodge(width = 0.9))
> ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat = "identity")
> ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat = "identity", width = 0.5)
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar)) + geom_bar(stat = "identity", position = "dodge", width = 0.5, color="black")
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar)) + geom_bar(stat = "identity", position = position_dodge(0.7), width = 0.5, color="black")

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

5.3.6 添加数据标签

  • 前面我们提到过对于图形的标签、备注我们可以使用labs()函数来处理,同样我们也可以使用geom_text()来为条形图添加数据标签,需要指定对应变量映射给x,y和标签本身,而vjust用来调整数据标签与图形的上下距离。geom_text()将文本直接添加到绘图中。 geom_label()在文本后面绘制一个矩形,使其更易于阅读。hjust控制水平alignment和vjust控制垂直alignment,默认都为0.5,即在条形图最上面的边框中间。vjust 为负则数据标签往上调整,hjust为负则数据标签往右调整。一般来说数据标签的y轴坐标都是位于条形的顶端中心位置。
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight))#图1
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight), vjust = -0.5, hjust = -0.5)#图2
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight), vjust = -0.2)#图3
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight), vjust = 1.5)#图4
> #interaction函数是生成两个变量的排列组合

在这里插入图片描述

  • 但是我们可以看到图2的数据标签已经超出界限,此时我们需要对vjust参数进行调整,当然我们也可以设定y轴的数据范围来进行处理。
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight), vjust = -1) +ylim(0, max(cabbage_exp$Weight)*1.05) 
> ggplot(cabbage_exp, aes(x = interaction(Date, Cultivar), y = Weight))+geom_bar(stat = "identity", width = 0.5, color="black")+geom_text(aes(label = Weight), vjust = -0.5, hjust = -0.5) +ylim(0, max(cabbage_exp$Weight)*1.05) 

在这里插入图片描述

  • 对于簇状条形图,若我们不限定每组数据标签的间距,那么每组的标签都会显示在中间,这样不利于查看,此时我们需要根据geom_bar()中对应的条形图的间距来设定geom_text()中对应的数据标签间距。同样也是使用position = position_dodge()来进行设定,两者间距需保持一致。数据标签的默认字体是5号,这里我们通过size来改变其大小。
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar))+geom_bar(stat = "identity",position = position_dodge(0.6),width = 0.5, color="black")+geom_text(aes(label = Weight), vjust=-0.2)
> ggplot(cabbage_exp, aes(Date, Weight, fill=Cultivar))+geom_bar(stat = "identity",position = position_dodge(0.6),width = 0.5, color="black")+geom_text(aes(label = Weight), position = position_dodge(0.6), vjust=-0.2)+ylim(0, max(cabbage_exp$Weight)*1.05)

在这里插入图片描述

参考文献:
1.知乎-ggplot2参考.
2.ggplot2.
3.医学码农.
4.R语言之可视化调色板.
5.ggplot绘图之基本语法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值