数据可视化:探索气泡图(bubble charts)的力量

气泡图(bubble charts),也称为泡泡图,是展示数据的最引人注目的方式之一。它展示了前两个信息部分之间的关系。此外,它还突出显示了另一个重要部分,这个部分不总是直接依赖于前两个部分。

当试图检查多个数据点之间的相关性时,使用气泡图是很有用的。它们的视觉特性加速了对数据之间关系的识别,通常比查阅统计表格更容易理解。

何时使用气泡图?

向观众展示气泡图可能会有些困难,因为他们必须理解很多信息。因此,在使用气泡图或图表时,需要仔细考虑何时比其缺点更好。气泡图适用于显示许多维度,而散点图最适合显示两个维度。

气泡图或地图适用于比较具有多个数据集的数据点。这些数据集可以包括人口规模、人口统计、年龄和性别。这些图表或地图允许进行清晰的三向视觉比较。

相反,当额外的维度无法为其增加足够的价值以证明包含它们时,避免使用气泡图是不错的选择。

上面的气泡图结合了人均 GDP、预期寿命、人口数量和时间等多个维度的信息,通过泡泡的大小、位置和颜色来直观地展示了不同国家在不同时间点的经济发展水平和人民生活水平的关系。

  • 泡泡大小维度:每个泡泡的大小代表了对应国家的人口数量,使用了平方根函数进行了缩放,以便更好地展示不同国家之间的人口规模差异。
  • x 轴维度:x 轴表示了国家的人均 GDP。
  • y 轴维度:y 轴表示了国家的预期寿命。
  • 颜色维度:每个泡泡的颜色代表了对应国家的数据所属的年份。1990 年数据使用了红色调的颜色渐变,而 2015 年数据则使用了蓝色调的颜色渐变,以便区分两个时间点的数据。

类似气泡图的图表

许多其他图表和可视化工具类似于气泡图。它们可以同时显示许多不同的信息,帮助我们理解事物之间的关系,并使模式更加清晰。其中一些图表包括:

  • 散点图(Scatter Plots)

人们常常使用散点图来展示两个或多个维度的数据。散点图中的每个标记代表一个数据点,使其适用于可视化二维数据。散点图是一种简单的图表,将配对数据显示在x轴和y轴上。散点图上的点所代表的观察结果与两个变量的值相对应。散点图可以显示变量之间的关系,这些关系可以是线性或非线性的,可以是正的或负的。它们对于发现数据中隐藏的离群值和模式非常有用。

  • 泡泡地图(Bubble Maps)

泡泡地图与气泡图类似。它们使用地图作为背景,并在地图的特定位置显示数据点为泡泡。此外,泡泡的大小可以在散点图中编码第三个变量。两个位置数值变量表示地理坐标(即纬度和经度),我们可以通过在背景地图上放置泡泡来创建泡泡地图。泡泡地图是散点地图的扩展,可以帮助解决可能出现的过度绘制困难。如果散点地图在某一区域有很多点,可能很难看到它们所有。我们可以简化通过使用一个泡泡来显示该区域的总点数。同样,我们可以使用多个泡泡来表示图表上的不同区域。

  • 填充圆圈图(Packed Circle Charts)

填充圆圈图是一种使用圆圈来显示层次结构或嵌套类别的数据可视化类型。一个大圆圈包围图表中的小圆圈,每个小圆圈显示主类别的一个较小部分。在完整的圆圈图中,唯一显示的是泡泡所代表的数字或频率。在没有任何实际位置轴的情况下,它们会密集排列。

绘制气泡图时几点注意事项

  • 根据值调整气泡区域的大小:气泡图常见错误是将点的直径或半径按第三个变量的值进行缩放,使得一个点的值是另一个点的两倍时,其面积会成四倍增长,造成视觉误解。因此,制作气泡图时应确保气泡的面积与第三个变量的值相匹配,保持大小比例一致,以准确反映数据。需要根据数据调整点的大小,确保图表的可读性和准确性。
  • 限制数据点的数量:气泡图通常采用透明显示,以展示所有点在很小时的重叠情况。尽管制作气泡图没有具体的数据使用指南,但在使用时需要注意。如果绘图过于密集,可以进行数据总结或选择其他图表类型来展示数据,以确保图表的清晰度和可读性。
  • 清晰的图例和标签:在气泡图中,标签和图例是非常重要的组件。气泡的大小和位置本身可能无法清晰展示它们的重要性,因此需要额外的信息来澄清图表的比例和背景。缺少这些基本组件可能导致图表被误解或完全被忽视的风险,因此包括它们可以帮助观众正确使用图表并更有效地理解数据。
  • 揭示明显的模式:在使用气泡图时,确保气泡的大小反映了值,这样可以清晰地展示信息给他人。在创建图表时,应尝试不同的数据排列方式,确保最重要的两件事或连接在水平和垂直位置上。如果第三个变量对主要观点没有太多帮助,则不应使用气泡图,而应选择更简单的图表。
  • 处理负值:在气泡图中使用数据集不受任何特定指导方针的约束。因此,我们必须使用其他方法来显示负值。一种方法是对正数使用填充圆圈,对负数使用未填充的圆圈,另一种选择是对正数和负数使用不同的颜色。气泡图主要强调变化的大小和方向,因此可以有效地显示财务损失或绩效下降等重要数据。

Python示例

1990年/2015年世界主要国家的人均收入与人均寿命数据:

