pyecharts绘图思路:
1.【导入需要用到的图表类(Bar,Line,Scatter,Pie)】
2.【准备数据(数据爬取-数据清洗-数据结构化): 数据格式要符合传参的需求】
3.【通过导入的图表类,创建图表实例】
4.【.往图表实例填充数据,即完成绘图】
5. 【设置“系列配置项”和“全局配置项”--> 可做可不做(类似于matplotlib的:图表辅助元素的定制和样式美化)】
6. 【展示图表(渲染图表)
【pyecharts的常用的图表分成两大类】:
1. 带x轴和y轴的直角坐标系图表(柱形图,折线图,散点图,箱型图)
.add_xaxis() .add_yaxis()
2. 不带x轴和y轴的基本图表(饼图,环图,词云图,桑基图,漏斗图, 雷达图)
.add()
附:Pyecharts常用网址
在anaconda prompt命令行工具下,通过pip清华镜像源安装pyecharts
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
echarts官网:https://www.echartsjs.com/index.html
pyecharts官网:https://pyecharts.org/#/zh-cn/intro
pyecharts众多图表示例代码:https://gallery.pyecharts.org/#/README
pyecharts github项目国内镜像: https://gitee.com/mirrors/pyecharts
需求一: 请基于pyecharts,用柱形图和折线图在同一个坐标系展示表1数据,得到图1。
需求二: 请基于pyecharts,用环图展示表2数据,得到图2。
需求三: 请基于pyecharts,用堆积柱形图展示表3数据,得到图3。
需求四: 请基于pyecharts,用雷达图展示表4数据,得到图4。
需求五: 将上述图1到图4,利用“并行多图”的方式排布,得到图5。(参考示意图)
需求六: 将上述图1到图5,利用“轮播多图”的方式排布,得到图6。
需求一
import pyecharts.options as opts
from pyecharts.charts import Bar, Line
x_data = ['2014年','2015年','2016年','2017年','2018年','2019年','2020年','2021年'] #x轴数据
data_1 =[87430, 90912,96225,101885,107147,116390,105764,120215] #诊疗量(万人次)的数据
data_2 = [7.40,4.00,5.83,5.81,5.16,8.63,-9.31,13.66] #同比增速(%)的数据
# 创建柱形图对象
bar = (
Bar(init_opts=opts.InitOpts(width='1000px', height='500px')) #设置柱形图宽度与高度
.add_xaxis(xaxis_data=x_data) #添加x轴的数据
.add_yaxis(
series_name='诊疗量(万人次)', #图例名:诊疗量(万人次)
y_axis=data_1, #y轴柱形图数据
yaxis_index=1, #表示y轴的索引,用于拥有多个y轴的单图表中。
label_opts=opts.LabelOpts(is_show=False), #不显示柱形图数据
)
.extend_axis(
yaxis=opts.AxisOpts(
name='诊疗量(万人次)',
type_='value',
min_=0,max_=150000, #y轴最小值为0,y轴最大值为150000
position='left' #位于y轴左侧
)
)
.extend_axis(
yaxis=opts.AxisOpts(
name='同比增速(%)',
type_='value',
min_=-10, max_=15, #y轴最小值为-10,最大值为15
position='right', #位于y轴右侧
)
)
.set_global_opts( #设置全局配置项
title_opts=opts.TitleOpts(title='2014-2021年中国中医类医疗卫生机构诊疗量'), #标题
legend_opts=opts.LegendOpts(pos_left='40%' ), #图例距离左边边距:40%
tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross'), #显示提示框组件
#toolbox_opts=opts.ToolboxOpts(is_show=True) #显示工具栏
)
.set_series_opts(
itemstyle_opts=opts.ItemStyleOpts( #图元样式配置项
opacity=0.5), #设置柱形图透明度:0.5
)
)
# 创建折线图对象
line = (
Line()
.add_xaxis(x_data) #添加x轴的数据
.add_yaxis(
series_name='同比增速(%)', #图例名:同比增速(%)
y_axis=data_2, #y轴折线图数据
yaxis_index=2, #表示y轴的索引,用于拥有多个y轴的单图表中
)
)
bar.overlap(line).render_notebook() ##overlap传入的必须为直角坐标系类型图表 ,柱形图层叠折线图
图1如下:
需求二
from pyecharts import options as opts
from pyecharts.charts import Bar,Line,Scatter,Pie
from pyecharts.faker import Faker
data = [["20岁以下",2.2],["20-30岁",27.9],["31-40岁",56.2],["41-50岁",10.9],["51岁以上",2.8]]
c = (
Pie()
.add("", data ,
radius=["25%", "50%"], # 挖掉的直径,整张饼的直径 (百分数指的是占画布中高和宽中小的那一项的比例)
)
.set_colors(["green", "blue", "pink", "orange", "yellow"])
.set_global_opts(title_opts=opts.TitleOpts(title="中药材消费者画像数据"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook() #渲染到notebook上
图2如下:
需求三
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
x_years =['2019年', '2020年','2021年', '2022年','2023年'] #导入数据
y1 = [20.3, 22.0, 23.5, 22.5, 22.3]
y2 = [79.7, 78.0, 76.5, 77.5, 77.7]
c = (
Bar()
.add_xaxis(x_years)
.add_yaxis("跨国企业占比(%)", y1, stack="stack1", color='orange',bar_width=80) #纵坐标1 图例名称
.add_yaxis("本土企业占比(%)", y2, stack="stack1" ) #纵坐标2 stack="stack":数据堆叠,必须两组同时设置才可生效
.set_series_opts(label_opts=opts.LabelOpts(is_show=True , #是否显示数据标签
position="right", #设置柱形图每一条的数据在右侧显示
font_size=12, #文字大小
font_weight = "bold") ) #文字字体的粗细
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比情况")) #设置全局配置项
)
c.render_notebook() # 在notebook中渲染图表
图3如下:
需求四
from pyecharts import options as opts
from pyecharts.charts import Radar
data = [[33, 45, 3, 9, 6, 4]] #导入数据
c_schema = [
{"name": "化学药", "max": 0, "min": 45},
{"name": "中成药", "max": 0, "min": 45},
{"name": "生物制品", "max": 0, "min": 45},
{"name": "医疗器械", "max": 0, "min": 45},
{"name": "中药饮片", "max": 0, "min": 45},
{"name": "保健品", "max": 0, "min": 45},
]
# 绘制雷达图实例
radar = (
Radar(init_opts=opts.InitOpts())
.set_colors(["blue"]) #数据点颜色,填充区域也会改变
.add_schema(
schema=c_schema, # 雷达指示器配置项列表
shape="circle", #雷达图绘制类型
center=["50%", "50%"], #支持设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
radius="77%", #半径
angleaxis_opts=opts.AngleAxisOpts( #极坐标系角度轴配置项
min_=0, #坐标轴刻度标签最小值
max_=360, #坐标轴刻度标签最大值
interval=20, #坐标轴分割间隔
axistick_opts=opts.AxisTickOpts(is_show=False), # 轴刻度
axislabel_opts=opts.LabelOpts(is_show=False), #坐标轴线标签配置项
axisline_opts=opts.AxisLineOpts(is_show=False), # 坐标轴线风格配置项
splitline_opts=opts.SplitLineOpts(is_show=False), #坐标轴在 grid 区域中的分隔区域
),
radiusaxis_opts=opts.RadiusAxisOpts( # 极坐标系的径向轴
min_=0, # 设置坐标轴刻度的最小值
max_=45, # 设置坐标轴刻度的最大值
interval=20, # 坐标轴间隔值
),
polar_opts=opts.PolarOpts(),
splitarea_opt=opts.SplitAreaOpts(is_show=False), # 分隔区域配置项
splitline_opt=opts.SplitLineOpts(is_show=False), # 分割线配置项
)
.add(
series_name="全国药店药品销售额占比", #设置标题
data=data,
areastyle_opts=opts.AreaStyleOpts(opacity=0.2), # 区域填充样式配置项,透明度
linestyle_opts=opts.LineStyleOpts(width=2), #线样式配置项,线宽
)
.set_global_opts(title_opts=opts.TitleOpts(title='全国药店药品销售额占比'))
)
radar.render_notebook() #渲染到notebook上
图4如下:
# 导入所需要用到的库以及图表类
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Radar, Pie
from pyecharts.commons.utils import JsCode
from pyecharts.faker import Faker
x_data = ['2014年','2015年','2016年','2017年','2018年','2019年','2020年','2021年'] #x轴数据
data_1 =[87430, 90912,96225,101885,107147,116390,105764,120215] #诊疗量(万人次)的数据
data_2 = [7.40,4.00,5.83,5.81,5.16,8.63,-9.31,13.66] #同比增速(%)的数据
# 创建柱形图对象
bar1 = (
Bar(init_opts=opts.InitOpts(width='1000px', height='500px')) #设置柱形图宽度与高度
.add_xaxis(xaxis_data=x_data) #添加x轴的数据
.add_yaxis(
series_name='诊疗量(万人次)', #图例名:诊疗量(万人次)
y_axis=data_1, #y轴柱形图数据
yaxis_index=1, #表示y轴的索引,用于拥有多个y轴的单图表中。
label_opts=opts.LabelOpts(is_show=False), #不显示柱形图数据
)
.extend_axis(
yaxis=opts.AxisOpts(
name='诊疗量(万人次)',
type_='value',
min_=0,max_=150000, #y轴最小值为0,y轴最大值为150000
position='left' #位于y轴左侧
)
)
.extend_axis(
yaxis=opts.AxisOpts(
name='同比增速(%)',
type_='value',
min_=-10, max_=15, #y轴最小值为-10,最大值为15
position='right', #位于y轴右侧
)
)
.set_global_opts( #设置全局配置项
title_opts=opts.TitleOpts(title='2014-2021年中国中医类医疗卫生机构诊疗量'), #标题
legend_opts=opts.LegendOpts(pos_left='45%' ), #图例距离左边边距:45%
tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross'), #显示提示框组件
#toolbox_opts=opts.ToolboxOpts(is_show=True) #显示工具栏
)
.set_series_opts(
itemstyle_opts=opts.ItemStyleOpts( #图元样式配置项
opacity=0.5), #设置柱形图透明度:0.5
)
)
# 创建折线图对象
line = (
Line()
.add_xaxis(xaxis_data=x_data) #添加x轴的数据
.add_yaxis(
series_name='同比增速(%)', #图例名:同比增速(%)
y_axis=data_2, #y轴折线图数据
yaxis_index=1, #表示y轴的索引,用于拥有多个y轴的单图表中
)
)
# 堆积柱形图
bar2 = (
Bar()
.add_xaxis(['2019年','2020年','2021年','2022年','2023年'])
.add_yaxis("跨国企业占比",
[20.3,22.0,23.5,22.5,22.3],
stack="stack1", # 数据堆叠
xaxis_index=1,yaxis_index=3)
.add_yaxis("本土企业占比",
[79.7,78.0,76.5,77.5,77.7],
stack="stack1",
xaxis_index=1,yaxis_index=3)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(
title="全国药店中药饮品供应商占比",pos_top="50%",pos_left="38%", # 设置标题名称,控制标题的位置
),
legend_opts=opts.LegendOpts(is_show=False), # 设置不显示图例
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=9)) # 控制x轴字体大小
)
)
# 饼图
pie = (
Pie()
.add(
"",
[list(z) for z in zip(
['20岁以下', '20-30岁', '31-40岁', '41-50岁', '51岁以上'],
[2.2, 27.9, 56.2, 10.9, 2.8])], # 传入数据
# [("20岁以下",2.2),("20-30岁",27.9),("31-40岁",56.2),("41-50岁",10.9),("51岁以上",2.8)], # 也可以用这种方法传入数据
radius=[40,80],
# 饼图的半径,数组的第一项是内半径,第二项是外半径
# 默认设置成百分比,相对于容器高宽中较小的一项的一半
center=["20%","80%"],
# 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标,默认设置成百分比
# 设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
start_angle = 0, # 起始角度,支持范围 [0,360]
is_clockwise = False, # 饼图的扇区是否是顺时针排布
)
.set_global_opts(
title_opts=opts.TitleOpts(title="中药材消费者画像",pos_top="50%",pos_left="12%"), # 设置标题以及标题的位置
legend_opts=opts.LegendOpts(is_show=False), # 设置不显示图例
)
)
# 放在实例后面,不然会报错
barline=bar1.overlap(line) # 融合图表
grid=(
Grid()
.add(barline, grid_opts=opts.GridOpts(pos_bottom="60%"),
is_control_axis_index=True,) # 第一个图表:折线-柱形融合图
.add(bar2, grid_opts=opts.GridOpts(pos_top="57%",pos_bottom="5%",pos_left="41%",pos_right="37%"),
is_control_axis_index=True,) # 第三个图表:堆积柱形图
# .add(radar, grid_opts=opts.GridOpts(pos_top="60%",pos_left="65%"))
.add(pie, grid_opts=opts.GridOpts(pos_top="57%"),
is_control_axis_index=True,) # 第二个图表:饼图
)
# 渲染图表到notebook
grid.render_notebook()