Pyecharts之双轴图表的魅力

server/2025/2/1 1:33:54/

在数据可视化的实践中,我们经常会遇到这样的情景:希望在一张图中展示不同量纲的数据,以便进行对比与关联分析。这时,双轴图表(双 Y 轴或双 X 轴)便可派上用场。通过 Pyecharts,我们可以轻松创建多轴图表,从而在同一个可视化中同时展示多种维度的信息。

本篇文章将以三个典型的双轴图表示例为基础,为您展示从代码到效果的实现思路:

  1. 双 Y 轴直方图与折线图组合
  2. 双 Y 轴直方图单独应用
  3. 双 X 轴折线图实现

一、双 Y 轴直方图与折线图组合

在同一张图中同时展示柱状图和折线图并为它们配备两个 Y 轴,可以清晰地对比两组不同量纲的数据。例如,我们希望在同一图上展示“销售量”(柱状图,左侧 Y 轴)与“销售增长率”(折线图,右侧 Y 轴)的关系。

代码示例:

python"># 导入所需的库
from pyecharts.charts import Bar, Line, Grid
from pyecharts import options as opts# 创建一个 Bar 实例 (销售量)
bar = Bar()
bar.add_xaxis(['产品 A', '产品 B', '产品 C', '产品 D'])
bar.add_yaxis('销售量', [120, 200, 150, 80], yaxis_index=0, itemstyle_opts=opts.ItemStyleOpts(color="#1f77b4")  # 蓝色
)
bar.set_global_opts(title_opts=opts.TitleOpts(title="双 Y 轴直方图与折线图组合"),tooltip_opts=opts.TooltipOpts(trigger="axis"),yaxis_opts=opts.AxisOpts(name="销售量",type_="value",position="left",axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#1f77b4")))
)# 创建一个 Line 实例 (销售增长率)
line = Line()
line.add_xaxis(['产品 A', '产品 B', '产品 C', '产品 D'])
line.add_yaxis('销售增长率', [30, 40, 35, 20], yaxis_index=1, linestyle_opts=opts.LineStyleOpts(width=4, color="#ff7f0e")  # 橙色
)
line.set_global_opts(yaxis_opts=opts.AxisOpts(name="销售增长率",type_="value",position="right",axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#ff7f0e")))
)# 使用 Grid 将 Bar 与 Line 叠加
grid = Grid()
grid.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))  # 柱状图下半部分
grid.add(line, grid_opts=opts.GridOpts(pos_top="60%"))    # 折线图上半部分grid.render_notebook()

实现思路

  • 使用 Bar 展示销售量数据,并将其 Y 轴放在左侧。
  • 使用 Line 展示销售增长率数据,并将其 Y 轴放在右侧(yaxis_index=1)。
  • 通过 Grid 对象将两张图进行上下叠加,从而在同一画布中同时展现。

通过这种方式,我们可以在一张图上直接看到销售量与增长率的对比,更有利于分析数据间的关系。

二、双 Y 轴直方图单独应用

当我们仅需要展示两组不同量纲的柱状数据(例如销售量与库存量),也可以使用双 Y 轴的方式将它们放在同一图表中。这样,我们可以在一个图表中直观地比较两种数据间的关系和趋势。

代码示例:

python">from pyecharts.charts import *
from pyecharts import options as opts
import randomx_data = ['香蕉', '梨子', '水蜜桃', '核桃', '西瓜', '苹果']
y_data_1 = [random.randint(10, 50) for _ in range(len(x_data))]
y_data_2 = [random.randint(100, 500) for _ in range(len(x_data))]def bar_with_multiple_axis():bar = Bar(init_opts=opts.InitOpts(theme='light', width='1000px', height='600px'))bar.add_xaxis(x_data)# 使用 extend_axis 为图表添加第二个 Y 轴bar.extend_axis(yaxis=opts.AxisOpts())# 添加两组数据,分别关联到不同的 Y 轴上bar.add_yaxis('左边Y轴', y_data_1, yaxis_index=0)bar.add_yaxis('右边Y轴', y_data_2, yaxis_index=1)return barchart = bar_with_multiple_axis()
chart.render_notebook()

实现思路

  • 使用 Bar 创建柱状图并加载主数据系列(与左侧 Y 轴关联)。
  • 通过 extend_axis() 增加第二个 Y 轴,然后将第二组数据与 yaxis_index=1 关联。
  • 两组数据的量纲不同,却能在一张图上清晰地展示,为比较它们间的关系提供了直观的手段。

三、双 X 轴折线图实现

