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

2024-08-24 10:36
文章标签 每日 绘图 科研 24 气泡 08

本文主要是介绍每日一个科研绘图·气泡图|24-08-24,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、气泡图

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

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

  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.7scale_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.7scale_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.7scale_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变量中的信息,这样用户可以查看每个气泡对应的国家详细信息。

这篇关于每日一个科研绘图·气泡图|24-08-24的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102237

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

matplotlib绘图中插入图片

在使用matplotlib下的pyplot绘图时,有时处于各种原因,需要采用类似贴图的方式,插入外部的图片,例如添加自己的logo,或者其他的图形水印等。 一开始,查找到的资料都是使用imshow,但是这会有带来几个问题,一个是图形的原点发生了变化,另外一个问题就是图形比例也产生了变化,当然最大的问题是图形占据了整个绘图区域,完全喧宾夺主了,与我们设想的只在绘图区域中占据很小的一块不相符。 经

08 增删查功能

划重点: lable 标签keyup:键盘事件标签内添加样式:style使用事件修饰符:preventforEach :遍历 数组indexOf: 可以返回要查询的某个字符串值在整个字符串中首次出现的位置下标findIndex:返回传入一个测试条件(函数)符合条件数组的首个元素的位置splice:向/从数组中添加/删除项目,然后返回被删除后的新的项目数组 黑椒蟹 一对: <!DOCTYPE