logo

G2

  • 文档
  • 图表介绍
  • API
  • 图表示例
  • 主题
  • 周边生态
  • 所有产品antv logo arrow
  • 5.3.3
  • 📈 图表分类
  • 马赛克图
  • 堆叠柱状图
  • 分组柱状图
  • 气泡图
  • 色块图
  • 玉珏图
  • 直方图
  • 柱状图
  • 带气泡的地图
  • 雷达图
  • 面积图
  • 箱形图
  • 双向柱状图
  • 环图
  • 热力图
  • 分级统计地图
  • 漏斗图
  • K线图
  • 仪表盘
  • 等高线图
  • 桑基图
  • 子弹图
  • 和弦图

气泡图

上一篇
分组柱状图
下一篇
色块图

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

bubble

气泡图的简介

气泡图是一种多变量图表,是散点图的变体,也可以认为是散点图和百分比区域图的组合。

气泡图最基本的用法是使用三个值来确定每个数据序列,和散点图一样,气泡图将两个维度的数据值分别映射为笛卡尔坐标系上的坐标点,其中 X 和 Y 轴分别代表不同的两个维度的数据,但是不同于散点图的是,气泡图的每个气泡都有分类信息(他们显示在点旁边或者作为图例)。每一个气泡的面积代表第三个数值数据。另外还可以使用不同的颜色来区分分类数据或者其他的数值数据,或者使用亮度或者透明度。表示时间维度的数据时,可以将时间维度作为直角坐标系中的一个维度,或者结合动画来表现数据随着时间的变化情况。

气泡图通常用于比较和展示不同类别圆点(这里我们称为气泡)之间的关系,通过气泡的位置以及面积大小。从整体上看,气泡图可用于分析数据之间的相关性。

需要注意的是,气泡图的数据大小容量有限,气泡太多会使图表难以阅读。但是可以通过增加一些交互行为弥补:隐藏一些信息,当鼠标点击或者悬浮时显示,或者添加一个选项用于重组或者过滤分组类别。

另外,气泡的大小是映射到面积而不是半径或者直径绘制的。因为如果是基于半径或者直径的话,圆的大小不仅会呈指数级变化,而且还会导致视觉误差。

英文名:Bubble Chart

气泡图的构成

基础气泡图

bubble-basic
图表类型基础气泡图
适合的数据多维度数据:至少两个连续型数据字段(X、Y轴)和一个数值型数据字段(气泡大小)
功能展示多个变量之间的关系,发现数据模式和相关性
数据与图形的映射两个连续变量映射到XY坐标
第三个变量映射到气泡的大小
可选的分类型变量映射到气泡的颜色或形状
适合的数据条数通常不超过100个数据点,过多会导致图表拥挤
视觉设计建议使用半透明气泡避免重叠遮挡
气泡大小范围应适中,避免过大或过小
添加网格线辅助阅读坐标值

对数气泡图

bubble-log
图表类型对数气泡图
适合的数据数值范围差异极大的数据集,需要对数变换来展示
功能处理数据跨度很大的情况,如人口数据、GDP数据等
数据与图形的映射与基础气泡图相同,但采用对数比例尺
两个连续变量映射到XY坐标
第三个变量通过对数映射到气泡的大小
使用场景当数据出现指数增长或数值范围跨越多个数量级时
实现方法使用scale: { size: { type: 'log', range: [4, 20] } }配置对数比例尺
注意事项应在图例或标签中明确指出使用了对数变换,避免误导读者

气泡图的应用场景

适合的场景

气泡图最适合用于以下几类场景:

  1. 多维数据分析 - 当需要同时分析三个或更多变量之间的关系
  2. 比较特征聚类 - 发现数据中的分组模式和异常值
  3. 资源分配可视化 - 展示多维度指标下的资源分布
  4. 风险与机会分析 - 同时考虑多个因素的决策辅助

示例 1: 经济与人口健康指标分析

下图展示了不同国家人均GDP、预期寿命与人口数量的关系,同时用颜色区分了不同大洲,有效地在一个图表中展现了四个维度的数据。

country(国家)GDP(人均GDP)lifeExpectancy(预期寿命)population(人口)continent(大洲)
China1254776.91403500365Asia
United States5953278.5321773631Americas
India642768.31324517249Asia
Japan3842883.9127141000Asia
Germany4613681.082695000Europe
...............

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
});
chart.options({
type: 'point',
autoFit: true,
data: {
type: 'fetch',
value: 'https://gw.alipayobjects.com/os/antvdemo/assets/data/bubble.json',
},
encode: {
x: 'GDP',
y: 'LifeExpectancy',
size: 'Population',
color: 'continent',
shape: 'point'
},
scale: {
size: { type: 'log', range: [4, 20] }
},
style: {
fillOpacity: 0.3,
lineWidth: 1
},
legend: {
size: false
}
});
chart.render();

分析 :

  • GDP 字段映射到 X 轴,表示国家人均GDP,可以看出发达国家集中在右侧
  • LifeExpectancy 字段映射到 Y 轴,表示国民预期寿命,能够观察到人均GDP与预期寿命有正相关性
  • Population 字段映射到气泡大小,通过对数比例尺处理,使得中国、印度等人口大国清晰可见
  • continent 字段映射到颜色,可以看出不同大洲国家的聚类分布

洞察:通过此图,我们可以直观地观察到:

  1. 经济水平与健康水平的正相关关系
  2. 人口规模与经济发展之间并无必然联系
  3. 不同大洲国家的发展模式存在差异

不适合的场景

例子 1: 数据点过多或气泡重叠过度

当数据点超过100个或气泡严重重叠时,气泡图可能变得混乱难以阅读。在这种情况下,可以考虑使用热力图或分面图表。

