需求一: 基于pyecharts,用柱形图和折线图在同一个坐标系展示表1数据,得到图1。
代码如下:
#导入模块
%matplotlib notebook
import pyecharts
import pyecharts.options as opts
import numpy as np
#导入需要用到的图表类
from pyecharts.charts import Bar, Line
#设置x轴的数据
x_data = ["2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021"]
#绘制柱形图
bar = (
Bar()
#设置系列配置项
.add_xaxis(xaxis_data=x_data)#设置x轴的数据
.add_yaxis(
series_name="",
#设置y轴的数据
y_axis=["87430","90912","96225","101885","107147","116390","105764","120215"],
label_opts=opts.LabelOpts(is_show=False),
#设置柱形图的柱形颜色和透明度
itemstyle_opts=opts.ItemStyleOpts(color="orange",opacity=0.5)
)
#增加了以温度为刻度的纵轴标签(延伸多一条纵轴标签)
.extend_axis(
#设置y轴
yaxis=opts.AxisOpts(
name="同比增速(%)", #y轴标签
name_location="center", #位置
name_gap=60, #与y轴的距离
type_="value", #设置y轴的类型(value数值,category类目,time时间,log对数)
min_=-20, #y轴数值最小值
max_=20, #y轴数值最大值
interval=10, #y轴数值的显示间隔
axislabel_opts=opts.LabelOpts(formatter="{value} "), #设置y轴数值后的标记单位注释
name_textstyle_opts=opts.TextStyleOpts(font_size=20) #y轴标签(字体)的大小
)
)
#设置全局配置项
.set_global_opts(
#提示框组件的配置项
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"
),#是否显示提示框组件、提示框触发的条件、指示器类型
#x轴的配置项
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
),
#y轴的配置项
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)", #y轴标签
name_location="center", #位置
name_gap=60, #与y轴的距离
type_="value", #设置y轴的类型(value数值,category类目,time时间,log对数)
min_=0, #y轴数值最小值
max_=150000, #y轴数值最大值
interval=50000, #y轴数值的显示间隔
axislabel_opts=opts.LabelOpts(formatter="{value} ", position="left"), #设置y轴数值后的标记单位注释、位置
axistick_opts=opts.AxisTickOpts(is_show=True), #坐标轴刻度配置项
splitline_opts=opts.SplitLineOpts(is_show=True), #分割线配置项
name_textstyle_opts=opts.TextStyleOpts(font_size=20) #y轴标签(字体)的大小
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量"), #图表标题
legend_opts=opts.LegendOpts(align='right') #图例位置
)
)
#绘制折线图
line = (
Line()
.add_xaxis(xaxis_data=x_data) #设置x轴数据
.add_yaxis(
series_name="",
yaxis_index=1, #y轴的索引,用于多个y轴的单图表中
y_axis=["7.40","4.00","5.83","5.81","5.16","8.63","-9.13","13.66"], 设置y轴数据
label_opts=opts.LabelOpts(is_show=False),
symbol="triangle", #标记符号
symbol_size=20, #标记符号大小
itemstyle_opts=opts.ItemStyleOpts(
border_width=3, color="purple"
) #标记符号边框大小、颜色
)
)
#渲染图表(2种方式)
#一.直接渲染到notebook
bar.overlap(line).render_notebook()
#二.渲染到本地html文件
#bar.overlap(line).render("mixed_bar_and_line.html")
运行程序,效果如图:
需求二: 基于pyecharts,用环图展示表2数据,得到图2。
代码如下:
#导入模块
from pyecharts import options as opts
from pyecharts.charts import Pie
#准备数据
data = [['20岁以下',2.2],['20-30岁',27.9],['31-40岁',56.2],['41-50岁',10.9],['51岁以上',2.8]]
#绘制环图
pie = (
Pie()
.add("",data,radius=["40%", "75%"], ) #圆环的半径
.set_colors(["blue","orange","green","red","purple"]) #环的各个部分的颜色
.set_global_opts(
title_opts=opts.TitleOpts(title="中药材消费者画像数据")) #标题
.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
#绘制堆积图
bar1 = (
Bar()
.add_xaxis(['2019年','2020年','2021年','2022年','2023年'] ) #设置x轴
.add_yaxis("跨国企业占比(%)", [20.3, 22.0, 23.5, 22.5, 22.3], #设置y轴
stack="stack1",itemstyle_opts=opts.ItemStyleOpts(color="blue"))
.add_yaxis("本土企业占比(%)", [79.7, 78.0, 76.5, 77.5, 77.7],
stack="stack1",itemstyle_opts=opts.ItemStyleOpts(color="orange"))
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)), #旋转角度
title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比情况"),
)
)
#渲染图表
bar1.render_notebook()
运行程序,效果如图:
需求四: 请基于pyecharts,用雷达图展示表4数据,得到图4。
代码如下:
#导入模块
from pyecharts import options as opts
from pyecharts.charts import Radar
#准备数据
v1 = [[33, 45, 3, 9, 6, 4]]
#绘制雷达图
polar = (
Radar()
#雷达指示器配置项列表
.add_schema(
schema=[
opts.RadarIndicatorItem(name="化学药", max_=50),
opts.RadarIndicatorItem(name="中成药", max_=50),
opts.RadarIndicatorItem(name="生物制品", max_=50),
opts.RadarIndicatorItem(name= "医疗器械", max_=50),
opts.RadarIndicatorItem(name="中药饮片", max_=50),
opts.RadarIndicatorItem(name="保健品", max_=50),
]
)
.add("药品类型占比", v1)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #标签
.set_global_opts(
legend_opts=opts.LegendOpts(selected_mode="single"), #图例选择模式
title_opts=opts.TitleOpts(title="全国药店药品销售额占比"), #标题
)
)
#渲染图表
polar.render_notebook()
运行程序,效果如图:
需求五:将上述图1到图4,利用“并行多图”的方式排布,得到图5。
Grid类:并行显示多个图表时,第一个图需为有x轴或者y轴的图,即不能为Pie,其他顺序任意
代码如下:
#导入模块
%matplotlib notebook
import pyecharts
import pyecharts.options as opts
import numpy as np
#导入需要用到的图表类
from pyecharts.charts import Bar, Line, Pie, Grid
#图一:柱&折线图(解析如上)
#设置x轴的数据
x_data = ["2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021"]
#绘制柱形图
bar = (
Bar()
#设置系列配置项
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="",
y_axis=["87430","90912","96225","101885","107147","116390","105764","120215"],
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color="orange",opacity=0.5),
z = 0
)
.extend_axis(
yaxis=opts.AxisOpts(
name="同比增速(%)",
name_location="center",
name_gap=60,
type_="value",
min_=-20,
max_=20,
interval=10,
axislabel_opts=opts.LabelOpts(formatter="{value} "),
name_textstyle_opts=opts.TextStyleOpts(font_size=20)
)
)
#设置全局配置项
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)",
name_location="center",
name_gap=60,
type_="value",
min_=0,
max_=150000,
interval=50000,
axislabel_opts=opts.LabelOpts(formatter="{value} ", position="left"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
name_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量"),
legend_opts=opts.LegendOpts(align='right')
)
)
#绘制折线图
line = (
Line()
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="",
yaxis_index=1,
y_axis=["7.40","4.00","5.83","5.81","5.16","8.63","-9.13","13.66"],
label_opts=opts.LabelOpts(is_show=False),
symbol="triangle",
symbol_size=20,
itemstyle_opts=opts.ItemStyleOpts(
border_width=3, color="purple"
)
)
)
#图三:
#堆积图(解析如上)
#xaxis_index=1,yaxis_index=2
#在并行多图里,有多个x轴或y轴的数据,此处便是帮它正确定位,不然数据一般会默认在第一个坐标轴里
bar1 = (
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=2,itemstyle_opts=opts.ItemStyleOpts(color="blue"))
.add_yaxis("本土企业占比(%)", [79.7, 78.0, 76.5, 77.5, 77.7],
stack="stack1",xaxis_index=1,
yaxis_index=2,itemstyle_opts=opts.ItemStyleOpts(color="orange"))
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比情况",pos_top="50%", pos_left="35%"), #标题在图布中的位置
legend_opts=opts.LegendOpts(is_show=False)
)
)
#图二:
#环图(解析如上)
data = [['20岁以下',2.2],['20-30岁',27.9],['31-40岁',56.2],['41-50岁',10.9],['51岁以上',2.8]]
pie = (
Pie()
.add("",data,radius=["30%", "15%"] ,center=[150,380]) #圆环中心的位置
.set_colors(["blue","orange","green","red","purple"])
.set_global_opts(
title_opts=opts.TitleOpts(title="中药材消费者画像数据",pos_top="49%", pos_left="5%"), #标题的位置
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%"))
)
#在柱形图的基础上叠加折线图
bar.overlap(line)
#Gird是一个布局多个图表的容器
#pos_bottom,pos_top,pos_left, pos_right:grid组件离容器下、上、左、右的位置
#is_control_axis_index:表示是否由自己控制坐标轴索引
grid = Grid(init_opts=opts.InitOpts())
grid.add(bar, opts.GridOpts(pos_bottom="60%",pos_top="1%",pos_left="10%", pos_right="20%"), is_control_axis_index=True)
grid.add(bar1, opts.GridOpts(pos_bottom="10%",pos_top="60%",pos_left="40%", pos_right="40%"), is_control_axis_index=True)
grid.add(pie, grid_opts=opts.GridOpts(pos_bottom="1%",pos_top="1%",pos_left="40%", pos_right="65%"), is_control_axis_index=True)
#渲染图表
grid.render_notebook()
运行程序,效果如图: