使用Pyecharts渲染图表(2)

使用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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值