以下是一个包含大量数据点的气泡图示例,可以看到随着数据点的增加,气泡之间的重叠让图表变得难以解读:

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
});
// 生成200个随机数据点
const data = Array.from({ length: 200 }, () => ({
x: Math.random() * 100,
y: Math.random() * 100,
size: Math.random() * 20 + 5,
category: ['A', 'B', 'C', 'D'][Math.floor(Math.random() * 4)]
}));
chart.options({
type: 'point',
autoFit: true,
data,
encode: {
x: 'x',
y: 'y',
size: 'size',
color: 'category'
},
style: {
fillOpacity: 0.3,
lineWidth: 1
},
});
chart.render();

例子 2: 只有两个变量需要比较

当只需比较两个变量之间的关系时,散点图比气泡图更简洁有效。气泡图的第三个变量(气泡大小)如果没有必要,反而会增加认知负担。

例子 3: 展示趋势变化的时序数据

气泡图不适合展示时序趋势数据。对于需要展示随时间变化趋势的数据,折线图或面积图是更好的选择。

下面是一个不使用气泡图而使用折线图展示时序数据的例子:

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
});
chart.options({
type: 'view',
autoFit: true,
data: [
{ day: '2015/9/1', share: 10, volume: 1200 },
{ day: '2015/9/5', share: 20, volume: 2100 },
{ day: '2015/9/10', share: 32, volume: 3400 },
{ day: '2015/9/15', share: 45, volume: 2900 },
{ day: '2015/9/20', share: 51, volume: 4100 },
{ day: '2015/9/25', share: 45, volume: 3800 },
{ day: '2015/9/30', share: 40, volume: 2700 },
],
encode: { x: 'day', y: 'share' },
axis: {
y: {
title: '股价',
},
x: {
title: '日期',
},
},
children: [
{
type: 'line',
style: {
lineWidth: 3,
},
},
],
});
chart.render();

如果确实需要在时序数据中加入第三个维度的信息,可以使用带有大小编码的时间序列气泡图:

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
});
chart.options({
type: 'point',
autoFit: true,
data: [
{ day: '2015/9/1', share: 10, volume: 1200 },
{ day: '2015/9/5', share: 20, volume: 2100 },
{ day: '2015/9/10', share: 32, volume: 3400 },
{ day: '2015/9/15', share: 45, volume: 2900 },
{ day: '2015/9/20', share: 51, volume: 4100 },
{ day: '2015/9/25', share: 45, volume: 3800 },
{ day: '2015/9/30', share: 40, volume: 2700 },
],
encode: {
x: 'day',
y: 'share',
size: 'volume'
},
scale: {
size: { range: [10, 40] }
},
style: {
fillOpacity: 0.6,
stroke: '#1890ff',
fill: '#1890ff'
},
axis: {
y: { title: '股价' },
x: { title: '日期' }
},
annotations: [
{
type: 'line',
data: [
{ day: '2015/9/1', share: 10 },
{ day: '2015/9/5', share: 20 },
{ day: '2015/9/10', share: 32 },
{ day: '2015/9/15', share: 45 },
{ day: '2015/9/20', share: 51 },
{ day: '2015/9/25', share: 45 },
{ day: '2015/9/30', share: 40 },
],
encode: { x: 'day', y: 'share' },
style: { stroke: '#1890ff', lineWidth: 2 }
}
]
});
chart.render();

气泡图与其他图表的对比

气泡图和散点图、热力图

图表类型主要特点适用场景数据维度
气泡图通过点的大小编码额外维度多变量关系分析3-4个变量(X、Y、大小、颜色)
散点图仅展示点的位置二维相关性分析2-3个变量(X、Y、颜色)
热力图通过颜色深浅展示密度或量值展示分布密度3个变量(X、Y、颜色强度)

气泡图和散点地图、气泡地图

图表类型坐标系统数据约束应用场景
气泡图抽象坐标系可使用任意数值作为XY坐标多维数据关系可视化
气泡地图地理坐标系点位置受地理坐标约束地理数据中多变量分析
散点地图地理坐标系点位置受地理坐标约束地理位置的简单分布

气泡图最佳实践

设计建议

  1. 气泡大小选择

    • 设置合适的气泡大小范围,避免过大导致重叠,或过小导致难以辨认
    • 使用半透明填充色,降低重叠区域的视觉干扰
  2. 数据处理

    • 当气泡大小差异过大时,考虑使用对数比例尺
    • 适当筛选数据,避免图表过于拥挤
  3. 标签和交互

    • 添加悬停交互,显示详细数据信息
    • 对重要数据点添加标签,但避免标签过多造成混乱

代码示例:添加悬停交互的气泡图

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
});
chart.options({
type: 'point',
autoFit: true,
data: [
{ x: 10, y: 20, size: 20, category: 'A', name: '项目1' },
{ x: 20, y: 40, size: 35, category: 'A', name: '项目2' },
{ x: 30, y: 30, size: 15, category: 'B', name: '项目3' },
{ x: 40, y: 60, size: 40, category: 'B', name: '项目4' },
{ x: 50, y: 50, size: 25, category: 'C', name: '项目5' },
],
encode: {
x: 'x',
y: 'y',
size: 'size',
color: 'category',
shape: 'point'
},
style: {
fillOpacity: 0.6,
lineWidth: 1
},
tooltip: {
items: [
{ field: 'name', name: '项目名称' },
{ field: 'x', name: 'X值' },
{ field: 'y', name: 'Y值' },
{ field: 'size', name: '大小' },
]
},
interaction: [
{ type: 'tooltip' },
{ type: 'elementHighlight' }
]
});
chart.render();

相似图表

带气泡的地图
带气泡的地图
比较类

分类

关系类
分布类