每日一个科研绘图·气泡图|24-08-24

news2024/9/20 20:26:30

一、气泡图

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

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

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

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


以下是一个使用Gapminder数据集摘要的例子,该数据集通过Hans Rosling的Ted演讲而闻名。它提供了100多个国家的平均预期寿命、人均GDP和人口规模的数据。该数据集可通过gapminder R包获取。

# Libraries
library(tidyverse) # 加载tidyverse包,提供数据整理和图形制作的工具
library(hrbrthemes) # 加载hrbrthemes包,提供了一些美观的主题
library(viridis) # 加载viridis包,提供了颜色渐变方案
library(gridExtra) # 加载gridExtra包,用于在网格中排列图形
library(ggrepel) # 加载ggrepel包,用于避免点标签重叠
library(plotly) # 加载plotly包,用于创建交互式图形

# The dataset is provided in the gapminder library
library(gapminder) # 加载gapminder包,包含有关不同国家和地区随时间变化的生命期望、GDP和人口的数据
data <- gapminder %>% 
  filter(year=="2007") %>% # 筛选出2007年的数据
  dplyr::select(-year) # 移除年份列

# Show a bubbleplot
data %>%
  mutate(pop=pop/1000000) %>% # 将人口数量转换为百万单位
  arrange(desc(pop)) %>% # 按人口数量降序排列数据
  mutate(country = factor(country, country)) %>% # 将国家名称转换为因子类型,保持原有顺序
  ggplot( aes(x=gdpPercap, y=lifeExp, size = pop, color = continent)) + # 创建ggplot对象,设置x轴为人均GDP,y轴为预期寿命,点的大小代表人口,颜色代表大洲
    geom_point(alpha=0.7) + # 添加点图层,设置透明度为0.7
    scale_size(range = c(1.4, 19), name="Population (M)") + # 设置点的大小范围,并添加大小图例
    scale_color_viridis(discrete=TRUE, guide=FALSE) + # 使用viridis颜色方案,并且不显示颜色图例
    theme_minimal() + # 应用最小化主题
    theme(legend.position="bottom") # 将图例放置在底部

这段代码使用了R语言和多个tidyverse包来创建一个气泡图,展示了2007年不同国家的人均GDP、预期寿命和人口大小。

image-20240824091219216

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


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

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


二、变体

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

# Prepare data
tmp <- data %>%
  mutate(
    annotation = case_when(
      gdpPercap > 5000 & lifeExp < 60 ~ "yes", # 如果人均GDP大于5000且预期寿命小于60岁,标记为"yes"
      lifeExp < 30 ~ "yes", # 如果预期寿命小于30岁,标记为"yes"
      gdpPercap > 40000 ~ "yes" # 如果人均GDP大于40000,标记为"yes"
    )
  ) %>%
  mutate(pop=pop/1000000) %>% # 将人口数量转换为百万单位
  arrange(desc(pop)) %>% # 按人口数量降序排列数据
  mutate(country = factor(country, country)) # 将国家名称转换为因子类型,保持原有顺序

# Plot
ggplot( tmp, aes(x=gdpPercap, y=lifeExp, size = pop, color = continent)) + # 创建ggplot对象,设置x轴为人均GDP,y轴为预期寿命,点的大小代表人口,颜色代表大洲
  geom_point(alpha=0.7) + # 添加点图层,设置透明度为0.7
  scale_size(range = c(1.4, 19), name="Population (M)") + # 设置点的大小范围,并添加大小图例
  scale_color_viridis(discrete=TRUE) + # 使用viridis颜色方案
  theme_minimal() + # 应用minimal主题
  theme(legend.position="none") + # 不显示图例
  geom_text_repel(data=tmp %>% filter(annotation=="yes"), aes(label=country), size=4 ) # 对满足条件的国家添加文本标签,使用geom_text_repel避免标签重叠

这段代码使用R语言和tidyverse包来准备数据并创建一个气泡图,图中包含了特定条件下的国家标注。

image-20240824091629885

在这段代码中,首先对数据进行了预处理,创建了一个新的变量annotation,根据人均GDP和预期寿命的特定条件将国家标记为"yes"。然后,将人口数量转换为百万单位,并按人口数量降序排列数据,同时将国家名称转换为因子类型。

在绘图部分,使用ggplot函数创建了一个气泡图,其中气泡的大小和颜色分别代表人口数量和大洲。通过geom_point添加了点图层,并设置了透明度。scale_sizescale_color_viridis分别设置了点的大小范围和颜色方案。

最后,使用geom_text_repel函数为那些满足annotation=="yes"条件的国家添加了文本标签,geom_text_repel会自动调整标签位置以避免重叠,size=4设置了标签的字体大小。


