Highcharts 双Y轴, 柱形图,线条图组合(超详细)

更新时间:

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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 双Y轴、柱形图与线条图组合的图表形式,能有效解决单一坐标轴的局限性。例如,企业可能需要同时观察销售额(单位:万元)与利润率(百分比),或分析温度(摄氏度)与降水量(毫米)的季节变化。本文将从零开始,逐步讲解如何用 Highcharts 实现这一组合图表,帮助开发者快速掌握核心逻辑与实践技巧。


基础概念与原理

双Y轴的必要性

双Y轴的核心作用是 “分离不同量纲的数据”。想象一个场景:某公司销售团队需要同时展示月销售额(数值范围 100,000 至 500,000 元)和客户满意度(百分比 0% 至 100%)。若两者共用一个Y轴,客户满意度的波动会被销售额的绝对值“淹没”。双Y轴如同在图表两侧放置两把“不同刻度的尺子”,让数据对比更清晰。

柱形图与线条图的互补性

柱形图擅长展示离散数据的总量(如月度销售额),而线条图适合表现连续数据的趋势(如利润率变化)。两者的组合,如同用“柱子”标记关键节点,用“线条”勾勒整体走向,形成“量”与“势”的双重表达。


实战步骤:从零搭建双Y轴图表

步骤1:环境准备

在 HTML 文件中引入 Highcharts 的核心库:

<script src="https://code.highcharts.com/highcharts.js"></script>

步骤2:基础 HTML 结构

创建一个容器元素,用于承载图表:

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

步骤3:配置双Y轴的核心代码

以下是完整的 Highcharts 配置代码示例:

Highcharts.chart('container', {  
    chart: {  
        type: 'column'  // 默认图表类型为柱形图  
    },  
    title: {  
        text: '销售额与利润率分析'  
    },  
    xAxis: {  
        categories: ['一月', '二月', '三月', '四月', '五月']  // X轴分类标签  
    },  
    yAxis: [{  // 第一个Y轴(左轴)  
        title: {  
            text: '销售额(万元)'  
        },  
        labels: {  
            format: '{value}万'  // 格式化标签显示  
        }  
    }, {  // 第二个Y轴(右轴)  
        title: {  
            text: '利润率(%)'  
        },  
        opposite: true,  // 设置为右侧显示  
        labels: {  
            format: '{value}%'  
        }  
    }],  
    series: [{  // 第一个数据系列(柱形图,绑定左轴)  
        name: '销售额',  
        type: 'column',  
        data: [120, 150, 180, 140, 200],  
        yAxis: 0  // 指定使用第一个Y轴  
    }, {  // 第二个数据系列(线条图,绑定右轴)  
        name: '利润率',  
        type: 'spline',  // 线条图类型  
        data: [25, 30, 28, 35, 40],  
        yAxis: 1  // 指定使用第二个Y轴  
    }]  
});  

关键配置项详解

1. yAxis 数组的结构

Highcharts 的双Y轴通过 yAxis 数组实现。第一个元素(索引 0)对应左侧轴,第二个元素(索引 1)对应右侧轴。每个轴的 opposite 属性控制其位置:

yAxis: [{  
    ...左侧轴配置  
}, {  
    opposite: true,  // 右侧轴  
    ...右侧轴配置  
}]  

2. 系列(Series)的绑定逻辑

每个数据系列通过 yAxis 属性指定其绑定的轴。例如:

series: [{  
    yAxis: 0,  // 绑定左侧轴  
}, {  
    yAxis: 1   // 绑定右侧轴  
}]  

3. 数据格式与类型选择

  • 柱形图数据:以数组形式直接提供数值,如 [120, 150, 180]
  • 线条图数据:同样为数值数组,但需注意数据点需与 X轴的分类一一对应。
  • 类型切换:通过 type 属性定义图表类型:
    • column:柱形图
    • spline:平滑线条图
    • line:直线图

实际案例:气象数据分析

案例背景

假设需要展示某城市一年内每月的平均气温(℃)与降水量(毫米):
| 月份 | 气温(℃) | 降水量(mm) |
|--------|------------|--------------|
| 一月 | -5 | 20 |
| 二月 | 0 | 25 |
| 三月 | 8 | 40 |
| 四月 | 15 | 55 |
| 五月 | 22 | 80 |

完整代码实现

Highcharts.chart('weather-container', {  
    chart: {  
        type: 'column'  
    },  
    title: {  
        text: '某城市气候数据'  
    },  
    xAxis: {  
        categories: ['一月', '二月', '三月', '四月', '五月']  
    },  
    yAxis: [{  
        title: { text: '气温(℃)' },  
        labels: { format: '{value}℃' },  
        min: -10  // 设置Y轴起始值  
    }, {  
        title: { text: '降水量(mm)' },  
        opposite: true,  
        labels: { format: '{value}mm' },  
        min: 0  
    }],  
    series: [{  
        name: '气温',  
        type: 'spline',  
        data: [-5, 0, 8, 15, 22],  
        yAxis: 0,  
        color: '#058DC7'  // 蓝色线条  
    }, {  
        name: '降水量',  
        type: 'column',  
        data: [20, 25, 40, 55, 80],  
        yAxis: 1,  
        color: '#50B432'  // 绿色柱形  
    }]  
});  

效果解析

  • 左侧轴:展示气温的波动,范围从 -10℃ 到 25℃,用蓝色线条图体现趋势。
  • 右侧轴:展示降水量,以绿色柱形突出各月的降水总量。
  • 交互功能:鼠标悬停时,会同时显示两个数据系列的值,便于对比。

进阶技巧与常见问题

技巧1:自定义轴样式

通过 lineWidthlineColortickLength 调整轴的外观:

yAxis: [{  
    lineWidth: 2,  
    lineColor: '#FF0000',  
    tickLength: 5  // 刻度线长度  
}, {  
    // 右轴配置  
}]  

技巧2:动态数据绑定

若需实时更新数据(如从 API 获取),可修改 series.data 后调用 chart.redraw()

// 假设 data1 和 data2 是新获取的数据  
chart.series[0].setData(data1);  
chart.series[1].setData(data2);  
chart.redraw();  

常见问题:轴标签重叠

当双Y轴的标签过长时,可通过 labels.xlabels.y 调整位置,或启用 tickInterval 控制刻度间隔:

yAxis: [{  
    labels: {  
        x: -10,  // 向左偏移10像素,避免重叠  
        y: 5  
    },  
    tickInterval: 10  // 每10个单位显示一个标签  
}]  

总结

通过本文的讲解,开发者可以掌握 Highcharts 双Y轴、柱形图与线条图组合 的核心配置逻辑,并通过实际案例理解如何将不同数据类型可视化。这种图表形式在商业分析、气象预测等领域具有广泛的应用价值。建议读者在实践时,逐步调整颜色、字体和交互效果,让图表既专业又具可读性。掌握这些技能后,可进一步探索 Highcharts 的 3D 效果、导出功能或与后端框架(如 React、Vue)的集成,拓展数据可视化的边界。

最新发布