问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

每日一个科研绘图·气泡图

创作时间:
作者:
@小白创作中心

每日一个科研绘图·气泡图

引用
CSDN
1.
https://blog.csdn.net/qq_45404805/article/details/141490451

气泡图是一种强大的数据可视化工具,它在传统的二维散点图基础上增加了一个维度,通过点的大小来表示第三个数值变量的大小。本文将通过R语言和Gapminder数据集,详细介绍如何绘制和解读气泡图。

一、气泡图基础

气泡图是一种数据可视化工具,它在传统的二维散点图的基础上增加了一个维度,使得我们能够同时观察三个变量之间的关系。这种图表通过点的大小来表示第三个数值变量的大小,从而提供了一种直观的方式来探索数据中的模式和趋势。

在定义气泡图时,我们通常需要以下三个数值变量:

  1. X轴变量:这个变量的值决定了气泡在水平轴上的位置。它通常代表一个连续的数值,如时间、年龄或某种度量。
  2. Y轴变量:这个变量的值决定了气泡在垂直轴上的位置。这同样是一个连续的数值,可以是另一个度量或某种性能指标。
  3. 气泡大小变量:这个变量的值决定了气泡的大小。气泡的大小通常与一个度量的大小成正比,如经济规模、人口数量或其他重要的数值指标。

气泡图的一个经典例子是使用Gapminder数据集。Gapminder是一个非营利组织,由Hans Rosling创立,旨在通过提供易于理解的数据来促进全球发展的教育和理解。Gapminder数据集包含了世界各地区和国家在不同年份的统计数据,包括但不限于平均预期寿命、人均GDP和人口规模。

绘制气泡图

下面是一个使用Gapminder数据集绘制气泡图的示例代码:

# 加载必要的包
library(tidyverse)
library(hrbrthemes)
library(viridis)
library(gridExtra)
library(ggrepel)
library(plotly)
library(gapminder)

# 加载数据并进行预处理
data <- gapminder %>%
  filter(year == "2007") %>%
  dplyr::select(-year) %>%
  mutate(pop = pop / 1000000) %>%
  arrange(desc(pop)) %>%
  mutate(country = factor(country, country))

# 绘制气泡图
ggplot(data, aes(x = gdpPercap, y = lifeExp, size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_size(range = c(1.4, 19), name = "Population (M)") +
  scale_color_viridis(discrete = TRUE, guide = FALSE) +
  theme_minimal() +
  theme(legend.position = "bottom")

这段代码最终生成了一个静态的气泡图,其中每个气泡代表一个国家,气泡的位置由人均GDP(x轴)和预期寿命(y轴)决定,气泡的大小表示人口数量(以百万为单位),而气泡的颜色则表示该国家所在的大洲。由于使用了theme(legend.position = "bottom"),图例被放置在图的底部。

在此图表中,人均GDP与预期寿命之间的关系相当明显:富裕国家的居民倾向于更长寿,当人均GDP达到约10,000美元时,存在一个阈值效应。这种关系本可以通过经典的散点图来检测,但气泡大小允许通过第三层信息来细化这一结果:国家人口。

最后一个变量比X轴和Y轴上的变量更难以解读。确实,人类眼睛对面积的解释能力较弱。但信息是存在的,如果人口与人均GDP或预期寿命之间存在明确的关系,我们将会发现它。

二、增强可读性

前面的图表相当有趣,因为它允许我们理解人均GDP与预期寿命之间的关系。然而,不知道图表极端部分的国家,或者不知道哪些国家偏离了总体趋势,可能会让人感到挫败。如同往常,对图表进行注释是使其具有洞察力的关键步骤:

# 准备数据
tmp <- data %>%
  mutate(
    annotation = case_when(
      gdpPercap > 5000 & lifeExp < 60 ~ "yes",
      lifeExp < 30 ~ "yes",
      gdpPercap > 40000 ~ "yes"
    )
  ) %>%
  mutate(pop = pop / 1000000) %>%
  arrange(desc(pop)) %>%
  mutate(country = factor(country, country))

# 绘制气泡图并添加注释
ggplot(tmp, aes(x = gdpPercap, y = lifeExp, size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_size(range = c(1.4, 19), name = "Population (M)") +
  scale_color_viridis(discrete = TRUE) +
  theme_minimal() +
  theme(legend.position = "none") +
  geom_text_repel(data = tmp %>% filter(annotation == "yes"), aes(label = country), size = 4)

在这段代码中,首先对数据进行了预处理,创建了一个新的变量annotation,根据人均GDP和预期寿命的特定条件将国家标记为"yes"。然后,将人口数量转换为百万单位,并按人口数量降序排列数据,同时将国家名称转换为因子类型。最后,使用geom_text_repel函数为那些满足annotation == "yes"条件的国家添加了文本标签,geom_text_repel会自动调整标签位置以避免重叠,size = 4设置了标签的字体大小。

三、交互性

遵循相同的思路,气泡图可能是使用交互性最有意义的图表类型。在下面的图表中,您可以通过悬停气泡来获取国家名称,并放大图表的特定部分:

# 交互式版本
p <- data %>%
  mutate(gdpPercap = round(gdpPercap, 0)) %>%
  mutate(pop = round(pop / 1000000, 2)) %>%
  mutate(lifeExp = round(lifeExp, 1)) %>%
  arrange(desc(pop)) %>%
  mutate(country = factor(country, country)) %>%
  mutate(text = paste("Country: ", country, "\nPopulation (M): ", pop, "\nLife Expectancy: ", lifeExp, "\nGdp per capita: ", gdpPercap, sep = "")) %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, size = pop, color = continent, text = text)) +
  geom_point(alpha = 0.7) +
  scale_size(range = c(1.4, 19), name = "Population (M)") +
  scale_color_viridis(discrete = TRUE, guide = FALSE) +
  theme_minimal() +
  theme(legend.position = "none")

ggplotly(p, tooltip = "text")

这段代码使用R语言和tidyverse包以及plotly包来创建一个交互式的气泡图,图中展示了不同国家的人均GDP、预期寿命和人口大小。在这段代码中,首先对数据进行了预处理,包括四舍五入人均GDP、人口和预期寿命的值,按人口数量降序排列数据,将国家名称转换为因子类型,并创建了一个新的变量text,该变量包含了用于交互式提示的文本信息。接着,使用ggplot函数创建了一个静态的气泡图,其中气泡的大小和颜色分别代表人口数量和大洲。通过geom_point添加了点图层,并设置了透明度。scale_sizescale_color_viridis分别设置了点的大小范围和颜色方案。theme_minimal应用了一个简洁的主题,而theme(legend.position = "none")则隐藏了图例。最后,使用ggplotly函数将静态图转换为交互式图,并通过tooltip = "text"参数设置鼠标悬停时显示text变量中的信息,这样用户可以查看每个气泡对应的国家详细信息。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号