搜索
查看: 69|回复: 0

[R] 慧美-R for data science 第一章-使用ggplot2进行数据可视化

[复制链接]

10

主题

10

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2018-11-4 22:13:39 | 显示全部楼层 |阅读模式
R for data science 第一章-使用ggplot2进行数据可视化[size=0.9]
[url=]R for data science 第一章-使用ggplot2进行数据可视化[/url][url=]简介[/url][url=]常识储备[/url][url=]第一步[/url][url=]mpg数据框[/url][url=]创建ggplot图形[/url][url=]图形属性映射[/url][url=]常见问题[/url][url=]分面[/url][url=]几何对象[/url][url=]统计变换[/url][url=]位置调整[/url][url=]坐标系[/url][url=]图形分层语法[/url]

简介常识储备
  • R 包只需安装一次,但每次开始新会话时都要重新加载。
    • 访问R包的数据集、帮助页面和函数,首先运行加载包tidyverse
      library(tidyverse)
    • 若想明确指出某个函数(数据集)的来源,可以使用特殊语法形式
      package::function()
      明确指出了使用的ggplot2包中的ggplot函数
    • 执行组合功能的函数c可用来创建向量

  • 数据结构
    • 对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数,甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类,像print这样的泛型函数表明如何处理此对象。
    • 数据框(data frame)是R中用于存储数据的一种结构
      • 列表示变量,行表示观测。
      • 同一个数据框中可以存储不同类型(如数值型、字符型)的变量
      • 数据框将是用来存储数据集的主要结构

    • 矩阵(matrix)是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)
      • vector包含了矩阵的元素
      • nrow和ncol用来指定行和列的维数
      • dimnames包含了可选的、用以字符型向量表示的行名和列名
      • byrow表明用行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充

    • 数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下
      myarray<- array(vector, dimensions, dimnames)
    • 因子(factor)是名义型变量或有序型变量。它们在R中被特殊地存储和处理。
      单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。


第一步mpg数据框创建ggplot图形
  • ggplot()创建了一个坐标系,可以在上面添加图层。
  • ggplot()第一个参数是要在图中使用的数据集。ggplot(data = mpg) 会创建一张空白图。
  • 向ggplot()中添加一个或多个图层可以完成这张图。
  • ggplot2中的每个几何对象函数都有一个mapping参数,这个参数定义了如何将数据集中的变量映射为图形属性。mapping参数总是与aes()函数成对出现,aes()函数的X参数与y参数分别制定了映射到X轴的变量与映射到y轴的变量
  • ggplot通用模板
  • 要想将图形属性映射为变量,需要在函数aes()中将图形属性名称和变量名称关联起来。ggplot2会自动为每个变量值分配唯一的图形属性水平,这个过程称标度变换

图形属性映射
  • 图形属性是图中对象的可视化属性,其中包括数据点的大小、形状、颜色。
  • 颜色名称是一个字符串。
  • 点的大小用毫米表示。
  • 点的形状是一个数值 。

常见问题
  • 检查一下控制台左侧,如果有一个+号,说明R认为没有输入完整的表达式,正在等待完成输入。这时候,按Esc键中正当前执行的命令就可以重新开始。
  • 创建ggplot2图形的常见问题是将+号放错了位置,+必须放在一行代码的末尾,而非开头。
  • 有疑问的话
    • 在控制台中运行?函数,或者在Rstudio中选定函数名称后按F1键


分面
  • 添加额外变量的一种方法是使用图形属性。另一种方法是将图分割成多个分面,即可以显示数据子集的子图。这种方法特别适合添加分类变量。
  • 要想通过单个变量对图进行分面,可以使用函数 facet_wrap()。其第一个参数是一个公式,创建公式的方式是在 ~ 符号后面加一个变量名
    • 这里所说的“公式”是 R 中的一种数据结构,不是数学意义上的公式
    • 传递给 facet_wrap() 的变量应该是离散型的

  • 要想通过两个变量对图进行分面,需要在绘图命令中加入函数 facet_grid()。这个函数的第一个参数也是一个公式,但该公式包含由 ~ 隔开的两个变量名
    • 如果不想在行或列的维度进行分面,你可以使用 . 来代替变量名,例如 + facet_grid(. ~cyl)

  • nrow指定分面后显示几行,ncol指定分面后显示几列。
  • stroke显示轮廓

