pyecharts中折线图和柱状图如何组合到一起

发布时间:2021-12-14 09:38:15 作者:iii
来源:亿速云 阅读:2379
# pyecharts中折线图和柱状图如何组合到一起

## 前言

在数据可视化领域,将不同类型的图表组合在一起是常见的需求。pyecharts作为基于ECharts的Python可视化库,提供了强大的图表组合能力。本文将详细介绍如何在pyecharts中将折线图和柱状图组合到一起,实现更丰富的数据展示效果。

## 一、pyecharts图表组合基础

### 1.1 图表组合的概念

图表组合是指在一个画布上同时展示多种类型的图表,使不同图表之间能够相互补充,共同表达更完整的数据故事。常见的组合形式包括:

- 折线图+柱状图
- 饼图+环形图
- 散点图+折线图

### 1.2 pyecharts实现组合的方式

pyecharts主要通过以下两种方式实现图表组合:

1. **Overlap叠加模式**:将多个图表叠加到同一个坐标系中
2. **Grid并行模式**:将多个图表并排显示在同一个页面中

## 二、Overlap模式实现折线图+柱状图组合

### 2.1 基本实现步骤

```python
from pyecharts.charts import Bar, Line
from pyecharts import options as opts

# 创建柱状图
bar = (
    Bar()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
    .set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
)

# 创建折线图
line = (
    Line()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
)

# 组合图表
bar.overlap(line)

# 渲染图表
bar.render("overlap_bar_line.html")

2.2 关键参数说明

2.3 样式优化技巧

# 优化样式后的代码示例
bar = (
    Bar()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("销量", [5, 20, 36, 10, 75, 90], 
               itemstyle_opts=opts.ItemStyleOpts(color="#5793f3"))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="销量与利润对比"),
        yaxis_opts=opts.AxisOpts(name="销量", position="left")
    )
)

line = (
    Line()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("利润", [15, 6, 45, 20, 35, 66],
              yaxis_index=1,
              linestyle_opts=opts.LineStyleOpts(width=3),
              symbol="diamond",
              itemstyle_opts=opts.ItemStyleOpts(color="#d14a61"))
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(name="利润", position="right")
    )
)

bar.overlap(line)
bar.render("optimized_overlap.html")

三、Grid模式实现图表并行展示

3.1 基本实现方法

from pyecharts.charts import Bar, Line, Grid
from pyecharts import options as opts

# 创建柱状图
bar = (
    Bar()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
    .set_global_opts(title_opts=opts.TitleOpts(title="Grid示例-柱状图"))
)

# 创建折线图
line = (
    Line()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Grid示例-折线图", pos_top="48%"),
        legend_opts=opts.LegendOpts(pos_top="48%"),
    )
)

# 使用Grid组合
grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
)

grid.render("grid_bar_line.html")

3.2 布局参数详解

3.3 多图表复杂布局

grid = (
    Grid(init_opts=opts.InitOpts(width="1200px", height="600px"))
    .add(
        bar, 
        grid_opts=opts.GridOpts(
            pos_left="5%", pos_right="55%", pos_top="10%", pos_bottom="60%"
        )
    )
    .add(
        line, 
        grid_opts=opts.GridOpts(
            pos_left="60%", pos_right="5%", pos_top="10%", pos_bottom="60%"
        )
    )
    # 可以继续添加更多图表
)

四、双Y轴实现技巧

4.1 基本双Y轴配置

bar = (
    Bar()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("销量", [5, 20, 36, 10, 75, 90], yaxis_index=0)
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="利润率(%)",
            type_="value",
            min_=0,
            max_=100,
            position="right",
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(color="#d14a61")
            ),
            axislabel_opts=opts.LabelOpts(formatter="{value} %"),
        )
    )
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(
            name="销量",
            position="left",
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(color="#5793f3")
            ),
        )
    )
)

line = (
    Line()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis(
        "利润率",
        [25, 30, 45, 60, 35, 55],
        yaxis_index=1,
        label_opts=opts.LabelOpts(formatter="{c} %"),
        linestyle_opts=opts.LineStyleOpts(width=3),
        itemstyle_opts=opts.ItemStyleOpts(color="#d14a61"),
    )
)

bar.overlap(line)
bar.render("dual_yaxis.html")

4.2 双Y轴最佳实践

  1. 颜色区分:左右y轴使用不同颜色
  2. 单位标注:明确标注每个y轴的单位
  3. 比例协调:调整数值范围使两个系列都能合理展示
  4. 图例说明:清晰说明每个系列对应的y轴

五、实际应用案例

5.1 销售数据分析

import random
from pyecharts.charts import Bar, Line
from pyecharts import options as opts

# 模拟数据
months = [f"{i}月" for i in range(1, 13)]
sales = [random.randint(50, 200) for _ in range(12)]
profits = [random.randint(10, 50) for _ in range(12)]

# 创建柱状图
bar = (
    Bar()
    .add_xaxis(months)
    .add_yaxis("销售额(万元)", sales, 
               itemstyle_opts=opts.ItemStyleOpts(color="#2f89cf"))
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="利润率(%)",
            type_="value",
            min_=0,
            max_=30,
            position="right",
            axisline_opts=opts.AxisLineOpts(color="#ff7f50"),
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="年度销售数据分析"),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
        yaxis_opts=opts.AxisOpts(name="销售额(万元)", position="left"),
        datazoom_opts=[opts.DataZoomOpts()],  # 添加缩放功能
    )
)

# 创建折线图
line = (
    Line()
    .add_xaxis(months)
    .add_yaxis(
        "利润率",
        profits,
        yaxis_index=1,
        label_opts=opts.LabelOpts(formatter="{c}%"),
        symbol="roundRect",
        symbol_size=12,
        linestyle_opts=opts.LineStyleOpts(width=4),
        itemstyle_opts=opts.ItemStyleOpts(color="#ff7f50"),
    )
)

# 组合图表
bar.overlap(line)
bar.render("sales_analysis.html")

5.2 用户行为分析

from pyecharts.charts import Grid, Bar, Line

# 模拟数据
hours = [f"{i}:00" for i in range(24)]
uv = [random.randint(100, 500) for _ in range(24)]
pv = [i * random.randint(3, 8) for i in uv]
conversion = [round(random.uniform(1, 10), 2) for _ in range(24)]

# 创建柱状图(UV)
bar_uv = (
    Bar()
    .add_xaxis(hours)
    .add_yaxis("UV", uv, category_gap="60%")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="每小时UV/PV趋势"),
        yaxis_opts=opts.AxisOpts(name="UV/PV数量"),
        datazoom_opts=[opts.DataZoomOpts()],
    )
)

# 创建柱状图(PV)
bar_pv = (
    Bar()
    .add_xaxis(hours)
    .add_yaxis("PV", pv, category_gap="60%")
)

# 创建折线图(转化率)
line = (
    Line()
    .add_xaxis(hours)
    .add_yaxis(
        "转化率(%)",
        conversion,
        yaxis_index=1,
        label_opts=opts.LabelOpts(formatter="{c}%"),
        z_level=10  # 确保折线图在最上层
    )
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="转化率(%)",
            min_=0,
            max_=15,
            position="right",
            axislabel_opts=opts.LabelOpts(formatter="{value}%"),
        )
    )
)

# 组合图表
bar_uv.overlap(bar_pv)
bar_uv.overlap(line)

# 使用Grid布局添加其他图表...

六、常见问题与解决方案

6.1 图表重叠显示问题

问题描述:多个图表叠加后部分元素被遮挡

解决方案: 1. 调整z_level参数控制图层顺序 2. 使用透明度设置:itemstyle_opts=opts.ItemStyleOpts(opacity=0.7) 3. 调整柱状图的category_gap参数

6.2 坐标轴不对齐问题

问题描述:组合图表后x轴刻度不对齐

解决方案: 1. 确保所有图表使用相同的x轴数据 2. 检查是否设置了相同的axis_opts 3. 使用alignTicks: True配置(在ECharts中)

6.3 图例混乱问题

问题描述:多个图表的图例混在一起

解决方案: 1. 统一设置图例:set_global_opts(legend_opts=opts.LegendOpts(data=["系列1", "系列2"])) 2. 使用selected_mode控制可选性 3. 通过pos_top, pos_left等参数调整位置

七、高级技巧与扩展

7.1 动态数据更新

from pyecharts.charts import Bar, Line, Timeline

timeline = Timeline()
for year in range(2015, 2021):
    bar = (
        Bar()
        .add_xaxis(["产品A", "产品B", "产品C"])
        .add_yaxis("销量", [random.randint(10, 100) for _ in range(3)])
    )
    line = (
        Line()
        .add_xaxis(["产品A", "产品B", "产品C"])
        .add_yaxis("增长率", [random.randint(-10, 30) for _ in range(3)])
    )
    bar.overlap(line)
    timeline.add(bar, str(year))

timeline.render("timeline_example.html")

7.2 与地图组合

from pyecharts.charts import Map, Line
from pyecharts import options as opts

# 地图部分
map_chart = (
    Map()
    .add("", [list(z) for z in zip(["广东", "北京", "上海"], [100, 80, 60])], "china")
)

# 折线图部分
line = (
    Line()
    .add_xaxis(["Q1", "Q2", "Q3", "Q4"])
    .add_yaxis("全国增长率", [4.5, 6.2, 5.8, 7.1])
)

# 使用Grid组合
grid = (
    Grid()
    .add(map_chart, grid_opts=opts.GridOpts(pos_left="55%"))
    .add(line, grid_opts=opts.GridOpts(pos_right="55%"))
)

结语

通过本文的介绍,我们全面了解了在pyecharts中将折线图和柱状图组合到一起的各种方法。无论是简单的Overlap叠加,还是复杂的Grid布局,pyecharts都提供了灵活的API来实现。在实际应用中,应根据数据特性和展示需求选择合适的组合方式,并注意图表之间的协调性和可读性。

掌握这些组合技巧后,你可以创建出更加专业、信息量更丰富的数据可视化作品,有效提升数据分析报告的质量和表现力。 “`

推荐阅读:
  1. 怎么使用Component的React框架的柱状图和折线图
  2. Python3使用 pyecharts实现生成Html文件柱状图及折线图

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pyecharts

上一篇:pyecharts怎么实现时间轴

下一篇:CDSW1.4版本中新增的Models功能怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》