Highcharts 堆叠条形图(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据可视化领域,Highcharts 堆叠条形图是一种直观展示多维度数据关系的工具。它通过将不同数据系列“堆叠”在同一坐标轴上,既能体现各部分的独立数值,又能清晰显示整体趋势。无论是分析销售数据、资源分配,还是对比时间序列变化,堆叠条形图都能帮助开发者快速传达复杂信息。本文将从零开始,逐步讲解如何使用 Highcharts 实现这一图表类型,并通过案例演示和代码示例,帮助读者掌握其核心技巧。


堆叠条形图的核心概念

什么是堆叠条形图?

堆叠条形图(Stacked Bar Chart)是一种基于条形图的扩展形式。它通过将多个数据系列的值沿同一轴向“堆叠”展示,形成一条条“组合条”。例如,假设我们要分析某公司各季度的销售额,其中包含线上、线下和海外三个渠道,堆叠条形图可以将这三个渠道的销售额叠加在同一季度的条形中,既显示每个渠道的具体数值,又总和显示该季度的总销售额。

类比解释
想象将不同颜色的乐高积木堆叠成一座塔,每个积木代表一个数据系列,塔的高度则代表总和。这就是堆叠条形图的直观表现形式。

与普通条形图的区别

普通条形图将不同系列的条形并列显示,适合对比独立数据;而堆叠条形图通过叠加展示,更适用于分析数据的构成和整体趋势。例如:

  • 普通条形图:适合比较不同产品在同期的销量。
  • 堆叠条形图:适合分析同一产品在不同地区的销量占比,并观察总销量的变化。

配置 Highcharts 堆叠条形图的步骤

第一步:引入 Highcharts 库

在 HTML 文件中通过 CDN 引入 Highcharts 和堆叠条形图插件:

<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>

第二步:初始化图表容器

在 HTML 中添加一个用于渲染图表的 div 容器:

<div id="container" style="width: 100%; height: 400px;"></div>

第三步:配置图表选项

1. 设置堆叠类型

plotOptions 中启用 stacking 属性,可选值为 normal(默认)或 percent(百分比堆叠):

plotOptions: {
    series: {
        stacking: 'normal' // 或 'percent'
    }
}

2. 配置坐标轴

设置 x 轴为分类类型,y 轴为数值类型:

xAxis: {
    categories: ['Q1', 'Q2', 'Q3', 'Q4']
},
yAxis: {
    min: 0,
    title: {
        text: '销售额(万元)'
    }
}

3. 添加数据系列

每个数据系列代表一个堆叠层,需指定 namedata

series: [{
    name: '线上渠道',
    data: [120, 150, 180, 200]
}, {
    name: '线下渠道',
    data: [80, 100, 120, 140]
}, {
    name: '海外渠道',
    data: [30, 40, 50, 60]
}]

完整示例代码

Highcharts.chart('container', {
    chart: {
        type: 'bar' // 设置为条形图
    },
    title: {
        text: '2023年各季度销售额分布'
    },
    xAxis: {
        categories: ['Q1', 'Q2', 'Q3', 'Q4']
    },
    yAxis: {
        min: 0,
        title: {
            text: '销售额(万元)'
        }
    },
    plotOptions: {
        series: {
            stacking: 'normal'
        }
    },
    series: [{
        name: '线上渠道',
        data: [120, 150, 180, 200]
    }, {
        name: '线下渠道',
        data: [80, 100, 120, 140]
    }, {
        name: '海外渠道',
        data: [30, 40, 50, 60]
    }]
});

实战案例:分析用户行为数据

案例背景

假设我们需展示某网站用户在不同时间段的活跃度,分为“浏览”“下单”“支付”三个阶段。目标是观察各阶段的用户数量变化及其总和。

步骤分解

1. 准备数据

const categories = ['上午', '下午', '晚上', '深夜'];
const browsing = [200, 300, 450, 150];
const ordering = [50, 80, 120, 30];
const payment = [30, 60, 90, 15];

2. 配置图表

Highcharts.chart('container', {
    chart: {
        type: 'bar',
        height: 600
    },
    title: {
        text: '用户活跃阶段分布'
    },
    xAxis: {
        categories: categories
    },
    yAxis: {
        min: 0,
        title: {
            text: '用户数量'
        }
    },
    plotOptions: {
        series: {
            stacking: 'normal'
        }
    },
    series: [{
        name: '浏览',
        data: browsing,
        color: '#2b908f'
    }, {
        name: '下单',
        data: ordering,
        color: '#90ee7e'
    }, {
        name: '支付',
        data: payment,
        color: '#f45b5b'
    }]
});

3. 效果展示

  • 每个时间段的条形由三部分堆叠,总高度代表总用户数。
  • 不同颜色区分阶段,通过图例可快速关联数据。

高级技巧与优化

1. 动态数据更新

通过 Highcharts.series.update() 实现数据实时刷新:

// 每 2 秒更新一次“支付”系列的数据
setInterval(() => {
    const paymentSeries = chart.series[2];
    const newData = paymentSeries.data.map(point => point.y + Math.random() * 10);
    paymentSeries.update({
        data: newData
    });
}, 2000);

2. 响应式设计

使用 responsive 属性适配不同屏幕尺寸:

responsive: {
    rules: [{
        condition: {
            maxWidth: 600
        },
        chartOptions: {
            yAxis: {
                title: {
                    text: ''
                }
            },
            legend: {
                align: 'center',
                verticalAlign: 'bottom'
            }
        }
    }]
}

3. 自定义标签与提示框

通过 dataLabelstooltip 配置更清晰的交互:

plotOptions: {
    series: {
        dataLabels: {
            enabled: true,
            format: '{point.y}' // 显示具体数值
        }
    }
},
tooltip: {
    shared: true,
    formatter: function() {
        return `${this.x}时段:<br/>浏览:${this.points[0].y}<br/>下单:${this.points[1].y}<br/>支付:${this.points[2].y}`;
    }
}

常见问题与解决方案

问题 1:堆叠效果未生效

原因:未在 plotOptions 中设置 stacking 属性。
解决:检查配置代码,确保:

plotOptions: {
    series: {
        stacking: 'normal' // 或 'percent'
    }
}

问题 2:图表尺寸异常

原因:容器 div 的样式未指定宽度和高度。
解决

<div id="container" style="width: 800px; height: 400px;"></div>

问题 3:数据标签重叠

原因:数据值过小或堆叠层数过多导致标签拥挤。
解决

  • 减少 yAxis.min 的值以扩展垂直空间;
  • 使用 dataLabels.overflow: 'allow' 或调整字体大小。

结论

Highcharts 堆叠条形图凭借其直观性与灵活性,已成为数据可视化领域的常用工具。通过本文的分步讲解,读者不仅掌握了基础配置方法,还学习了动态交互、响应式设计等高级技巧。无论是分析销售趋势、资源分配,还是用户行为,堆叠条形图都能帮助开发者快速提炼数据价值。

下一步,读者可以尝试将案例扩展为百分比堆叠图(stacking: 'percent'),或结合 Highcharts 的其他图表类型(如折线图、饼图)构建复合图表。通过实践与探索,您将更熟练地运用 Highcharts 实现专业的数据可视化方案。

最新发布