在数据可视化的实践中,我们经常会遇到这样的情景:希望在一张图中展示不同量纲的数据,以便进行对比与关联分析。这时,双轴图表(双 Y 轴或双 X 轴)便可派上用场。通过 Pyecharts,我们可以轻松创建多轴图表,从而在同一个可视化中同时展示多种维度的信息。
本篇文章将以三个典型的双轴图表示例为基础,为您展示从代码到效果的实现思路:
- 双 Y 轴直方图与折线图组合
- 双 Y 轴直方图单独应用
- 双 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 轴分别展示不同数据的效果。
四、总结:
本篇文章展示了双轴图表在数据可视化中的独特优势与实用性。在实际的数据可视化工作中,双轴图表能让您在一张图上表达更为复杂和丰富的信息,有效提升数据洞察的深度和广度。在后续的文章中,我们还将继续探讨更多类型和技巧的图表可视化方法,敬请期待!