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 轴分别展示不同数据的效果。

四、总结

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

相关推荐
LuiChun4 分钟前
Django-Admin WebView 集成项目技术规范文档 v2.1
后端·python·django
{⌐■_■}37 分钟前
【Validator】字段验证器struct与多层级验证,go案例
开发语言·信息可视化·golang
imoisture38 分钟前
PyTorch中的movedim、transpose与permute
人工智能·pytorch·python·深度学习
Tester_孙大壮38 分钟前
第31章 测试驱动开发中的设计模式与重构解析(Python 版)
python·设计模式·重构
weixin_3077791341 分钟前
C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库
数据库·c++·数据仓库·python·sqlserver
笛柳戏初雪1 小时前
Python中容器类型的数据(上)
开发语言·python
清弦墨客1 小时前
【蓝桥杯】43695.填字母游戏
python·蓝桥杯·编程算法
查理零世2 小时前
保姆级讲解 python之zip()方法实现矩阵行列转置
python·算法·矩阵
刀客1232 小时前
python3+TensorFlow 2.x(四)反向传播
人工智能·python·tensorflow
疯狂小羊啊3 小时前
WPS数据分析000008
数据分析·wps