主要任务:
表1. 2014-2021年中国中医类医疗卫生机构诊疗量
年份(年) | 诊疗量(万人次) | 同比增速(%) |
2014 | 87430 | 7.40 |
2015 | 90912 | 4.00 |
2016 | 96225 | 5.83 |
2017 | 101885 | 5.81 |
2018 | 107147 | 5.16 |
2019 | 116390 | 8.63 |
2020 | 105764 | -9.13 |
2021 | 120215 | 13.66 |
表2. 中药材消费者画像数据
年龄 | 占比(%) |
20岁以下 | 2.2 |
20-30岁 | 27.9 |
31-40岁 | 56.2 |
41-50岁 | 10.9 |
51岁以上 | 2.8 |
表3. 全国药店中药饮片供应商占比情况
年份(年) | 跨国企业占比(%) | 本土企业占比(%) |
2019 | 20.3 | 79.7 |
2020 | 22.0 | 78.0 |
2021 | 23.5 | 76.5 |
2022 | 22.5 | 77.5 |
2023 | 22.3 | 77.7 |
表4. 全国药店药品销售额占比
药品类型 | 占比(%) |
化学药 | 33 |
中成药 | 45 |
生物制品 | 3 |
医疗器械 | 9 |
中药饮片 | 6 |
保健品 | 4 |
需求一: 请基于pyecharts,用柱形图和折线图在同一个坐标系展示表1数据,得到图1。
需求二: 请基于pyecharts,用环图展示表2数据,得到图2。
需求三: 请基于pyecharts,用堆积柱形图展示表3数据,得到图3。
需求四: 请基于pyecharts,用雷达图展示表4数据,得到图4。
需求五: 将上述图1到图4,利用“并行多图”的方式排布,得到图5。(参考示意图)
需求六: 将上述图1到图5,利用“轮播多图”的方式排布,得到图6。
示意图模式:
任务需求一:
请基于pyecharts,用柱形图和折线图在同一个坐标系展示表1数据,得到图1。
更详细的代码讲解请看我上一篇博客。
# 导入需要的库
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Pie
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
# 准备数据
x_data = ["{}年".format(i) for i in range(2014, 2022)]
list2 = ['20.3','22.0','23.5','22.5','22.3']
list3 = ['79.7','78.0','76.5','77.5','77.7']
# 柱形图
bar = (
Bar()
.add_xaxis(x_data)
# 第一个y轴的数据。左y轴的值、标签、颜色、透明度。
.add_yaxis(
"诊疗量(万人次)", # 轴名
[87430, 90912, 96225, 101885, 107147, 116390, 105764, 120215], # Y轴数据
color="#5793f3", ) # 颜色
# 增加系列配置
.set_series_opts(
itemstyle_opts={"opacity": 0.5}, # 透明度
label_opts=opts.LabelOpts(is_show=False)) # 是否显示标签
# 左纵坐标 (AxisOpts:坐标轴配置项)
.extend_axis(
yaxis=opts.AxisOpts(
name="诊疗量(万人次)", # 坐标名
min_=70000, # 设定最小值
max_=130000, # 设定最大值
position="left", # 自定义坐标轴是左侧
axislabel_opts=opts.LabelOpts(formatter="{value}"), # 设定坐标轴数值
)
)
# 右纵坐标
.extend_axis(
yaxis=opts.AxisOpts(
name="同比增速(%)", # 坐标名
min_=-20, # 设定最小值
max_=20, # 设定最大值
position="right", # 自定义坐标轴是右侧
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
), # 自定义坐标轴数值的颜色
axislabel_opts=opts.LabelOpts(formatter="{value} %"), # 设定坐标轴数值+单位
)
)
# set_global_opts:全局配置设置
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)", # 坐标名
min_=70000, # 设定最小值
max_=130000, # 设定最大值
position="left", # 自定义坐标轴是左侧
offset=0, # Y 轴相对于默认位置的偏移,在相同的 position 上有多个 Y 轴的时候有用。
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3") # 自定义坐标轴数值的颜色
),
axislabel_opts=opts.LabelOpts(formatter="{value}"), # 设定坐标轴数值
),
# 标题配置项 title:主标题 副标题:subtitle pos_right:工具栏组件离容器右侧的距离。
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量",pos_left="35%",pos_right="4%"),
# # 提示框配置项
# trigger:触发类型。可选:
#'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。
# 'axis': 坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。
# 'none': 什么都不触发
#axis_pointer_type:指示器类型。可选:
# 'line':直线指示器
# 'shadow':阴影指示器
# 'none':无指示器
# 'cross':十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer。
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
# 折线图
line = (
Line()
.add_xaxis(x_data) # x轴数据
.add_yaxis(
"同比增速(%)", # 轴名
[7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66], # y轴数据
# 指定哪些 yAxis 被控制。如果缺省则控制所有的 y 轴。
# 如果设置为 false 则不控制任何y轴。如果设置成 3 则控制 axisIndex 为 3 的 y 轴。
# 如果设置为 [0, 3] 则控制 axisIndex 为 0 和 3 的 y 轴。
yaxis_index=2,
color="#675bba", # 设置折线的颜色
label_opts=opts.LabelOpts(is_show=False), # 是否显示标签
)
)
# 创建一个组合图表实例(数据填充格式为:其他图表类实例,Bar, Grid, Line,Faker)
bar.overlap(line) # 将折线图覆盖在柱状图的上面
grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_bottom="55%", pos_top="6.3%", pos_left="8%", pos_right="4.7%"),
is_control_axis_index=True) # 这个参数的意思,是否由自己控制 Axis 索引
)
grid.render_notebook()
展示图表:
任务需求二:
请基于pyecharts,用环图展示表2数据,得到图2。
# 导入所需要的库
from pyecharts import options as opts
from pyecharts.charts import Pie
# 环图
pie = (
Pie()
.add("",
[('20岁以下',2.2),('20-30岁',27.9),('31-40岁',56.2),('41-50岁',10.9),('51岁以上',2.8)],# 环图数据
#极坐标系的半径。可以为如下类型:
# number:直接指定外半径值。
# string:例如,'20%',表示外半径为可视区尺寸(容器高宽中较小一项)的 20% 长度。
# Array.<number|string>:数组的第一项是内半径,第二项是外半径。每一项遵从上述 number string 的描述。
radius=["40%", "75%"],
label_opts=opts.LabelOpts(is_show=True, position="center"),) # 设置标签是否显示与标签位置
.set_colors(["blue", "green", "yellow", "red", "pink", "purple"]) # 设置环图颜色
.set_global_opts(title_opts=opts.TitleOpts(title="中药材消费者画像",pos_left="41%",pos_right="4%"),# 设置标题与标题位置
legend_opts=opts.LegendOpts(is_show=False)) # 设置不显示组件
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%")) # 设置环图显示方式
)
pie.render_notebook()
展示图表:
任务需求三:
请基于pyecharts,用堆积柱形图展示表3数据,得到图3。
# 导入所需要的库
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
# 堆积柱形图
c = (
Bar()
.set_global_opts(title_opts=opts.TitleOpts(title='全国药店中药饮片供应商占比',# 设置图表名
pos_bottom="4%",pos_top="48%",pos_left="37%",pos_right="60%"),# 设置图名位置
legend_opts=opts.LegendOpts(is_show=False)) # 设置不显示组件
.add_xaxis([2019, 2020, 2021, 2022, 2023]) # 设置x轴数据
# 设置y轴数据
.add_yaxis("", ['20.3','22.0','23.5','22.5','22.3'], stack="stack1", category_gap="50%")
.add_yaxis("", ['79.7','78.0','76.5','77.5','77.7'], stack="stack1", category_gap="50%")
)
# 创建一个组合图表实例(数据填充格式为:其他图表类实例,Bar, Grid, Line,Faker)
grid = (
Grid()
# 设置堆积柱形图的位置
.add(c,grid_opts=opts.GridOpts(pos_bottom="3.5%",pos_top="55%",pos_left="60%",pos_right="60%")))
grid.render_notebook()
任务需求四:
请基于pyecharts,用雷达图展示表4数据,得到图4。
# 导入所需库
from pyecharts import options as opts
from pyecharts.charts import Radar
# 准备数据
v1 = [[33, 45, 3, 9, 6, 4]]
# 雷达图
radar = (
Radar()
.add_schema(
schema=[
opts.RadarIndicatorItem(name="化学药", max_=65),
opts.RadarIndicatorItem(name="中成药", max_=75),
opts.RadarIndicatorItem(name="生物制品", max_=15),
opts.RadarIndicatorItem(name="医疗器械", max_=20),
opts.RadarIndicatorItem(name="中药饮片", max_=20),
opts.RadarIndicatorItem(name="保健品", max_=15),
]
)
.add("", v1)
.set_colors(["red"])
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(title="全国药店药品销售额占比",pos_left="38%",pos_right="4%"),
)
)
radar.render_notebook()
展示图表:
使用 matplotlib还原示意图:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#【Matplotlib库绘图思路】
# 1. 创建一个画布实例 (fig = plt.figure())
# 2. 为指定画布做区域规划(subplot,subplots,subplot2grid, GridSpec类),--> ax = fig.subplot(221,polar=True)
# 并在对应区域内创建坐标系实例(直角坐标系实例,极坐标系实例)
# 3. 通过坐标系实例,调用对应的绘图方法,实现绘图(ax.plot, ax.scatter, ax.plot)
# 4. 图表辅助元素的定制和样式美化(定制化需求)---> ax.set_title(), ax.set_xticks()
# 0.【设置中文字体】
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
spec = gridspec.GridSpec(nrows=2,ncols=3,figure=fig)
ax1 = fig.add_subplot(spec[0,:]) # 二维数组的索引操作
ax2 = fig.add_subplot(spec[1,0])
ax3 = fig.add_subplot(spec[1,1])
ax4 = fig.add_subplot(spec[1,2],projection='polar')
# 1.【可视化第一个表格数据(柱形和折线融合图)】
# 1.1 准备数据
year_x=(2014,2015,2016,2017,2018,2019,2020,2021)
data_num = np.array([87430,90912,96225,101885,107147,116390,105764,120215]) # 诊疗量
data_speed = np.array([7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66]) # 同比增速
#--------------------------------------------------
ax1.bar(year_x,data_num)
ax_right = ax1.twinx() #创建一个共享x轴的坐标系实例
ax_right.plot(year_x,data_speed,'m-o')
ax_right.set_ylim(-20,20)
ax_right.set_ylabel('同比增速(%)')
# 2.【可视化第二个表格数据(饼图)】
# 2.1 准备数据
ratios = [2.2, 27.9, 56.2, 10.9, 2.8] # 各年龄段用户比例
labels = ['20岁以下','20-30岁','31-40岁','41-50岁','51岁以上']
ax2.pie(ratios,labels = labels,
textprops={'fontsize': 5},
wedgeprops={'width': 0.75},
pctdistance=0.75, # 调整数值标签的位置
autopct='%3.1f%%',
startangle=0) # 调整购物品类的位置
# 3.【可视化第三个表格数据(堆积柱形图)】
# 3.1 准备数据
x_labels = ['2019年','2020年','2021年','2022年','2023年']
year_x2 = np.arange(2019,2024,1)
data1 = np.array([20.3,22.0,23.5,22.5,22.3]) # 跨国企业占比
data2 = np.array([79.7,78.0,76.5,77.5,77.7]) # 本土企业占比
ax3.bar(year_x2,data1)
ax3.bar(year_x2,data2,bottom=data1)
ax3.set_xticks(year_x2)
ax3.set_xticklabels(x_labels,rotation=60)
# 4.【可视化第四个表格数据(雷达图)】
# 4.1 准备数据
dim_num = 6
radians = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
radians = np.concatenate((radians,[radians[0]]))
score = np.array([33,45,3,9,6,4]) # 各品类药品占比
score = np.concatenate((score,[score[0]]))
ax4.plot(radians,score)
# 5.【展示图表】
plt.show()
展示图表:
任务需求五:
将上述图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
from pyecharts.faker import Faker
# 柱图与折线图的组合
# 准备数据
x_data = ["{}年".format(i) for i in range(2014, 2022)]
y1_data = [87430,90912,96225,101885,107147,116390,105764,120215]
y2_data = [7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66]
# 柱形图
bar1 = (
Bar()
.add_xaxis(x_data)
.add_yaxis("诊疗量(万人次)",
y1_data,
z=0, # 加入z=0,就可以让折线图在柱形图上面
color="blue", # 左纵坐标的颜色
xaxis_index=1,yaxis_index=1)
.extend_axis(
# 坐标轴配置项(AxisOpts)
yaxis=opts.AxisOpts(
name="同比增速(%)",
min_= -20,
max_= 20,
#标签配置项(LabelOpts)
axislabel_opts=opts.LabelOpts(formatter="{value}%"),
#坐标轴轴脊配置项(AxisLineOpts)
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="red")#线条样式配置项(右纵坐标)
),
)
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))#设置是否显示柱形图标签
#设置全局配置项 set_global_opts()
.set_global_opts(yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="blue"))),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量",pos_left="27%",pos_right="4%"),
legend_opts=opts.LegendOpts(pos_right="10%")
)
)
# 折线图
line = (
Line()
.add_xaxis(x_data)
.add_yaxis("同比增速(%)",
y2_data,
xaxis_index=0,yaxis_index=1)
)
# 柱形堆积图
# 准备数据
list1 = [
{"value": 20.3, "percent": 20.3 / (20.3 + 79.7)},
{"value": 22.0, "percent": 22.0 / (22.0 + 78.0)},
{"value": 23.5, "percent": 23.5 / (23.5 + 76.5)},
{"value": 22.5, "percent": 22.5 / (22.5 + 77.5)},
{"value": 22.3, "percent": 22.3 / (22.3 + 77.7)},
]
list2 = [
{"value": 79.7, "percent": 79.7 / (20.3 + 79.7)},
{"value": 78.0, "percent": 78.0 / (22.0 + 78.0)},
{"value": 76.5, "percent": 76.5 / (23.5 + 76.5)},
{"value": 77.5, "percent": 77.5 / (22.5 + 77.5)},
{"value": 77.7, "percent": 77.7 / (22.3 + 77.7)},
]
# 柱形实例
bar2 = (
Bar()
.add_xaxis([2019, 2020, 2021, 2022, 2023])
.add_yaxis("跨国企业占比",
list1,
stack="stack1", # 数据堆叠
xaxis_index=1,yaxis_index=2)
.add_yaxis("本土企业占比",
list2,
stack="stack1",
xaxis_index=1,yaxis_index=2)
.set_global_opts(title_opts=opts.TitleOpts(
title='全国药店中药饮片供应商占比情况(单位:%)',
pos_top="50%", pos_left="35%"),
legend_opts=opts.LegendOpts(is_show=False))
)
# 环图
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_colors(["blue", "green", "yellow", "red", "pink", "purple"]) # 设置环图颜色
.set_global_opts(title_opts=opts.TitleOpts(title='中药材消费者画像数据',pos_top="50%",pos_left="10%"),
legend_opts=opts.LegendOpts(is_show=False))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%")) # 设置环图显示方式
)
bar1.overlap(line1) # 将折线图覆盖在柱状图的上面
grid = (
Grid()
.add( overlap_1, grid_opts=opts.GridOpts(pos_bottom="58%"),
is_control_axis_index=True
)
# 通过联合调整pos_top, pos_bottom, pos_left, pos_right四个参数,实现并行组合图表的任意布局
.add(bar2, grid_opts=opts.GridOpts(pos_top="58%", pos_bottom="5%", pos_left="40%", pos_right="35%"),
is_control_axis_index=True)
.add(pie, grid_opts=opts.GridOpts(pos_top="58%", pos_right="65%"), is_control_axis_index=True)
)
grid.render_notebook()
展示图表:
任务需求六:
将上述图1到图5,利用“轮播多图”的方式排布,得到图6。(也不太会哈哈哈哈)