第 10 章 ggplot2

采菊东篱下,悠然见南山。

根据大家投票,觉得ggplot2是最想掌握的技能,我想这就是R语言中最有质感的部分吧。所以,这里专门拿出一节课讲ggplot2,也算是补上之前第 4 章数据可视化没讲的内容。

有几个新的宏包需要提前安装(不是必须的)

如果安装不成功,请先update宏包,再执行上面安装命令

10.1 一个有趣的案例

先看一组数据

先用dataset分组后,然后计算每组下x的均值和方差,y的均值和方差,以及x,y两者的相关系数,我们发现每组数据下它们几乎都是相等的

如果上面代码不熟悉,可以用第 6 章的代码重新表达,也是一样的

那么,我们是否能得出结论,每组的数据长的差不多呢?然而,我们画图发现

事实上,每张图都相差很大。所以,这里想说明的是,眼见为实。换句话说,可视化是数据探索中非常重要的部分。本章的目的就是带领大家学习ggplot2基本的绘图技能。

10.2 学习目标

  1. Grammer of Graphics

  1. data: 数据框data.frame (注意,不支持向量vector和列表list类型)

  2. aes: 数据框中的变量映射到图形属性。什么叫图形属性?就是图中点的位置、形状,大小,颜色等眼睛能看到的东西。什么叫映射?就是一种对应关系,比如数学中的函数b = f(a)就是ab之间的一种映射关系, a的值决定或者控制了b的值,在ggplot2语法里,a就是我们输入的数据变量,b就是图形属性, 这些图形属性包括:

    • x(x轴方向的位置)
    • y(y轴方向的位置)
    • color(点或者线等元素的颜色)
    • size(点或者线等元素的大小)
    • shape(点或者线等元素的形状)
    • alpha(点或者线等元素的透明度)
  3. geoms: 几何对象,确定我们想画什么样的图,一个geom_***确定一种图形。更多几何对象推荐阅读这里

    • geom_bar()
    • geom_density()
    • geom_freqpoly()
    • geom_histogram()
    • geom_violin()
    • geom_boxplot()
    • geom_col()
    • geom_point()
    • geom_smooth()
    • geom_tile()
    • geom_density2d()
    • geom_bin2d()
    • geom_hex()
    • geom_count()
    • geom_text()
    • geom_sf()
  4. stats: 统计变换

  5. scales: 标度

  6. coord: 坐标系统

  7. facet: 分面

  8. layer: 增加图层

  9. theme: 主题风格

  10. save: 保存图片

10.3 开始

前面讲到R语言数据类型有字符串型、数值型、因子型、逻辑型、日期型等,ggplot2会将字符串型、因子型、逻辑型、日期型默认为离散变量,而数值型默认为连续变量。我们在而呈现数据的时候,可能会同时用到多种类型的数据,比如

  • 一个离散

  • 一个连续

  • 两个离散

  • 两个连续

  • 一个离散, 一个连续

  • 三个连续

10.3.1 导入数据

10.3.2 检查数据

  • country 代表国家
  • countinet 表示所在的洲
  • year 时间
  • lifeExp 平均寿命
  • pop 人口数量
  • gdpPercap 人均GDP

接下来,我们需要思考我们应该选择什么样的图,呈现这些不同类型的数据,探索数据背后的故事

10.4 基本绘图

10.4.1 柱状图

常用于一个离散变量

可见,geom_bar() 自动完成了这个统计,更多geom与stat对应关系见这里

我个人比较喜欢先统计,然后画图

10.4.2 直方图

常用于一个连续变量

如果不喜欢下面那条线,可以这样

直方图和密度图画在一起。注意y = stat(density)表示y是由x新生成的变量,这是一种固定写法,类似的还有stat(count), stat(level)

10.4.9 errorbar图

10.4.11 2D 密度图

与一维的情形geom_density()类似, geom_density_2d(), geom_bin2d(), geom_hex()常用于刻画两个变量构成的二维区间的密度

10.5 主题风格

10.7 组合图片

我们有时候想把多张图组合到一起

10.9 高亮某一组

画图很容易,然而画一张好图,不容易。图片质量好不好,其原则就是不增加看图者的心智负担,有些图片的色彩很丰富,然而需要看图人配合文字和图注等信息才能看懂作者想表达的意思,这样就失去了图片“一图胜千言”的价值。

分析数据过程中,我们可以使用高亮我们某组数据,突出我们想表达的信息,是非常好的一种可视化探索手段。

10.9.2 gghighlight方法

这里推荐gghighlight宏包

  • dplyr has filter()
  • ggplot has Highlighting

10.11 地图

小时候画地图很容易,长大了画地图却不容易了。

这是一个公园🏞地图和公园里松鼠🐿数量的数据集

先来一个地图,

一个geom_sf就搞定了🥂,貌似没那么难呢? 好吧,换个姿势,在地图上标注松鼠出现的位置

分开画呢

当然,也可以用gghighlight的方法

## [1] "sans"         "serif"        "mono"        
## [4] "wqy-microhei"
## [1] "C:\\Windows\\Fonts"
##  [1] "sans"         "serif"        "mono"        
##  [4] "wqy-microhei" "heiti"        "constan"     
##  [7] "kaishu"       "Yahei"        "fzfsj"       
## [10] "fzxbsj"       "maoti"        "fzshuliu"

根据往年大家提交的作业,有同学用rmarkdown生成pdf,图片标题使用了中文字体,但中文字体无法显示 。解决方案是R code chunks加上fig.showtext=TRUE

详细资料可参考这里

10.12 参考资料