现在位置: 首页 > Highcharts 教程 > 正文

Highcharts 下钻柱形图

Highcharts 柱形图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

实例

<!DOCTYPE html>
<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:
        '&lt;b&gt;{point.name}&lt;/b&gt;&lt;br&gt;' +
        '市场份额:{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 柱形图Highcharts 柱形图