import pandas as pd
import plotly_express as px
df = pd.DataFrame([
    [28604, 77, 17096869, 'Australia', '1990'],[31163, 77.4, 27662440, 'Canada', '1990'],
    [1516, 68, 1154605773, 'China', '1990'],[13670, 74.7, 10582082, 'Cuba', '1990'],
    [28599, 75, 4986705, 'Finland', '1990'],[29476, 77.1, 56943299, 'France', '1990'],
    [31476, 75.4, 78958237, 'Germany', '1990'],[28666, 78.1, 254830, 'Iceland', '1990'],
    [1777, 57.7, 870601776, 'India', '1990'],[29550, 79.1, 122249285, 'Japan', '1990'],
    [2076, 67.9, 20194354, 'North Korea', '1990'],[12087, 72, 42972254, 'South Korea', '1990'],
    [24021, 75.4, 3397534, 'New Zealand', '1990'],[43296, 76.8, 4240375, 'Norway', '1990'],
    [10088, 70.8, 38195258, 'Poland', '1990'],[19349, 69.6, 147568552, 'Russia', '1990'],
    [10670, 67.3, 53994605, 'Turkey', '1990'],[26424, 75.7, 57110117, 'United Kingdom', '1990'],
    [37062, 75.4, 252847810, 'United States', '1990'],[44056, 81.8, 23968973, 'Australia', '2015'],
    [43294, 81.7, 35939927, 'Canada', '2015'],[13334, 76.9, 1376048943, 'China', '2015'],
    [21291, 78.5, 11389562, 'Cuba', '2015'],[38923, 80.8, 5503457, 'Finland', '2015'],
    [37599, 81.9, 64395345, 'France', '2015'],[44053, 81.1, 80688545, 'Germany', '2015'],
    [42182, 82.8, 329425, 'Iceland', '2015'],[5903, 66.8, 1311050527, 'India', '2015'],
    [36162, 83.5, 126573481, 'Japan', '2015'],[1390, 71.4, 25155317, 'North Korea', '2015'],
    [34644, 80.7, 50293439, 'South Korea', '2015'],[34186, 80.6, 4528526, 'New Zealand', '2015'],
    [64304, 81.6, 5210967, 'Norway', '2015'],[24787, 77.3, 38611794, 'Poland', '2015'],
    [23038, 73.13, 143456918, 'Russia', '2015'],[19360, 76.5, 78665830, 'Turkey', '2015'],
    [38225, 81.4, 64715810, 'United Kingdom', '2015'],[53354, 79.1, 321773631, 'United States', '2015']
  ])
df.columns=["Income","Life_Expectancy","Population","Country","Year"]


df

1990/2015年健康与财富世界地图(气泡图)

fig = px.scatter(df,
                 x="Income",
                 y="Life_Expectancy",
                 size="Population",
                 size_max=60,
                 color="Year",
                 hover_name="Country",
                 range_y=[50, 90],
                 labels={"Income": "人均收入(美元)",
                         "Life_Expectancy": "人均寿命"},
                 title="1990/2015年健康与财富世界地图(气泡图)",
                 opacity=1)
fig.update_xaxes(matches=None)


# Plot the figure
fig.show()

以上代码使用了 Plotly Express 库创建了一个散点图(scatter plot)。散点图显示了数据集 df 中的不同国家在 x 轴(收入)、y 轴(预期寿命)上的分布情况。散点的大小代表了该国家的人口数量,而颜色则代表了不同的年份。鼠标悬停在散点上时会显示该国家的名称。


介绍了气泡图的优点以及何时使用气泡图的指南。气泡图作为一种视觉化工具,有助于展示多个维度之间的关系,尤其适用于比较具有多个数据集的数据点。然而,在使用时需要注意调整气泡大小、限制数据点数量、提供清晰的标签和图例,并根据需要处理负值。最后,提供了一个1990年/2015年的健康与财富世界地图(气泡图)的Python示例。

相关文章

Python数据可视化工具画图(八)(气泡图)

概述在《Python数据可视化工具画图(七)(热力图)》中讲述了如何通过python画热力图,本文讲述如何通过python画气泡图。matplotlib安装方法:pip install matplot...

探索Plotly:Python中的强大交互式图表库

Python的开源图形库Plotly (一)plotly 是一个交互式、开源、基于浏览器的 Python 图形库。plotly 图形库可制作交互式、出版质量的图形。包括制作线图、散点图、面积图、条形图...

如何用Python实现冒泡排序算法

一、冒泡排序的原理简介冒泡排序(Bubble Sort)是一种简单的排序算法,其核心思想是通过不断比较相邻元素并交换位置,将较大的元素逐渐“浮”到数组的末尾,就像气泡上浮一样。它的主要特点:时间复杂度...

Python实现冒泡排序

''' 冒泡排序原理:比较列表中相邻的两个元素大小,如果第2个元素比第1个元素大,就交换它俩的位置,从列表的开始到结尾, 依次对每一组相邻的2个元素都进行比较,这样最大的元素就...

一文解读Python嵌套循环实现冒泡排序

冒泡排序是数据结构中的一种经典算法,手工地实现冒泡排序,对于锻炼自己的编程逻辑有很大的帮助,本节就带领大家用循环结构实现冒泡排序算法。冒泡排序算法的实现思想遵循以下几步:1、比较相邻的元素,如果第一个...