几何对象
  • 几何对象是图中用来表示数据的几何图形对象。我们经常根据图中使用的几何对象类型来描述相应的图。
    • 条形图使用了条形几何对象
    • 折线图使用了直线几何对象
    • 箱线图使用了矩形和直线几何对象
    • 散点图打破了这种趋势,它们使用点几何对象。

  • 要想改变图中的几何对象,需要修改添加在 ggplot() 函数中的几何对象函数
  • ggplot2 提供了 30 多种几何对象,其扩展包甚至提供了更多。了解ggplot速查表
  • 图形几何变量个数
    • 很多几何对象函数使用单个几何对象来表示多行数据。你可以将这些几何对象的 group 图形属性设置为一个分类变量,这样 ggplot2 就会为这个分类变量的每个唯一值绘制一个独立的几何对象
    • 只要将一个图形属性映射为一个离散变量, ggplot2 就会自动对数据进行分组来绘制多个几何对象  
    • 如果将映射放在几何对象函数中,那么 ggplot2 会将其看作这个图层的局部映射,它将使用这些映射扩展或覆盖全局映射, 但仅对该图层有效。这样一来,我们就可以在不同的图层中显示不同的图形属性
    • se=FALSE, se是standard的缩写,se参数为拟合曲线添加标准误差带,默认为TRUE


统计变换
  • 绘图时用来计算新数据的算法称为 stat(statistical transformation, 统计变换)
  • 条形图、直方图和频率多边形图可以对数据进行分箱,然后绘制出分箱数量和落在每个分箱的数据点的数量。
  • 平滑曲线会为数据拟合一个模型,然后绘制出模型预测值。
  • 箱线图可以计算出数据分布的多种摘要统计量,并显示一个特殊形式的箱体。

位置调整
  • 条形图还有一项神奇的功能,你可以使用 color 或者 fill(这个更有用)图形属性来为条形图上色
  • 如果将 fill 图形属性映射到另一个变量,那么条形会自动分块堆叠起来  
  • 这种堆叠是由 position 参数设定的位置调整功能自动完成的。如果不想生成堆叠式条形图,你还可以使用以下 3 种选项之一: "identity"、 "fill" 和 "dodge"
    • position = "identity" 将每个对象直接显示在图中。这种方式不太适合条形图,因为条形会彼此重叠。为了让重叠部分能够显示出来,我们可以设置 alpha 参数为一个较小的数,从而使得条形略微透明;或者设定 fill = NA,让条形完全透明
    • position = "fill" 的效果与堆叠相似,但每组堆叠条形具有同样的高度,因此这种条形图可以非常轻松地比较各组间的比例
    • position = "dodge" 将每组中的条形依次并列放置,这样可以非常轻松地比较每个条形表示的具体数值
    • position = "jitter" 为每个数据点添加一个很小的随机扰动,这样就可以将重叠的点分散开来,因为不可能有两个点会收到同样的随机扰动
      # 添加随机性来改善图形似乎是一种奇怪的方式,然而尽管这种方式会损失图形的精确性,但可以大大提高图形的启发性

坐标系
  • coord_flip() 函数可以交换 x 轴和 y 轴。当想要绘制水平箱线图时,这非常有用。它也非常适合使用长标签
  • coord_quickmap() 函数可以为地图设置合适的纵横比。当使用 ggplot2 绘制空间数据时,这个函数特别重要
  • coord_polar() 函数使用极坐标系。极坐标系可以揭示出条形图和鸡冠花图间 联系

图形分层语法






上一篇:R for data science 第一章-使用ggplot2进行数据可视化
下一篇:one liner 和 sh file
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2018-11-16 22:52 , Processed in 0.033727 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.