Pyecharts之双轴图表的魅力

在数据可视化的实践中,我们经常会遇到这样的情景:希望在一张图中展示不同量纲的数据,以便进行对比与关联分析。这时,双轴图表(双 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 random

x_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 bar

chart = 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 random

x_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 line

chart = line_with_two_xaxis()
chart.render_notebook()

实现思路

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

四、总结

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

相关推荐
小灰灰搞电子1 分钟前
Python 函数参数分隔符 *:Keyword-Only Arguments 原理与实践
开发语言·python
2601_962297253 分钟前
Authlib 0.13通用Python认证授权库wheel安装包(支持Python 2/3)
python·jwt·oauth2.0·authlib·openidconnect
SamChan904 分钟前
大文件多语言PDF翻译性能实测:300页文档的耗时、内存占用与失败率分析
python·ai·pdf·机器翻译
绎奇PPT13 分钟前
绎奇PPT分享:科研项目申请书全方位美化规范与实操指南
信息可视化·powerpoint·ppt
GIS数据转换器15 分钟前
遥感GIS一体化技术应用平台
大数据·人工智能·python·安全·数据挖掘
2601_9669496525 分钟前
批量 K 线不只是提速:因子研究中的数据质量、复权与回测偏差
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
一位正在转型AI全栈的前端工程师26 分钟前
AI 全栈学习之旅 -Week 11:从 CLI 到浏览器:用 FastAPI、SSE 和 Vue 3 做一个可审核的 ReAct Agent
前端·python
AI职业加油站31 分钟前
2026大数据运维行业趋势复盘:大数据运维工程师赋能发展
大数据·运维·人工智能·学习·数据分析·职场发展
洛阳纸贵32 分钟前
AI-PyTorch(一)基础代码实操和自动求导
人工智能·pytorch·python
2601_9622845040 分钟前
uv:终结 Python 虚拟环境管理乱局
python·项目管理·uv·虚拟环境·依赖管理