ggplot2绘制经典散点图

了解如何重现著名的gapminder散点图

在本教程中,您将学习如何再现由Hans Rosling开发的世界上最著名的数据可视化之一喜欢的小伙伴可以关注个人公众号R语言数据分析指南在此先行拜谢了!!!


汉斯·罗斯林(Hans Rosling)是国际卫生学教授,也是人类进步的发言人。在过去的几十年中,全球世界贫困已大大减少。过去几十年来地球上的生活得到了改善。散点图描绘了2007年人均收入与预期寿命之间的关系。
我们将通过ggplot2对数据进行可视化

获取数据

通过gapminder软件包获取数据

rm(list=ls())
library(tidyverse)
library(gapminder)
library(ggthemes)
library(countrycode)
library(mapproj)
glimpse(gapminder, width = 50)

首先,使用dplyr对数据进行过滤,由于大洋洲和亚洲大陆之间的可视化没有区别,因此将大洋洲归入亚洲。使用case_when函数,该函数可以在特定条件下创建新变量

gapminder_cleaned <- gapminder %>% 
  filter(year == "2007") %>% 
  mutate(
    pop2 = pop + 1,
    continent = case_when(
      continent == "Oceania" ~ "Asia",
      TRUE ~ as.character(continent)
    ) %>% as.factor %>% 
      fct_relevel("Asia", "Americas", "Europe", "Africa")
  ) 

创建第一个散点图

ggplot(data = gapminder_cleaned, aes(x = gdpPercap, y = lifeExp)) +
  geom_point(aes(size = pop, color = continent)) +
  geom_point(aes(size = pop2), color = "black", shape = 21) +
  scale_x_log10(breaks = c(500, 1000, 2000, 4000,
                           8000, 16000, 32000, 64000)) +
  scale_y_continuous(breaks = seq(0, 90, by = 10)) +
  scale_color_manual(values = c("#F15772", "#7EEB03",
                                "#FBE700", "#54D5E9"))

为什么我们向可视化添加了两个geom_point?gapminder可视化中的点带有黑色边框,要将这些添加到geom_points并不容易。因此我们创建第二个geom_point,并将其填充为空shape = 21。变量pop2比变量pop稍大一点,因此我们通过一个点向另一个点上添加来黑色边框

调整散点图

散点图还远远不够完美。点的大小不够大。可视化的背景是灰色而不是白色,我们需要摆脱图例:

pp <- ggplot(data = gapminder_cleaned,aes(x = gdpPercap, y = lifeExp)) +
  geom_point(aes(size = pop, color = continent)) +
  geom_point(aes(size = pop2), color = "black", shape = 21) +
  scale_x_log10(breaks = c(500, 1000, 2000, 4000,
                           8000, 16000, 32000, 64000)) +
  scale_y_continuous(breaks = seq(0, 90, by = 10)) +
  scale_color_manual(values = c("#F15772", "#7EEB03",
                                "#FBE700", "#54D5E9"))  +
  scale_size_continuous(range = c(1, 30)) +
  guides(size = FALSE, color = FALSE) +
  labs(x = "Income",y = "Life expectancy") +
  theme_minimal()

pp

调整轴样式和可视化网格

(gapminder_plot <- pp+
  annotate("text", x = 4000, y = 45, hjust = 0.5,
           size = 85, color = "#999999",
           label = "2007", alpha = .3,
           family = "Helvetica Neue") +
  annotate("segment", x = 0, xend = 2014, y = 46.9, yend = 46.9, 
           color = "#606F7B", linetype = 2, size = .2) +
  annotate("segment", x = 2014, xend = 2014, y = 0, yend = 46.9,
           color = "#606F7B", linetype = 2, size = .2) +
  annotate("text", x = 28200, y = 2, 
           label = "per person (GDP/capita, PPP$ inflation-adjusted)",
           size = 2.8, color = "#999999") +
  annotate("text", x = 2304, y = 42, hjust = 0,
           size = 3.5,
           label = paste0("Nigeria had a life expectancy of\n",
                          "46.9 years and an annual income of",
                          "\n$2014 per year per person in 2007")) +
  theme(
  plot.margin = unit(rep(1, 4), "cm"),
  panel.grid.minor = element_blank(),
  panel.grid.major = element_line(size = 0.2, 
                                  color = "#e5e5e5"),
  axis.title.y = element_text(margin = margin(r = 15), 
                              size = 11,
                              family = "Helvetica Neue Light"),
  axis.title.x = element_text(margin = margin(t = 15), 
                              size = 11,
                              family = "Helvetica Neue Light"),
  axis.text = element_text(family = "Helvetica Neue Light"),
  axis.line = element_line(color = "#999999", 
                           size = 0.2)) +coord_cartesian(ylim = c(4.1, 86)))

coord_cartesian函数可以明确分辨y轴或x轴的极限

获取世界地图的数据

world <- map_data("world") %>%
  filter(region != "Antarctica") %>% 
  mutate(continent = countrycode(sourcevar = region,
  origin = "country.name",destination = "continent"),
  continent = case_when(continent == "Oceania" ~ "Asia",
  TRUE ~ as.character(continent)) %>% as.factor %>%
  fct_relevel("Asia", "Americas", "Europe", "Africa")) %>% 
  drop_na(continent)

glimpse(world, width = 50)

用世界各大洲创建第一张世界地图

ggplot(data = world) + geom_map(map = world,
aes(long, lat, group = group, map_id = region,
fill = continent)) +theme_map() +
coord_map(xlim = c(-180, 180),ylim = c(-200, 200))

改善地图

(continent_map <- ggplot(data = world) + 
    geom_map(map = world,aes(long, lat, group = group, map_id = region,
fill = continent)) +theme_map() +
coord_map(xlim = c(-180, 180),ylim = c(-200, 200)) +
scale_fill_manual(values = c("#F15772","#7EEB03","#FBE700","#54D5E9")) +
    guides(fill = FALSE) +
    theme(plot.background = element_rect(color = "#B8C2CC", fill = NA)))

将地图添加到散点图

gapminder_plot + 
  annotation_custom(grob = ggplotGrob(continent_map), 
  xmin = log10(800), xmax = log10(650000),ymin = 5, ymax = 42)

链接:https://mp.weixin.qq.com/s/C60ebB4PAYEe0mv36tv2Kg

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

推荐阅读更多精彩内容