小伙伴可以看代码里的注释,里面有解释
先导库和准备数据
import pyecharts.options as opts
from pyecharts.charts import Line, Bar, Pie, Radar, Grid
# 准备数据
bar1_and_line_year_x = ["{}年".format(i) for i in range(2014, 2022)]
line_data_speed_y = [7.40, 4.00, 5.83, 5.81, 5.16, 8.63, -9.13, 13.66] # 同比增速
bar1_data_num_y = [87430, 90912, 96225, 101885, 107147, 116390, 105764, 120215] # 诊疗量
bar_x = ['{}年'.format(ii) for ii in range(2019, 2024)]
bar2_y1 = [20.3, 22.0, 23.5, 22.5, 22.3]
bar2_y2 = [79.7, 78.0, 76.5, 77.5, 77.7]
radar_data = [[33, 45, 3, 9, 6, 4]]
然后绘制融合图
# 柱形图
bar1 = (
Bar()
.add_xaxis(xaxis_data=bar1_and_line_year_x) # xaxis_data:x轴数据
.add_yaxis(series_name='诊疗量', y_axis=bar1_data_num_y, xaxis_index=0,yaxis_index=0, z=0, bar_width='50') # series_name:表示当鼠标放在柱形图的柱子上时,出现的标识
# x/yaxis_index:表示x/y轴的下标,当同一张图有多个坐标轴时有用,避免数据发生混乱
# bar_width:表示柱子的宽度
.extend_axis(yaxis=opts.AxisOpts( # extend_axis:表示添加一条坐标轴,这里添加了一条y轴,opts.AxisOpts:表示对坐标轴的样式进行设计
name="同比增速(%)", # name:表示y轴标签
type_="value", # 坐标轴的类型, # 'value': 数值轴,适用于连续数据。
# 'category': 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
# 'time': 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,
# 例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。
# 'log' 对数轴。适用于对数数据。
min_=-20, # 刻度标签的最小值
max_=20, # 刻度标签的最大值
interval=10, # 步长
))
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)",
min_=0, # 刻度标签的最小值
max_=150000, # 刻度标签的最大值
interval=50000, # 步长
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量",pos_left='center'), # opts.TitleOpts:表示图表标题配置
# title:标题名称
# pos_left:表示标题相对于左边框的距离,其值可以是字符串,数值,百分比(%)
legend_opts=opts.LegendOpts(is_show=False) # opts.LegendOpts:表示图例配置,
# 这里is_show=False表示不显示图例
)
)
# 折线图
line = (
Line()
.add_xaxis(xaxis_data=bar1_and_line_year_x)
.add_yaxis(series_name="同比增速", y_axis=line_data_speed_y, xaxis_index=0,yaxis_index=1, )
)
bar1.overlap(line) # overlap:表示层叠多图,这里表示在柱形图bar1上再绘制一个折线图
再到饼图
pie = (
Pie()
# 添加数据
.add("", [('20岁以下', 2.2), ('20-30岁', 27.9), ('31-40岁', 56.2), ('41-50岁', 10.9), ('51岁以上', 2.8)],
center=["20%", "80%"], # 饼图的中心(圆心)坐标,默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
radius=[50, 80]) # 饼图的半径,数组的第一项是内半径(中间缺口的半径),第二项是外半径(整个饼图的半径)
# 设置标题
.set_global_opts(title_opts=opts.TitleOpts(title='中药材消费者画像数据', pos_top="50%",pos_left='150'),
legend_opts=opts.LegendOpts(is_show=False))
)
再来柱形图
bar2 = (
Bar()
.add_xaxis(bar_x)
.add_yaxis("跨国企业占比(%)", bar2_y1, stack="stack1", category_gap="50%",xaxis_index=1,yaxis_index=2)
.add_yaxis("本土企业占比(%)", bar2_y2, stack="stack1", category_gap="50%",xaxis_index=1,yaxis_index=2)
.set_global_opts(legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(
title='全国药店中药饮片供应商占比', pos_top="50%", pos_left="470",)
)
.set_series_opts(
label_opts=opts.LabelOpts(
)
)
)
最后使用并行多图grid添加多个图表
grid = (
Grid(init_opts=opts.InitOpts(width='1200px', height='650px')) # Grid:表示并行多图,可以在一个容器(可以理解为一张白纸)中绘制多个图表
.add(bar1, grid_opts=opts.GridOpts(is_show=True,pos_bottom=380, pos_top=50, pos_left="10%", pos_right="10%",),
is_control_axis_index=True) # add:表示添加一个绘图区域,is_control_axis_index:表示坐标轴的下标由自己控制
.add(bar2, grid_opts=opts.GridOpts(is_show=True,pos_bottom=40, pos_top=400, pos_left="40%", pos_right="40%"),
is_control_axis_index=True)
.add(pie, grid_opts=opts.GridOpts(pos_bottom=40, pos_top=400, pos_left="10%", pos_right="70%"))
)
grid.render() # 渲染图表,可以理解为将图表展示屏幕,如果用的anaconda,就改为:
#
grid.render_notebook()
运行后效果图