您好,登录后才能下订单哦!
# 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")
overlap()
方法:将其他图表叠加到当前图表上yaxis_index
指定# 优化样式后的代码示例
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")
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")
GridOpts
:控制图表在网格中的位置
pos_top
/pos_bottom
:距离顶部/底部的距离pos_left
/pos_right
:距离左侧/右侧的距离height
/width
:设置图表高度/宽度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%"
)
)
# 可以继续添加更多图表
)
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")
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")
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布局添加其他图表...
问题描述:多个图表叠加后部分元素被遮挡
解决方案:
1. 调整z_level
参数控制图层顺序
2. 使用透明度设置:itemstyle_opts=opts.ItemStyleOpts(opacity=0.7)
3. 调整柱状图的category_gap
参数
问题描述:组合图表后x轴刻度不对齐
解决方案:
1. 确保所有图表使用相同的x轴数据
2. 检查是否设置了相同的axis_opts
3. 使用alignTicks: True
配置(在ECharts中)
问题描述:多个图表的图例混在一起
解决方案:
1. 统一设置图例:set_global_opts(legend_opts=opts.LegendOpts(data=["系列1", "系列2"]))
2. 使用selected_mode
控制可选性
3. 通过pos_top
, pos_left
等参数调整位置
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")
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来实现。在实际应用中,应根据数据特性和展示需求选择合适的组合方式,并注意图表之间的协调性和可读性。
掌握这些组合技巧后,你可以创建出更加专业、信息量更丰富的数据可视化作品,有效提升数据分析报告的质量和表现力。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。