原文: https://www.miriamheiss.com/posts/histogram-ggplot/

ggplot() 函数对任何数据科学家都是必不可少的, ta是一种非常简单的绘图函数。刚开始接触可能看起来很难, 不过不要害怕,因为一旦学了基础知识,一切都会变得清晰! 让我们开始!

之前分享过 R语言 | ggplot2简明绘图之散点图,是以散点图为例简单讲解ggplot2的绘图,今天我们将以直方图作为主讲图形。

直方图是另一种ggplot2常用的图形,与散点图类似,也是分多个图层进行逐层绘制。


准备

导入本文要用到的包

library(tidyverse) 
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6     ✔ purrr   0.3.4
## ✔ tibble  3.1.8     ✔ dplyr   1.0.9
## ✔ tidyr   1.2.0     ✔ stringr 1.4.1
## ✔ readr   2.1.2     ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(primer.data) #准备数据
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
showtext_auto()  #显示中文

#install.packages("MetBrewer")
library(MetBrewer) #配色包


选择数据

使用data()函数可以查看现有的数据集有哪些,

data()

这里选择nobel,使用View(nobel)可以在新打开一个窗口,方便了解数据

View(nobel)


画布gglot

画画需要画布,对于数据分析的绘图也是同理。导入相关R包后, 用ggplot函数构造一个画布。因为还没设定数据,所以这是一个空画布

ggplot()

我们将使用 nobel数据集,传入数据的代码ggplot(data=nobel)

ggplot(data=nobel)

画布看起来依然是空白的,不要紧张。理解这个之前类比PS这类绘图软件,将修图工作看做是很多个图层的叠加。现在我们使用时依然在最底层的ggplot图层,在ggplot函数内添加mapping=aes()参数,准备添加x轴、y轴、color。的图层。

ggplot(data=nobel,
       mapping=aes())

注意了,现在图层即将发生变化。我们选择设置x轴 aes(x=year)

  • x轴 year
ggplot(data=nobel,
       mapping=aes(x=year))

现在我们将开始添加高层次的图层,也会显示越来越多的信息。


添加geom

现在添加geom层,该层是通过 + 构建在ggplot层之上。这里使用 geom_histogram() 绘制直方图,

ggplot(data=nobel,
       mapping=aes(x=year))+
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

不错,接下来添加color


fill和color

按照学科对每个时期的诺奖进行专业分类,使用aes中的fill参数。

ggplot(data=nobel,
       mapping=aes(x=year, fill=field))+
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

但同一时期,不同专业之间没有边界区分,容易混乱。这里设置 geom_histogram()color="white"

ggplot(data=nobel,
       mapping=aes(x=year, fill=field))+
  geom_histogram(color="white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


更改配色

更改geom层的颜色,所以该层紧贴geom层,且在geom层之上。设置方法可以使用 scale_fill_manual() 即可。scale_fill_munual() 中的values可以传入颜色字符串。

ggplot(data=nobel,
       mapping=aes(x=year, fill=field))+
  scale_fill_manual(values=c("red",
                             "orange",
                             "yellow",
                             "green",
                             "blue",
                             "purple"))+
  geom_histogram(color="white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

漂亮! 这些颜色真的很明艳, scale_fill_munual() 还可以选择十六进制颜色字符串进行颜色自定义

ggplot(data = nobel,
       mapping = aes(x = year,
                     fill = field)) +
  scale_fill_manual(values = c("#f73c39",
                               "#f79b39",
                               "#f7ee39",
                               "#228c14",
                               "#1e80c7",
                               "#7c148c")) + 
  geom_histogram(color = "white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


配色包MetBrewer

对于我们普通人而言, 不需要记住那么多颜色,只需要在配色方案中选择好看的配色即可。 MetBrewer是R语言的配色包,在文章开头已经提前导入了。下图是MetBrewer的配色方案,选择一种配色方案的名字,如Signac

ggplot(data = nobel,
       mapping = aes(x = year,
                     fill = field)) +
  #选择Signac配色方案,使用其中6种颜色
  scale_fill_manual(values = met.brewer('Signac', 6)) + 
  geom_histogram(color = "white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


标签labs

现在我们需要用labs() 函数给图片添加标签图层。例如title、subtitle、caption、x、y、legend。

ggplot(data = nobel,
       mapping = aes(x = year,
                     fill = field)) +
  scale_fill_manual(values = met.brewer("Signac", 6)) + 
  geom_histogram(color = "white") +
  labs(title = "Nobel prize laureate numbers have gone up in past 50 years",
       subtitle = "Physics, Medicine, and Chemistry have largest numbers of laureates",
       x = "Year",
       y = "Number of laureates")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

现在x轴、y轴、标题都是大写,需要将field也大写。这里在labs(fill=‘Year’)更改year为Year

ggplot(data = nobel,
       mapping = aes(x = year,
                     fill = field)) +
  scale_fill_manual(values = met.brewer("Signac", 6)) + 
  geom_histogram(color = "white") +
  labs(title = "Nobel prize laureate numbers have gone up in past 50 years",
       subtitle = "Physics, Medicine, and Chemistry have largest numbers of laureates",
       x = "Year",
       y = "Number of laureates",
       fill='Field')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


中文

默认ggplot2不支持中文,为了能显示中文,使用showtext包。前文已提前导入并初始化

library(showtext) #支持中文
showtext_auto()

运行中文的代码

#把学科转为中文
nobel2 <- nobel %>% 
  mutate(
    field = case_when(field=='Chemistry' ~ '化学',
                       field=='Economics' ~ '经济学',
                       field=='Medicine' ~ '经济学',
                       field=='Peace' ~ '和平',
                       field=='Physics' ~ '物理学',
                       field=='Literature' ~ '文学'))



#绘图
ggplot(data = nobel2,
       mapping = aes(x = year,
                     fill = field)) +
  scale_fill_manual(values = met.brewer("Signac", 6)) + 
  geom_histogram(color = "white") +
  labs(title = "过去50年诺贝尔奖得主人数一直保持增长趋势",
       subtitle = "物理学、医学和化学的获奖者人数最多",
       x = "年份",
       y = "获奖人数",
       fill='领域')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.