三、交互性

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

# Interactive version
p <- data %>%
  mutate(gdpPercap=round(gdpPercap,0)) %>% # 将人均GDP四舍五入到最接近的整数
  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="")) %>% # 创建一个新变量text,包含国家名称、人口、预期寿命和人均GDP的信息
  ggplot( aes(x=gdpPercap, y=lifeExp, size = pop, color = continent, text=text)) + # 创建ggplot对象,设置x轴为人均GDP,y轴为预期寿命,点的大小代表人口,颜色代表大洲,text变量用于交互式提示
    geom_point(alpha=0.7) + # 添加点图层,设置透明度为0.7
    scale_size(range = c(1.4, 19), name="Population (M)") + # 设置点的大小范围,并添加大小图例
    scale_color_viridis(discrete=TRUE, guide=FALSE) + # 使用viridis颜色方案,并且不显示颜色图例
    theme_minimal() + # 应用最小化主题
    theme(legend.position="none") # 不显示图例

ggplotly(p, tooltip="text") # 将静态图转换为交互式图,并设置鼠标悬停时显示text变量的信息

这段代码使用R语言和tidyverse包以及plotly包来创建一个交互式的气泡图,图中展示了不同国家的人均GDP、预期寿命和人口大小。

image-20240824091945585

在这段代码中,首先对数据进行了预处理,包括四舍五入人均GDP、人口和预期寿命的值,按人口数量降序排列数据,将国家名称转换为因子类型,并创建了一个新的变量text,该变量包含了用于交互式提示的文本信息。

接着,使用ggplot函数创建了一个静态的气泡图,其中气泡的大小和颜色分别代表人口数量和大洲。通过geom_point添加了点图层,并设置了透明度。scale_sizescale_color_viridis分别设置了点的大小范围和颜色方案。theme_minimal应用了一个简洁的主题,而theme(legend.position="none")则隐藏了图例。

最后,使用ggplotly函数将静态图转换为交互式图,并通过tooltip="text"参数设置鼠标悬停时显示text变量中的信息,这样用户可以查看每个气泡对应的国家详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook的AI助手:如何提升用户社交体验的智能化

在现代社交媒体平台中&#xff0c;人工智能&#xff08;AI&#xff09;的应用正逐渐改变人们的社交体验。Facebook作为全球最大的社交媒体平台之一&#xff0c;已在AI技术的开发与应用上投入了大量资源&#xff0c;并通过其AI助手为用户提供了更加个性化、智能化的互动体验。这…

pycharm 隐藏 __ init __ .py 文件

pycharm 隐藏 __ init __ .py 文件 每次写python项目时&#xff0c;都会有一个自动生成__ init __ .py文件&#xff0c;看的很累&#xff0c;所以想把__ init __ .py文件给隐藏掉 方法&#xff1a; &#xff08;1&#xff09;File -> Settings (2) Appearance & Behav…

武汉流星汇聚:全球化布局与本地化运营,亚马逊电商帝国崛起秘诀

在数字时代的浪潮中&#xff0c;亚马逊如同一颗璀璨的星辰&#xff0c;照亮了全球电子商务的天空。作为美国乃至全球访问量最高的电商平台&#xff0c;亚马逊不仅重塑了消费者的购物习惯&#xff0c;更以其独特的商业模式、惊人的订单履行速度和卓越的购物体验&#xff0c;引领…

FFmpeg的入门实践系列四(AVS)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、AVS简介二、基于FFmpeg配置AVS2 前期博客 FFmpeg的入门实践系列一(环境搭建) FFmpeg的入门实践系列…

零基础5分钟上手亚马逊云科技-利用MQ为应用解耦

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

揭秘AI绘画赚钱之道:学会这十大技巧,轻松踏入高薪岗位,实现财务自由!

亲爱的学友们&#xff0c;当我们谈论AI绘画&#xff0c;不仅仅是在描绘科技如何重塑艺术疆界&#xff0c;更是在探索一场颠覆性的商业革命。自从AI绘画技术从萌芽走向繁荣&#xff0c;它已经从简单的图像风格转换跃升为能读懂人心、创世般生成各类视觉作品的神奇力量。今天&…

哈夫曼树和哈夫曼编码详解(包含Java代码实现)

目录 什么是哈夫曼树&#xff1f;如何构造哈夫曼树&#xff1f;构造过程代码实现哈夫曼树的结构构建哈夫曼树并计算WPL值测试代码 什么是哈夫曼编码&#xff1f;如何构建哈夫曼编码&#xff1f;构建过程代码实现 什么是哈夫曼树&#xff1f; 哈夫曼树又称为最优树&#xff0c;是…

