使用pyecharts进行开发前,开发者需要先在本地计算机安装pyecharts。
安装步骤:打开Anaconda Prompt工具,通过pip清华镜像源安装pyecharts,在命令行输入:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
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
完成以下任务:
实现需求一: 用柱形图和折线图在同一个坐标系展示表1数据,得到图1
示例代码:
#导入所需模块
from pyecharts import options as opts
#导入需要用到的图类表(柱形图,组合图,折线图)
from pyecharts.charts import Bar, Grid, Line
x_data = ["{}月".format(i) for i in range(2014,2022)]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis(
"诊疗量(万人次)",
[87430,90912,96225,101885,107147,116390,105764,120215],
yaxis_index=0, #表示y轴的索引,用于拥有多个y轴的单图表中
color="#d14a61", #柱形图颜色
)
.extend_axis(
yaxis=opts.AxisOpts(
name="诊疗量(万人次)",
type_="value", #'value': 数值轴,适用于连续数据
min_=0, #设置左纵坐标轴的刻度值最低范围为0
max_=125000, #设置左纵坐标轴的刻度值最高范围为125000
interval=25000, #设置左纵坐标轴的刻度值范围的等分间隔为25000
position="left", #自定义在左纵坐标轴
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61") #坐标轴数值颜色
),
axislabel_opts=opts.LabelOpts(formatter="{value} "),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value", #'value': 数值轴,适用于连续数据
name="同比增速(%)",
min_=-20, #设置右纵坐标轴的刻度值最低范围为-20
max_=20, #设置右纵坐标轴的刻度值最高范围为20
position="right", #自定义在右坐标轴
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba") #坐标轴数值颜色
),
axislabel_opts=opts.LabelOpts(formatter="{value} %"),
splitline_opts=opts.SplitLineOpts(
is_show=False, linestyle_opts=opts.LineStyleOpts(opacity=1) #SplitLineOpts:分割线配置项,is_show表示是否显示分割线
),
)
)
#全局配置项
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)", #坐标轴名称
min_=0, #设置左纵坐标轴的刻度值最低范围为0
max_=125000, #设置左纵坐标轴的刻度值最高范围为125000
interval=25000, #设置左纵坐标轴的刻度值范围的等分间隔为25000
position="left", #将坐标轴定义在左侧
offset=0,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} "),
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量"), #标题配置项
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross" ),
#提示框配置项
# axis_pointer_type:指示器类型
# 'line':直线指示器
# 'shadow':阴影指示器
# 'none':无指示器
# 'cross':十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer。
legend_opts=opts.LegendOpts(pos_left="65%"),) #图例配置项,将图例组件设置离容器左侧的距离为65%
)
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"同比增速(%)", #右坐标轴名称
[7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66],
yaxis_index=2,
color="#675bba",
label_opts=opts.LabelOpts(is_show=True), #标签配置项,是否显示标签
symbol='triangle', #表示将折线图上的标记设为三角形
symbol_size=15, #表示标记的大小
z=3, #图形的z值,控制图形的前后顺序
#z值小的图形会被z值大的图形覆盖
)
)
#创建组合图表
bar.overlap(line)
grid = Grid()
#pos_left="5%", pos_right="20%":grid 组件离容器左侧或右侧的距离。 is_control_axis_index=True:是否由自己控制 Axis 索引
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
#渲染图表
bar.overlap(line).render_notebook() ##直接渲染到notebook
实现结果图1:
实现需求二:用环图展示表2数据,得到图2
示例代码:
#导入所需模块
from pyecharts import options as opts
#导入需要用到的图类表(饼图)
from pyecharts.charts import Pie
#准备导入的数据
x_data = ['20岁以下','20-30岁','31-40岁','41-50岁','51岁以上']
y_data = [2.2, 27.9, 56.2, 10.9, 2.8]
pie = (
Pie()
.add(
"",
[list(z) for z in zip(x_data, y_data)],
radius=["35%", "75%"], # 饼图的半径,数组的第一项是内半径,第二项是外半径
# 默认设置成百分比,相对于容器高宽中较小的一项的一半
)
#设置全局系统配置项
.set_global_opts(
title_opts=opts.TitleOpts(title="中药材消费者画像(%)"),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"), #图例配置项 设置距离顶部15%,左侧2%
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
#渲染图表
pie.render_notebook()
实现结果图2:
实现需求三: 用堆积柱形图展示表3数据,得到图3
示例代码:
#导入所需库
from pyecharts import options as opts
#导入所需图表(柱形图)
from pyecharts.charts import Bar
#准备导入的数据
x_data = ["{}月".format(i) for i in range(2019,2023)]
y_data1 = [20.3,22.2,23.5,22.5,22.3]
y_data2 = [79.7,78.0,76.5,77.5,77.7]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("跨国企业占比(%)",y_data1, stack="stack1")
.add_yaxis("本土企业占比(%)",y_data2, stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) #是否显示标签
#设置全局系统配置项
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比情况"), #设置标题
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))) #坐标轴标签设置,rotate=45设置标签倾斜程度
)
#渲染图表
bar.render_notebook()
实现结果图3:
实现需求四:用雷达图展示表4数据,得到图4
示例代码:
#导入所需库
from pyecharts import options as opts
#导入需要用到的图类表(雷达图)
from pyecharts.charts import Radar
#Radar实例填充数据
data = [{"value": [33, 45, 3, 9, 6, 4], "name": "占比(%)"}]
c_schema = [
{"name": "化学药", "max": 50, "min": 0},
{"name": "中成药", "max": 50, "min": 0},
{"name": "生物制品", "max": 50, "min": 0},
{"name": "医疗器械", "max": 50, "min": 0},
{"name": "中药饮片", "max": 50, "min": 0},
{"name": "保健品", "max": 50, "min": 0},
]
rad = (
Radar()
.set_colors(["#4587E7"]) #设置颜色
.add_schema(
schema=c_schema, #雷达指示器配置项列表
shape="circle", #雷达图绘制类型,可选 'polygon' 和 'circle'
center=["50%", "50%"], #雷达的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标
#支持设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度。
#极坐标系的角度轴
angleaxis_opts=opts.AngleAxisOpts(
min_=0, #极坐标系的最小角度轴
max_=360, #极坐标系的最大角度轴
is_clockwise=True,
interval=5, #范围等分间隔
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), #是否显示极坐标系分割线
),
#极坐标系的径向轴
radiusaxis_opts=opts.RadiusAxisOpts(
min_=0, #极坐标系的径向轴最小刻度值
max_=50, #极坐标系的径向轴最大刻度值
interval=10, #极坐标系的径向轴等分间隔
#分隔区域配置项
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) #区域填充样式
),
),
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.3), #雷达图所在范围透明度
linestyle_opts=opts.LineStyleOpts(width=1), #线样式的粗细
)
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店药品销售额占比")) #设置标题
)
#渲染图表
rad.render_notebook()
实现结果图4:
实现需求五:将上述图1到图4,利用“并行多图”的方式排布,得到图5
示例代码:
#导入所需模块
from pyecharts import options as opts
from pyecharts.globals import ThemeType
#导入需要用到的图类表(柱形图,组合图,折线图,饼图,雷达图)
from pyecharts.charts import Bar, Grid, Line, Radar, Pie
from pyecharts.commons.utils import JsCode
#第一个图
x_data = ["{}月".format(i) for i in range(2014,2022)]
bar1 = (
Bar()
.add_xaxis(x_data)
.add_yaxis(
"诊疗量(万人次)",
[87430,90912,96225,101885,107147,116390,105764,120215],
xaxis_index=1,
yaxis_index=1, #表示y轴的索引,用于拥有多个y轴的单图表中
color="#d14a61", #柱形图颜色
)
.extend_axis(
yaxis=opts.AxisOpts(
name="诊疗量(万人次)",
type_="value", #'value': 数值轴,适用于连续数据
min_=0, #设置左纵坐标轴的刻度值最低范围为0
max_=125000, #设置左纵坐标轴的刻度值最高范围为125000
interval=25000, #设置左纵坐标轴的刻度值范围的等分间隔为25000
position="left", #自定义在左纵坐标轴
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61") #坐标轴数值颜色
),
axislabel_opts=opts.LabelOpts(formatter="{value} "),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value", #'value': 数值轴,适用于连续数据
name="同比增速(%)",
min_=-20, #设置右纵坐标轴的刻度值最低范围为-20
max_=20, #设置右纵坐标轴的刻度值最高范围为20
position="right", #自定义在右坐标轴
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba") #坐标轴数值颜色
),
axislabel_opts=opts.LabelOpts(formatter="{value} %"),
splitline_opts=opts.SplitLineOpts(
is_show=False, linestyle_opts=opts.LineStyleOpts(opacity=1) #SplitLineOpts:分割线配置项,is_show表示是否显示分割线
),
)
)
#全局配置项
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)", #坐标轴名称
min_=0, #设置左纵坐标轴的刻度值最低范围为0
max_=125000, #设置左纵坐标轴的刻度值最高范围为125000
interval=25000, #设置左纵坐标轴的刻度值范围的等分间隔为25000
position="left", #将坐标轴定义在左侧
offset=0,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} "),
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量",pos_left="27%",pos_right="4%"), #标题配置项
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross" ),
#提示框配置项
# axis_pointer_type:指示器类型
# 'line':直线指示器
# 'shadow':阴影指示器
# 'none':无指示器
# 'cross':十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer。
legend_opts=opts.LegendOpts(pos_left="65%"),) #图例配置项,将图例组件设置离容器左侧的距离为65%
)
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"同比增速(%)", #右坐标轴名称
[7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66],
color="#675bba",
label_opts=opts.LabelOpts(is_show=True), #标签配置项,是否显示标签
symbol='triangle', #表示将折线图上的标记设为三角形
symbol_size=15, #表示标记的大小
z=3, #图形的z值,控制图形的前后顺序
#z值小的图形会被z值大的图形覆盖
xaxis_index=0,
yaxis_index=1,
)
)
# #创建组合图表
# bar.overlap(line)
# grid = Grid()
# #pos_left="5%", pos_right="20%":grid 组件离容器左侧或右侧的距离。 is_control_axis_index=True:是否由自己控制 Axis 索引
# grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
# 第二个图
# 准备导入的数据
x_data = ['20岁以下','20-30岁','31-40岁','41-50岁','51岁以上']
y_data = [2.2, 27.9, 56.2, 10.9, 2.8]
pie = (
Pie()
.add(
"",
[list(z) for z in zip(x_data, y_data)],
radius=["35%", "75%"], # 饼图的半径,数组的第一项是内半径,第二项是外半径
# 默认设置成百分比,相对于容器高宽中较小的一项的一半
)
#设置全局系统配置项
.set_global_opts(
title_opts=opts.TitleOpts(title="中药材消费者画像(%)"),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"), #图例配置项 设置距离顶部15%,左侧2%
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
#第三个图
#准备导入的数据
x_data = ["{}月".format(i) for i in range(2019,2023)]
y_data1 = [20.3,22.2,23.5,22.5,22.3]
y_data2 = [79.7,78.0,76.5,77.5,77.7]
bar2 = (
Bar()
.add_xaxis(x_data)
.add_yaxis("跨国企业占比(%)",y_data1, stack="stack1")
.add_yaxis("本土企业占比(%)",y_data2, stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) #是否显示标签
#设置全局系统配置项
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比情况"), #设置标题
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))) #坐标轴标签设置,rotate=45设置标签倾斜程度
)
# #第四个图
# #Radar实例填充数据
# data = [{"value": [33, 45, 3, 9, 6, 4], "name": "占比(%)"}]
# c_schema = [
# {"name": "化学药", "max": 50, "min": 0},
# {"name": "中成药", "max": 50, "min": 0},
# {"name": "生物制品", "max": 50, "min": 0},
# {"name": "医疗器械", "max": 50, "min": 0},
# {"name": "中药饮片", "max": 50, "min": 0},
# {"name": "保健品", "max": 50, "min": 0},
# ]
# rad = (
# Radar()
# .set_colors(["#4587E7"]) #设置颜色
# .add_schema(
# schema=c_schema, #雷达指示器配置项列表
# shape="circle", #雷达图绘制类型,可选 'polygon' 和 'circle'
# center=["50%", "50%"], #雷达的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标
# #支持设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度。
# #极坐标系的角度轴
# angleaxis_opts=opts.AngleAxisOpts(
# min_=0, #极坐标系的最小角度轴
# max_=360, #极坐标系的最大角度轴
# is_clockwise=True,
# interval=5, #范围等分间隔
# 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), #是否显示极坐标系分割线
# ),
# #极坐标系的径向轴
# radiusaxis_opts=opts.RadiusAxisOpts(
# min_=0, #极坐标系的径向轴最小刻度值
# max_=50, #极坐标系的径向轴最大刻度值
# interval=10, #极坐标系的径向轴等分间隔
# #分隔区域配置项
# splitarea_opts=opts.SplitAreaOpts(
# is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) #区域填充样式
# ),
# ),
# 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.3), #雷达图所在范围透明度
# linestyle_opts=opts.LineStyleOpts(width=1), #线样式的粗细
# )
# .set_global_opts(title_opts=opts.TitleOpts(title="全国药店药品销售额占比")) #设置标题
# )
bar1.overlap(line)
#建一个组合表实例
grid = (
Grid()
#通过联合调整pos_bottom,pos_top,pos_left,pos_right这四个参数
#实现并行组合图表中的任意布局
.add(bar1.overlap(line),grid_opts=opts.GridOpts(pos_bottom="58%"),
is_control_axis_index=True
)
.add(pie,grid_opts=opts.GridOpts(pos_bottom="1%",pos_top="60%",
pos_left="10%",pos_right="70%"),
is_control_axis_index=True)
.add(bar2,grid_opts=opts.GridOpts(pos_bottom="1%",pos_top="60%",
pos_left="40%",pos_right="40%"),
is_control_axis_index=True)
# .add(rad,grid_opts=opts.GridOpts(pos_bottom="1%",pos_top="60%",
# pos_left="70%",pos_right="10%",))
)
grid.render_notebook()