使用xlsxwriter合并图表时如何添加3个及以上数据系列?
xlsxwriter实现3个及以上数据系列组合图表的方案
常见操作误区说明
实际开发中遇到的两类操作报错,根源来自对xlsxwriter的combine()方法设计逻辑的偏差:
- 二次调用combine出现配置覆盖:本质是代码编写时混淆了combine的调用主体——
combine()方法的作用是把传入的图表对象追加合并到调用该方法的图表对象上,而非替换原有合并关系。很多人写合并逻辑时会错误地把第二次combine的调用主体换成第一次的子图(比如写chart_base.combine(chart_sub1)之后,又写chart_sub1.combine(chart_sub2)),最后插入工作表的还是最初的chart_base,导致chart_sub2的内容根本没被合并到最终展示的图表里,看起来就像是第二次操作覆盖了第一次的配置。 - 同时传入多个参数到combine方法报错:是因为该方法原生只支持接收单个图表对象作为入参,不支持多参数同时传入多个子图完成合并,必须逐次调用方法完成合并流程。
可落地的实现方式
方案1:单图表直接挂载多数据系列(推荐)
绝大多数需要展示3个及以上同维度数据的场景,完全不需要拆分多个独立图表再做合并操作。可以直接在同一个基础图表对象上,通过原生的add_series()方法添加全部数据系列,再根据展示需求给不同系列单独指定图表类型、关联坐标轴即可,不存在combine方法的调用问题。
核心实现代码示例:
# 创建基础图表,默认类型为柱状图 chart_main = workbook.add_chart({'type': 'column'}) # 依次添加3个以上需要展示的数据系列 chart_main.add_series({ 'name': '第一组数据', 'categories': '=工作表名!$A$2:$A$20', 'values': '=工作表名!$B$2:$B$20', }) chart_main.add_series({ 'name': '第二组数据', 'categories': '=工作表名!$A$2:$A$20', 'values': '=工作表名!$C$2:$C$20', }) chart_main.add_series({ 'name': '第三组数据', 'categories': '=工作表名!$A$2:$A$20', 'values': '=工作表名!$D$2:$D$20', # 单独给第三个系列设置为折线图类型,无需单独创建子图 'type': 'line', }) # 直接将配置完成的图表插入工作表即可 worksheet.insert_chart('F2', chart_main)
方案2:多独立子图逐次合并
如果场景中需要为不同数据系列配置独立的坐标轴、自定义样式,必须拆分多个独立子图时,固定一个主图表作为唯一的combine调用主体,逐次将需要合并的子图传入方法即可,不会出现配置覆盖:
核心实现代码示例:
# 固定主图表对象,全程不要更换调用主体 chart_base = workbook.add_chart({'type': 'column'}) # 给主图表添加自身的基础数据系列 chart_base.add_series({ 'name': '主图系列', 'categories': '=工作表名!$A$2:$A$20', 'values': '=工作表名!$B$2:$B$20', }) # 创建第一个需要合并的子图 chart_sub1 = workbook.add_chart({'type': 'line'}) chart_sub1.add_series({ 'name': '第一个合并系列', 'values': '=工作表名!$C$2:$C$20', }) # 第一次合并:主图对象调用combine传入第一个子图 chart_base.combine(chart_sub1) # 创建第二个需要合并的子图,可单独配置第二坐标轴 chart_sub2 = workbook.add_chart({'type': 'line', 'y2_axis': True}) chart_sub2.add_series({ 'name': '第二个合并系列', 'values': '=工作表名!$E$2:$E$20', }) # 第二次合并:仍然用之前固定的主图对象调用combine传入第二个子图,不会覆盖之前的合并配置 chart_base.combine(chart_sub2) # 插入最终合并完成的主图即可展示全部3个以上系列 worksheet.insert_chart('F2', chart_base)
合并过程中不要尝试将多个子图同时作为参数传入
combine()方法,该方法原生不支持多入参形式,逐次调用即可满足3个及以上数据系列的展示需求。
内容的提问来源于stack exchange,提问作者qshahryar
相关产品推荐
相关产品推荐