有时,我们需要在同一图表中对比不同类别或时间点的数据,可能需要在上下两个 X 轴上分别展示不同数据维度。双 X 轴折线图即为此而生。

代码示例:

python">from pyecharts.charts import *
from pyecharts import options as opts
import randomx_data_1 = ["2020/10/{}".format(i + 1) for i in range(30)]
x_data_2 = ["2019/10/{}".format(i + 1) for i in range(30)]
y_data_1 = [random.randint(10, 50) for _ in range(30)]
y_data_2 = [random.randint(20, 60) for _ in range(30)]def line_with_two_xaxis():line = Line(init_opts=opts.InitOpts(theme='light', width='1000px', height='600px'))line.add_xaxis(x_data_1)# 使用 extend_axis 添加另一个 X 轴# 注意:这里使用 xaxis_data 和 xaxis=opts.AxisOpts() 为图表扩展第二 X 轴line.extend_axis(xaxis_data=x_data_2, xaxis=opts.AxisOpts())line.add_yaxis('下面X轴', y_data_1)     # 使用原 X 轴数据(x_data_1)line.add_yaxis('上面X轴', y_data_2)     # 使用扩展的 X 轴数据(x_data_2)return linechart = line_with_two_xaxis()
chart.render_notebook()

实现思路

  • 使用 Line 创建基本折线图并添加第一组横坐标数据 x_data_1
  • 使用 extend_axis(xaxis_data=x_data_2, xaxis=...) 来添加第二个 X 轴及其数据。
  • 分别为两条折线指定数据列,第一条折线沿用主 X 轴数据,第二条折线使用扩展的 X 轴数据,从而形成上下两个 X 轴分别展示不同数据的效果。

四、总结

本篇文章展示了双轴图表在数据可视化中的独特优势与实用性。在实际的数据可视化工作中,双轴图表能让您在一张图上表达更为复杂和丰富的信息,有效提升数据洞察的深度和广度。在后续的文章中,我们还将继续探讨更多类型和技巧的图表可视化方法,敬请期待!


http://www.ppmy.cn/server/163933.html

相关文章

分组表格antd+ react +ts

import React from "react"; import { Table, Tag } from "antd"; import styles from "./index.less"; import GroupTag from "../Tag"; const GroupTable () > {const columns [{title: "姓名",dataIndex: "nam…

Sentinel 控制台集成 Nacos 实现规则配置双向同步和持久化存储(提供改造后源码)

目录 一、前言二、Sentinel 控制台规则推送实现原理三、Sentinel控制台源码改造前置准备工作3.1、本文使用各组件版本3.2、下载Sentinel控制台源码3.3、启动Sentinel控制台3.4、应用服务实现 Sentinel 客户端动态获取 Nacos 规则配置3.4.1、添加sentinel集成nacos包 3.4.2、Nac…

使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录

editor中设置了using exculexing 模拟远程加载addressable可以实现资源热更新,build后的软件却没有成功。 iis服务器中mime中需要设置bundle的文件扩展名,时editor成功,build后失败 原因没有设置hash的扩展名,设置后editor和buil…

volatile

文章目录 ResortSeqDemo.javaSingletonDemo.javaSingletonDemo2.javaVolatileDemo.java ResortSeqDemo.java package com.xd.thread;public class ResortSeqDemo {volatile int a0;boolean flagfalse;/*多线程下flagtrue可能先执行,还没走到a1就被挂起其他线程进入…

Redis内部数据结构--跳表详解

跳表 1. 什么是跳表--skiplist2. skiplist的效率如何保证3. 跳表的实现4. 跳表与平衡搜索树和哈希表的对比 1. 什么是跳表–skiplist skiplist本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为…

我的毕设之路:(2)系统类型的论文写法

一般先进行毕设的设计与实现,再在现成毕设基础上进行描述形成文档,那么论文也就成形了。 1 需求分析:毕业设计根据开题报告和要求进行需求分析和功能确定,区分贴合主题的主要功能和拓展功能能,删除偏离无关紧要的功能…

一文讲解JVM中的G1垃圾收集器

接上一篇博文,这篇博文讲下JVM中的G1垃圾收集器 G1在JDK1.7时引入,在JDK9时取代了CMS成为默认的垃圾收集器; G1把Java堆划分为多个大小相等的独立区域Region,每个区域都可以扮演新生代(Eden和Survivor)或老…

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一个函数,用于检索一个完整的结果集到一个客户端。当执行一个查询(通常是 SELECT 查询)并希望处理所有返回的数据时,可以使用此函数。 概念 mysql_store_result() 函数的原型如下&…