TidyTuesday 可视化学习之 ggplot2 绘制 高速公路 ( 哈哈 )

参考链接:

https://github.com/gkaramanis/tidytuesday/blob/master/week-42/big-epa-cars.R

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

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

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

  • pivot_longer() 函数: 宽数据变长数据。
  • forcats包 对于处理 factor 相关操作非常方便,绘图排序经常用到
  • row_number() 函数:通用排名,并列的名次结果按先后顺序不一样,靠前出现的元素排名在前

画图思路

数据清洗就不说了,一如既往的结合 filter() + group_by() + summarize() + ungroup() + mutate() 等常用函数

数据清洗

提一下: 在只看到这里数据清洗的视化并未理解为啥要产生 lane 这个变量,直到,看了后面可视化 geom_image(data = city_race, aes(x = lane, y = city_mpg_median, image = car), size= .05, asp = 0.6) 后,才发现原来是给图中的小车子标识位置,一种公路分两列,又一次跪拜。

# 没有这些包的先自行安装。
library(tidyverse)
library(here)
library(ggimage)

big_epa_cars <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-10-15/big_epa_cars.csv")

city_race <- big_epa_cars %>%
  # pivot_longer() 函数将宽数据变为长数据,参数意思都是字面意思
  pivot_longer(cols = c("city08", "cityA08"), names_to = "city_fuel", values_to = "city_mpg") %>%
  filter(city_mpg > 0) %>% # 筛选 city_mpg 数值大于 1 的行
  group_by(make) %>% # 按照 make 列变量进行分组
  summarize(city_mpg_median = median(city_mpg)) %>% 
  # 然后分别求出 make 列对应的每一组变量的 city_mpg 的平局值,这里其实就可以运用到我们的将候选基因分 bin 啊,然后在求出每个 bin 对应的候选基因的值的平均值、最大值、最小值等等。
  ungroup() %>% # 取消分组
  mutate(make = fct_reorder(make, city_mpg_median)) %>%
  # 将 make 对应的因子即变量按照 city_map_median 重新进行排序
  # 详细见 R|数据处理|因子型数据
  # https://ask.hellobi.com/blog/R_shequ/15408

  top_n(10, city_mpg_median) %>% # 取 city_mpg_median 前十个
  arrange(city_mpg_median) %>% # 按照 city_mpg_median 大小进行重新排序
  mutate(lane = row_number() %% 2 * 2) 
  # row_number 通用排名,并列的名次结果按先后顺序不一样,靠前出现的元素排名在前

highway_race <- big_epa_cars %>%
  pivot_longer(cols = c("highway08", "highwayA08"), names_to = "highway_fuel", values_to = "highway_mpg") %>%
  filter(highway_mpg > 0) %>%
  group_by(make) %>%
  summarize(highway_mpg_median = median(highway_mpg)) %>%
  ungroup() %>%
  mutate(make = fct_reorder(make, highway_mpg_median)) %>%
  top_n(10, highway_mpg_median) %>%
  arrange(highway_mpg_median) %>%
  mutate(lane = row_number() %% 2 * 2 + 13) %>%
  group_by(highway_mpg_median) %>% 
  mutate(make = paste0(make, collapse = ", ")) 

产生的数据格式是这样的

导入图中的小车 png 图片

  • 注意: 这里先将图片保存在自己当前环境的路径下
# Icon by mynamepong, flaticon.com
# here() 函数上一次介绍过就不介绍了,就是当前路径
car = here::here("car.png")

绘图

