Highcharts 下钻柱形图
下钻柱形图(Drilldown Column Chart)允许用户点击图表中的某个柱形,进一步查看该数据对应的详细信息。
例如,在浏览器市场份额统计图中,首先展示 Chrome、Firefox、Safari 等浏览器的总体份额,点击某个浏览器后,再展示不同版本的市场份额。
Highcharts 通过 drilldown 配置实现该功能,支持在不同数据层级之间切换。
配置
drilldown:向下钻取
drilldown 用于配置图表的下钻功能。
最基本的配置如下:
drilldown: {
series: drilldownSeries
}
其中,drilldownSeries 是包含下钻数据系列的数组。
要使用该功能,需要引入 Highcharts 主库和 Drilldown 模块:
<script src="https://code.highcharts.com/highcharts.js"></script> <script src="https://code.highcharts.com/modules/drilldown.js"></script>
父数据与下钻数据的关联
下钻图主要通过父数据点中的 drilldown 属性和下钻数据系列中的 id 进行关联。
例如:
series: [{
name: '浏览器',
data: [{
name: 'Chrome',
y: 40,
drilldown: 'chrome'
}]
}],
drilldown: {
series: [{
id: 'chrome',
name: 'Chrome 版本',
data: [
['Chrome 18', 25],
['Chrome 19', 15]
]
}]
}
在上面的配置中:
name表示数据点或数据系列名称。y表示数据点的数值。drilldown: 'chrome'指定点击后要显示的下钻系列。id: 'chrome'用于关联对应的父数据点。data包含下钻后展示的详细数据。
点击 Chrome 柱形后,Highcharts 会切换至 id 为 chrome 的下钻系列。
如果某个数据点没有下钻数据,可以省略 drilldown,或者将其设置为 null。
实例
下面通过浏览器市场份额数据,演示如何创建下钻柱形图。
图表首先按照浏览器品牌汇总数据,点击对应柱形后,展示不同浏览器版本的市场份额。
本例继续使用原教程中的历史浏览器版本数据。数据仅用于演示 Highcharts 的下钻功能,并非当前浏览器市场份额。
文件名:highcharts_column_drilldown.htm
实例
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<title>Highcharts 下钻柱形图 - 菜鸟教程</title>
<!-- Highcharts 主库 -->
<script src="https://code.highcharts.com/highcharts.js"></script>
<!-- 下钻模块 -->
<script src="https://code.highcharts.com/modules/drilldown.js"></script>
</head>
<body>
<div id="container"
style="width:100%;max-width:850px;height:450px;margin:0 auto;">
</div>
<script>
// 历史浏览器市场份额示例数据
// 格式:浏览器名称 市场份额
const rawData = `
Microsoft Internet Explorer 8.0 26.61%
Microsoft Internet Explorer 9.0 16.96%
Chrome 18.0 8.01%
Chrome 19.0 7.73%
Firefox 12 6.72%
Microsoft Internet Explorer 6.0 6.40%
Firefox 11 4.72%
Microsoft Internet Explorer 7.0 3.55%
Safari 5.1 3.53%
Firefox 13 2.16%
Firefox 3.6 1.87%
Opera 11.x 1.30%
Chrome 17.0 1.13%
Firefox 10 0.90%
Safari 5.0 0.85%
Firefox 9.0 0.65%
Firefox 8.0 0.55%
Firefox 4.0 0.50%
Chrome 16.0 0.45%
Firefox 3.0 0.36%
Firefox 3.5 0.36%
Firefox 6.0 0.32%
Firefox 5.0 0.31%
Firefox 7.0 0.29%
Proprietary or Undetectable 0.29%
Chrome 18.0 - Maxthon Edition 0.26%
Chrome 14.0 0.25%
Chrome 20.0 0.24%
Chrome 15.0 0.18%
Chrome 12.0 0.16%
Opera 12.x 0.15%
Safari 4.0 0.14%
Chrome 13.0 0.13%
Safari 4.1 0.12%
Chrome 11.0 0.10%
Firefox 14 0.10%
Firefox 2.0 0.09%
Chrome 10.0 0.09%
Opera 10.x 0.09%
Microsoft Internet Explorer 8.0 - Tencent Traveler Edition 0.09%
`;
// 浏览器分类
const browserNames = [
'Microsoft Internet Explorer',
'Chrome',
'Firefox',
'Safari',
'Opera'
];
const brands = {};
const versions = {};
// 解析原始数据
rawData.trim().split('\n').forEach(line => {
// 提取名称与末尾的百分比
const match = line.trim().match(
/^(.+?)\s+(\d+(?:\.\d+)?)%$/
);
if (!match) {
return;
}
const fullName = match[1];
const share = parseFloat(match[2]);
// 查找浏览器品牌
const brand = browserNames.find(name =>
fullName.startsWith(name + ' ')
) || '其他';
// 提取版本信息,保留特殊版本名称
let versionName = fullName;
if (brand !== '其他') {
versionName = fullName
.slice(brand.length)
.trim();
}
// 累加品牌份额
if (!brands[brand]) {
brands[brand] = 0;
versions[brand] = [];
}
brands[brand] += share;
// 保存版本明细
versions[brand].push([
versionName,
share
]);
});
// 转换为 Highcharts 主数据
const brandsData = Object.keys(brands).map(brand => ({
name: brand,
y: Number(brands[brand].toFixed(2)),
drilldown: brand
}));
// 按份额从高到低排列
brandsData.sort((a, b) => b.y - a.y);
// 生成下钻数据系列
const drilldownSeries = Object.keys(versions).map(brand => ({
id: brand,
name: brand + ' 版本',
type: 'column',
data: versions[brand].sort((a, b) => b[1] - a[1])
}));
// 创建图表
Highcharts.chart('container', {
chart: {
type: 'column'
},
title: {
text: '浏览器市场份额(历史示例数据)'
},
subtitle: {
text: '点击柱形查看各浏览器版本的份额'
},
xAxis: {
type: 'category'
},
yAxis: {
title: {
text: '市场份额 (%)'
},
min: 0
},
legend: {
enabled: false
},
tooltip: {
headerFormat: '',
pointFormat:
'<b>{point.name}</b><br>' +
'市场份额:{point.y:.2f}%'
},
plotOptions: {
column: {
borderRadius: 3
}
},
series: [{
name: '浏览器品牌',
colorByPoint: true,
data: brandsData
}],
drilldown: {
breadcrumbs: {
position: {
align: 'right'
}
},
series: drilldownSeries
},
credits: {
enabled: false
}
});
</script>
</body>
</html>
说明:本例不再依赖 jQuery,而是直接使用 Highcharts.chart() 创建图表。数据由 JavaScript 解析并按浏览器品牌自动汇总。
示例数据中的一些记录包含第三方定制版本,例如 Maxthon Edition 和 Tencent Traveler Edition。这里按照原数据中标注的浏览器系列进行归类,并保留版本名称,以便演示明细下钻。
由于原始数据只包含部分历史浏览器版本,所有柱形数值应理解为这些示例记录汇总后的份额,而不是完整市场统计的重新计算结果。
下方为原有在线演示:
注意:上面的"尝试一下"和 iframe 保留了原有演示文件地址。如果需要它们运行本次修订后的版本,还需要将新版 HTML 同步更新到对应的 highcharts_column_drilldown.htm 演示文件中。
代码说明
1、设置柱形图类型
通过 chart.type 指定图表类型为 column:
chart: {
type: 'column'
}
如果需要将柱形图改成条形图,可以将 column 修改为 bar。
2、配置主数据系列
主数据系列使用 series 定义:
series: [{
name: '浏览器品牌',
colorByPoint: true,
data: brandsData
}]
其中:
name:数据系列名称。colorByPoint:为不同数据点分配不同颜色。data:主要显示的数据。
每个支持下钻的数据点需要设置 drilldown 属性,使其与下钻数据系列关联。
3、配置下钻数据
下钻数据通过 drilldown.series 定义:
drilldown: {
series: [{
id: 'Chrome',
name: 'Chrome 版本',
data: [
['18.0', 8.01],
['19.0', 7.73],
['17.0', 1.13]
]
}]
}
当用户点击与 Chrome 对应的父数据点时,图表就会显示相应的版本数据。
注意:上面的三项数据只是从完整示例中抽取的部分记录,用于说明配置格式。
4、配置下钻导航
Highcharts 支持使用面包屑导航返回上一级数据。
可以通过 drilldown.breadcrumbs 调整导航位置:
drilldown: {
breadcrumbs: {
position: {
align: 'right'
}
},
series: drilldownSeries
}
下钻后,用户可以点击导航返回父级图表。
5、配置提示信息
通过 tooltip 可以设置鼠标悬停时显示的内容。
tooltip: {
headerFormat: '',
pointFormat:
'<b>{point.name}</b><br>' +
'市场份额:{point.y:.2f}%'
}
其中,{point.name} 表示当前数据点名称,{point.y:.2f} 表示保留两位小数的数值。
常见问题
1、点击柱形后没有进入下一级?
首先检查是否加载了 modules/drilldown.js 模块。
其次检查父数据点中的 drilldown 值,是否与 drilldown.series 中某个系列的 id 完全一致。
2、可以实现多级下钻吗?
可以。Highcharts 支持多级下钻。
只需要在下一级数据点中继续设置 drilldown,并为对应的下一级数据系列提供匹配的 id。
3、下钻数据必须提前加载吗?
不一定。
对于数据量较小的图表,可以在初始化时通过 drilldown.series 提供全部明细数据。
如果数据量较大,也可以监听 drilldown 事件,根据点击的数据点动态请求服务器,再使用 chart.addSeriesAsDrilldown() 加载明细。参考官方 API。
4、下钻柱形图与堆叠柱形图有什么区别?
下钻柱形图侧重不同层级数据之间的切换;堆叠柱形图侧重在同一根柱子中展示多个系列的组成。
如果需要实现堆叠柱形图,应使用 plotOptions.column.stacking 等相关配置,而不是仅添加 drilldown。

Highcharts 柱形图