TidyTuesday 可视化学习之 ggplot2 绘制 heatmap 学习

参考链接

https://github.com/gkaramanis/tidytuesday/tree/master/week-38

image

#######################################################################

学习到的技能(需要掌握的函数

#######################################################################

  • filter() + mutate() + group_by() + arrange() + drop_na()

  • mutate() 函数中的 case_when 来条件判断赋值,可以使用代码冗余复杂变得浅显易懂,也很方便进行修改

  • lag() 函数表示取向量中的前一个数据

  • lead() 函数表示取向量中的后一个数据

    • 最后记得先排序后操作,或者在函数中指定 order_by = xx
  • geom_segment() 函数

  • expand 函数表示范围扩展常数矢量,用于在数据周围添加一些填充,以确保将其放置在距轴一定距离的位置。使用便捷函数

  • expand_scale() 函数来生成 expand 参数的值。默认值是将 连续变量 的比例尺各扩大 5%,将 离散变量 的比例尺各扩大 0.6 个单位。(翻译官方说明)

    • expand_scale(mult = 0, add = 0)
    • 一句话 add 表示图形距离画布左右两边的距离, mult 表示图形里画布上下两边的距离
  • rescale() 函数将数据范围归一化到 [0, 1]

  • display.brewer.all() 就可以看到对应取色方案

  • 也可以在网站 Colormaps 进行查看

  • labs() 要善于利用此函数来加标题等注释

  • theme_void() 去除所有内置主题

  • here 包, 可以快速创建文件夹以及文件

#######################################################################

正文

#######################################################################

数据清洗

导入数据

rm(list = ls())

library(tidyverse)
library(here)
library(lemon)
library(RColorBrewer)
library(scales)

park_visits <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-09-17/national_parks.csv")

# 可以看到每一列的数据类型是什么样的。
# 我们可以清楚看到 `year` 那一列是属于字符串类型,后面进行操作时候变为了 `numeric`
# cols(
#   year = col_character(),
#   gnis_id = col_character(),
#   geometry = col_character(),
#   metadata = col_character(),
#   number_of_records = col_double(),
#   parkname = col_character(),
#   region = col_character(),
#   state = col_character(),
#   unit_code = col_character(),
#   unit_name = col_character(),
#   unit_type = col_character(),
#   visitors = col_double()
# )

整理数据

  • 这里充分结合来了 filter() + mutate() + group_by() + arrange() + drop_na() 函数一套清洗
  • 还有一点需要强调的是要善于利用 mutate() 函数中的 case_when 来条件判断赋值,可以使用代码冗余复杂变得浅显易懂,也很方便进行修改
  • 这里还需要注意的是利用了 lag() 函数,起到提取向量中的前一个值,后面会解释。
pv_ch <- park_visits %>% 
  distinct(year, unit_name, unit_type, visitors) %>% # 去除重复行,类似base::uniq() 函数, 返回去除重复后的数据
  filter(unit_type == "National Park" & year != "Total") %>% # 筛选数据类型为 `National Park` 和年份为 `非 Total` 的行
  mutate(year = as.numeric(year)) %>% # 将 `year` 列由 `character` 变为 `numercic`
  group_by(unit_name) %>% # 按照 `unit_name` 列变量进行分组
  arrange(year, .by_group = TRUE) %>% # 将 `year` 年份按照分组分别进行排序
  mutate(pct_change = (visitors/lag(visitors) - 1) * 100) %>% # 新建一列 `pct_change` lag() 向量中的 `前一个`  值
  filter(unit_name != "Denali National Preserve") %>% # 将 `Denali National Preserve` 行去除
  drop_na() %>% # 去除空值 `NA`
  mutate( # 按照 `pct_change` 列的大小分组,三组
    pct_change = case_when(
      pct_change > 100 ~ 200,
      pct_change < -100 ~ -200,
      TRUE ~ pct_change # 表示除了上面的范围之内的范围都属于这个范畴
    )
  )

不得不插一句说明 lag()lead() 函数

lag(1:10, 1)
# [1] NA  1  2  3  4  5  6  7  8  9

lag(1:10, 2)
# [1] NA NA  1  2  3  4  5  6  7  8

lead(1:10, 1)
#>  [1]  2  3  4  5  6  7  8  9 10 NA

lead(1:10, 2)
#>  [1]  3  4  5  6  7  8  9 10 NA NA

可视化这部分思想很重要,

geom_segment() 函数用来绘制区域,即指定四个点的位置, 详情见 ggplot2 都有哪些使用不多但是却异常强大的图层函数 一文,反正我看完是受益匪浅。
expand: 范围扩展常数矢量,用于在数据周围添加一些填充,以确保将其放置在距轴一定距离的位置。使用便捷函数

ggplot(mpg, aes(displ, hwy)) +
    geom_point() +
    scale_x_continuous(limits = c(1, 7), expand = c(0.5, 0))
# right most position will be 7 + (7-1) * 0.5 = 10

ggplot(mpg, aes(displ, hwy)) +
    geom_point() +
    scale_x_continuous(limits = c(1, 7), expand = c(0.5, 2))
# right most position will be 7 + (7-1) * 0.5  + 2 = 12

expand_scale() 来生成 expand 参数的值。默认值是将 连续变量 的比例尺各扩大 5%,将 离散变量 的比例尺各扩大 0.6 个单位。(翻译官方说明)

  • expand_scale(mult = 0, add = 0)

  • mult: 范围扩展因子的向量。如果向量长度为 1,则刻度的下限和上限均会向外扩大。如果向量长度为 2,则下限由 mult[1] 扩展,上限由 mult[2] 扩展。add = c(0,1) 表示下边距离 x 轴零距离,距离顶端 1 倍长度。一般用于 y 轴,即 scale_y_*

  • add: 可加范围扩展常数的向量。如果向量长度为 1,则通过添加单位向外扩展刻度的上下限。如果向量长度为 2,则下限由 add[1] 扩展,上限由 add[2] 扩展。 add = c(0,1) 表示距离 y 轴零距离,距离右边 1 个单位。一般用于 x 轴,即 scale_x_*

  • 一句话 add 表示图形距离画布左右两边的距离, mult 表示图形里画布上下两边的距离

rescale()

  • 将数据范围归一化到 [0, 1]
rescale(1:10)
# [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667 0.7777778 0.8888889 1.0000000

rescale(1:11)
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

图中对应的颜色条

  • display.brewer.all() 就可以看到对应取色方案
  • 也可以在网站 Colormaps 进行查看

labs() 要善于利用此函数来加标题等注释

theme_void() 去除所有内置主题,具体一眼见 ggplot2 的主题模板

还得提一下的是 here 包, 可以快速创建文件夹以及文件

here()
# [1] "F:/temp_desktop/2019-5"

here("one", "two", "awesome.txt")
# [1] "F:/temp_desktop/2019-5/one/two/awesome.txt"
cat(readLines(here("one", "two", "awesome.txt")))
# 这里需要管理员权限运行才行,由于我这里没有管理员运行,所以后面那部分保存图片是运行不了的
pv_ch %>%
  ggplot() +
  geom_segment(aes(x = year, xend = year,
                   y = 0, yend = 1, color = pct_change), size = 1) + # 绘制几何图形并填充颜色
  scale_x_continuous(breaks = seq(1910, 2010, 20), # 指定 x 轴标签内容
                     expand = expand_scale(add = c(5, 1))) + # 表示指定离左边的距离为 5, 离右边为 1,当为 c(0, 0) 时候会填充整个坐标轴画布
  scale_y_continuous(expand = c(0.05, 0.25)) + # 表示将 y 轴变为 ymax + (ymax - ymin) * 0.05 + 0.25
  facet_wrap(vars(unit_name), ncol = 3) + # 表示按照 `unit_name` 进行分面,变为三列。
  # `scale_colour_gradientn` N种颜色之间的平滑颜色渐变
  scale_colour_gradientn(limits = c(-200, 200), # 指定颜色填充的范围
                         colors = brewer.pal(n = 7, name = "RdYlGn"), # 选取颜色,对应颜色注释见 `display.brewer.all()`
                         values = rescale(c(-200, -100, -1, 0, 1, 100, 200)), # 对七个刻度进行归一化?,反正就是变成 [0, 1] 
                         labels = c("", "-100%", "0", "100%", "") # 对应的刻度尺进行标签注释
  ) +
  labs( # 标签注释,懒得解释
    title = "National Park Visits 1904–2016",
    subtitle = "Year-over-year percentage change",
    caption = "Source: dataisplural/data.world | Graphic: Georgios Karamanis"
  ) +
  guides(color = guide_colorbar(
    title.position = "top",
    label.position = "top",
    title = NULL,
    barwidth = 20,
    barheight = 0.5
  )) +
  theme_void(base_family = "Times New Roman") +
  theme(
    legend.position = "top",
    legend.title = element_text(size = 20, color = "grey20"),
    legend.margin = margin(0, 0, 20, 0),
    plot.background = element_rect(fill = "grey80", color = NA),
    strip.background = element_rect(fill = "grey80", color = NA),
    strip.text = element_text(family = "Times New Roman", color = "grey30",
                              hjust = 1, vjust = 1),
    plot.title = element_text(size = 28, color = "grey20", family = "Times New Roman"),
    plot.subtitle = element_text(size = 20, color = "grey20"),
    plot.caption = element_text(size = 8, color = "grey30", margin = margin(20, 0, 0, 0)),
    axis.text.x = element_text(family = "Times New Roman", size = 7, color = "grey40"),
    panel.grid.major.x = element_line(color = "grey75"),
    plot.margin = margin(20, 20, 20, 20)
  ) +
  
  # save image
  ggsave(
    here::here("week-38", "figures", "temp", paste0("national-parks", format(Sys.time(), "%Y%m%d_%H%M%S"), ".png")),
    width = 18, height = 14, dpi = 320
  ) # 没有管理员运行 R ,所以我的不行,需要自行设置
image

最后这个学了以后可以用来做什么呢?那就看大家自己的想法了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容