大致思路:geom_rect() 绘制一个大的灰色背景幕布 → geom_rect() 绘制城市公路,哈哈(就是途中的黑色)→ 再绘制公路中间的虚线(白色虚线)→ 同城市公路绘制高速公路 → 通过 geom_image() 把小车图标加上去,哈哈()萌死我了 → 使用 geom_text() 加上车子类型注释,注意其中的参数 hjust 参数一左一右 → 使用 geom_segment 加上刻度尺,这里太机智了,我的妈欸(分了左右,而不是在一条线上)→ xlim() 函数标注 x 轴的范围 → labs() 加上标题啊、小标题啊、脚注啊等等 → 主题优化
总之逻辑特别清晰,一步紧跟一步,绘图代码部分,一步一步运行就好,简单粗暴易理解,真的是学习的好案例。( 作者脑洞真的大,也可能是我脑子太小了

ggplot() +
  # city background 
  geom_rect(aes(xmin = -2, ymin = 0, xmax = 7, ymax = 105), fill = "grey60") +
  # city street
  geom_rect(aes(xmin = -0.75, ymin = 0, xmax = 2.75, ymax = 105), fill = "grey20") +
  # city street line
  geom_segment(aes(x = 1, y = 0, xend = 1, yend = 105), size = 2, color = "grey90", linetype = 2) +
  # city label
  geom_text(aes(x = -1.6, y = 1, label = "CITY"), size = 8, color = "grey90", alpha = 0.4, family = "IBM Plex Sans Medium", angle = 90, hjust = "left") +
  
  # highway background
  geom_rect(aes(xmin = 8, ymin = 0, xmax = 17, ymax = 105), fill = "brown4") +
  # highway 
  geom_rect(aes(xmin = 12.25, ymin = 0, xmax = 15.75, ymax = 105), fill = "grey20") +
  # highway road line
  geom_segment(aes(x = 14, y = 0, xend = 14, yend = 105), size = 2, color = "grey90", linetype = "longdash") +
  # highway label
  geom_text(aes(x = 16.6, y = 1, label = "HIGHWAY"), size = 8, color = "grey90", alpha = 0.4, family = "IBM Plex Sans Medium", angle = 90, hjust = "left") +
  
  # city cars
  geom_image(data = city_race, aes(x = lane, y = city_mpg_median, image = car), size= .05, asp = 0.6) +
  # city cars make
  geom_text(data = city_race, aes(x = 6.6, y = city_mpg_median, label = make), hjust = "right", family = "IBM Plex Sans Condensed", size = 6, color = "white") +
  geom_segment(data = city_race, aes(x = 6.7, y = city_mpg_median, xend = 7, yend = city_mpg_median), color = "white") +
  
  # highway cars
  geom_image(data = highway_race, aes(x = lane, y = highway_mpg_median, image = car), size= .05, asp = 0.6) +
  # highway cars make
  geom_text(data = highway_race, aes(x = 8.4, y = highway_mpg_median, label = make), hjust = "left", family = "IBM Plex Sans Condensed", size = 6, color = "white", check_overlap = TRUE) +
  geom_segment(data = highway_race, aes(x = 8, y = highway_mpg_median, xend = 8.3, yend = highway_mpg_median), color = "white") +
  
  # y axis between roads
  geom_text(aes(x = 7.5, y = seq(0, 100, 10)), label = seq(0, 100, 10), family = "IBM Plex Mono Light", size = 6, color = "black") +
  geom_text(aes(x = 7.5, y = seq(5, 95, 10)), label = seq(5, 95, 10), family = "IBM Plex Mono Light", size = 6, color = "grey50") +
  geom_text(aes(x = 7.5, y = -3, label = "MPG/MPGe"), family = "IBM Plex Mono Light", size = 6, color = "black") +
  
  # title and theme
  xlim(-2, 17) +
  labs(
    title = "Tesla is the leading car brand in energy efficiency",
    subtitle = "Top 10 most energy efficient brands in city and highway driving.\nRanking is based on calculated median MPG and MPGe of all\nmodels made by every car manufacturer since 1984.",
    caption = "Source: EPA | Graphic: Georgios Karamanis\nCar icon by mynamepong, flaticon.com"
  ) +
  theme_void(base_family = "IBM Plex Sans") +
  theme(
    plot.margin = margin(20, 20, 20, 20),
    plot.title = element_text(family = "IBM Plex Serif Bold", size = 28, margin = margin(10, 0, 0, 0)),
    plot.subtitle = element_text(size = 24, margin = margin(10, 0, 0, 40)),
    plot.caption = element_text(size = 12, color = "grey60", margin = margin(0, 40, 0, 0)),
    
  ) +
  ggsave(
    here::here(paste0("big-epa-cars-", format(Sys.time(), "%Y%m%d_%H%M%S"), ".png")),
    height = 19, width = 12, dpi = 320
  ) # 出图到保存一步到位
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容