使用pyecharts绘制多种图表

主要任务:

表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。(也不太会哈哈哈哈

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值