应用实例 | Simufact 增材制造工艺仿真助力保时捷薄壁件打印

在过去的 30 多年里&#xff0c;增材制造技术被广泛应用于各行各业&#xff0c;尤其在医疗器械、航空领域尤为突出。其中激光束进行金属粉末床熔融的工艺应用最为广泛&#xff0c;由该工艺制造的零部件普遍兼具高设计自由度、高灵活性、优异机械性能等特点。对于汽车行业&#…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个 Server可以包含至少一个 Service&#xff0c;用于具体提供服务。Service 主要包含两个部分&#xff1a;Conn…

都说25张宇是大趋势,那660、880还刷吗?

25上半年张宇很火&#xff0c;是有客观原因的&#xff1a; 1. 大纲改革后&#xff0c;大题变少了&#xff0c;选填变多了&#xff1b; 2. 但是考试覆盖的知识点不能少&#xff0c; ——因为知识点越少&#xff0c;随机性越高&#xff0c;这个考试就越不公平。 这直接导致了&…

vue组件和插件使用

前端组件 1、安装pinia(Vue 的专属状态管理库)&#xff1a; npm install pinia2、安装pinia-plugin-persistedstate(持久存储插件): npm install pinia-plugin-persistedstate浏览器刷新时&#xff0c;有些数据希望是保存下来的。如用户登录后&#xff0c;用户信息会存储在全…

Scheme5.0标准之重要特性及用法实例(三十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

设置虚拟机使用主机以太网而不是WiF连接

虚拟机使用主机的以太网连接而不是Wi-Fi连接&#xff0c;可以通过在虚拟化软件中配置虚拟机的网络设置来实现。以下是一些常见的虚拟化软件&#xff08;如VMware和VirtualBox&#xff09;中设置虚拟机网络以使用以太网连接的步骤&#xff1a; 一、VMware中设置 1、打开虚拟网…

Python画笔案例-007 绘制水滴

1、绘制水滴 通过 python 的turtle 库绘制一个水滴的图案&#xff0c;如下图&#xff1a; 2、实现代码 今天绘制的水滴&#xff0c;在tuitle 库里并没有直接的功能可以绘制&#xff0c;我们仔细观察&#xff0c;可以看出&#xff0c;水滴往下越来越粗&#xff0c;所以我们可以…

API商品数据接口(电商数据api)——京东淘宝价格详情

众多品牌选择使用比价工具进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 提高开发效率&#xff1a;API接口允许不同的应用程序之间高效地进行交互&#xff0c;节省了大量的人力物力成本&#xff0c;使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数…

正则表达式匹配成对括号

匹配一对括号&#xff0c;用于在一个html文本中提取JSon 文本。例如 { “duration”:7599,"minBufferTime{second bracket }{third bracket} } 一对加粗的{} &#xff0c;而不要中间的{}。简单写法会出现错误匹配。 在.Net Framework的正则表达式中&#xff0c;提供了”…

在Activity中使用Toast

在Activity中使用Toast Toast是Android系统提供的一种非常好的提醒方式&#xff0c;在程序中可以使用它将一些短小的信息通知给用户&#xff0c;这些信息会在一段时间后自动消失&#xff0c;并且不会占用任何屏幕空间&#xff0c;我们现在就尝试一下如何在活动中使用Toast。 …

谷粒商城篇章11--P311-P325--秒杀服务【分布式高级篇八】

目录 1 后台添加秒杀商品 1.1 配置优惠券服务网关 1.2 添加秒杀场次 1.3 上架秒杀商品 2 定时任务 2.1 cron 表达式 2.2 cron表达式特殊字符 2.3 cron示例 3 秒杀服务 3.1 创建秒杀服务模块 3.1.1 pom.xml 3.1.2 application.yml配置 3.1.3 bootstrap.yml配置 3.…

【赵渝强老师】Docker三剑客

在Docker容器中提供了三个非常有用的工具&#xff0c;它们分别是&#xff1a;Docker Compose、Docker Machine和Docker Swarm。下面分别进行介绍。 视频讲解如下&#xff1a; Docker三剑客 【赵渝强老师】Docker的三剑客 一、容器编排工具Docker Compose 在使用Docker部署应用…

如何在 Nuxt 中动态设置页面布局

title: 如何在 Nuxt 中动态设置页面布局 date: 2024/8/24 updated: 2024/8/24 author: cmdragon excerpt: 摘要:本文介绍如何在Nuxt框架中通过设置setPageLayout函数动态调整页面布局,包括安装Nuxt、创建不同布局文件及中间件,并通过示例演示如何根据不同路径设置相应布局…