数据可视化之Pyecharts制作酷炫图表

python 擅于数据处理,echarts 是百度开源的数据可视化项目,将二者结合起来,也就诞生了 pyecharts 。本文将从相关特性、版本安装、绘图步骤、图表示例、图表组合、应用总结 等个6方面进行详细介绍,文章较长干货较多,建议先收藏再细看。获取完整源码见文末。

一. 相关特性

  1. 简洁的 API 设计,使用如丝滑般流畅,支持链式调用

  2. 囊括了 30+ 种常见图表,应有尽有支持主流 Notebook 环境,Jupyter
    Notebook 和 JupyterLab

  3. 可轻松集成至 Flask,Django 等主流 Web 框架

  4. 高度灵活的配置项,可轻松搭配出精美的图表 详细的文档和示例,帮助开发者更快的上手项目

  5. 多达 400+地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持

二. 版本安装

pyecharts 分为 v0.5.X 和 v1 两个大版本,v0.5 和 v1 间不兼容,v1 是一个新版本,并且二者代码差异较大。本文代码是基于 0.5.11版本。Windows 系统使用 win + R 命令输入 cmd ,执行以下代码即可安装。
安装 0.5.11 版本:

pip install pyecharts == 0.5.11

安装1.0.0版本:

pip install pyecharts == 1.0.0  #安装什么版本就==什么

如果下载较慢,可以换用下面方法:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts == 0.5.11

另外,我们在使用地图时需要另外导入下面几个包:
世界各国:pip install echarts-countries-pypkg
中国省级:pip install echarts-china-provinces-pypkg
中国市级:pip install echarts-china-cities-pypkg
中国县级: pip install echarts-china-counties-pypkg

三. 绘图步骤

1. 先介绍一些用到的主要函数:

add() :主要方法,用于添加图表的数据和设置各种配置项
render() :默认在根目录下生成一个 render.html 文件,支持设置文件保存位置
show_config() :打印输出图表的所有配置项

2. 基本上所有的图表类型都是这样绘制的:

chart_name = Type() #初始化具体类型图表
add() #加数据及配置项,基本都在操作这个函数
render() #生成 .html文件,可设置文件类型

四. 图表示例

Pyecharts 支持多种基本图表,本文包含下列常用类型:

柱状图 折线图 词云图
饼图 玫瑰图 漏斗图
箱型图 仪表盘 散点图
地理图 热力图 雷达图

相关讲解小笨聪已在代码注释里,我们直接看代码即可。以下示例均是先代码后图表顺序。

1. 柱状图

from pyecharts import Bar #导入bar模块
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] #设置x轴数据
v1 = [5, 20, 36, 10, 75, 90] #第一组数据
v2 = [10, 25, 8, 60, 20, 80] #第二组数据
bar = Bar("1.1.柱状图数据堆叠示例","我是副标题") #实例一个柱状图#
bar.use_theme("macarons")  # 指定图表显示的主题风格,后面会讲
bar.add("京东", attr, v1,mark_point=['average'],is_stack=True) #用add函数往图里添加数据并设置is_stack为堆叠
bar.add("淘宝", attr, v2, mark_point = ['max'], is_stack=True) #mark_point标记min,max,average, mark_line标记线
bar.render("1.1.柱状图数据堆叠示例.html") #保存为html类型

在这里插入图片描述


bar = Bar("1.2.x 轴和 y 轴交换")b
ar.add("京东", attr, v1,is_convert=True)#is_convert设置为true即交换XY轴,但不知为什么纵座标轴始终只显示数字
bar.add("淘宝", attr, v2,is_convert=True) #很多人遇到这样的困惑,暂时未找到解决办法
#bar.show_config()  #显示图表的所有配置
bar.render("1.2.柱状图x 轴和 y 轴交换.html")

在这里插入图片描述

import random
attr = ["{}天".format(i) for i in range(30)]
v1 = [random.randint(1, 30) for _ in range(30)] #创建数据
bar = Bar("1.3.柱状图伸缩示例",title_pos='center')#设置标题位置为center
bar.add("", attr, v1, is_label_show=True, is_datazoom_show=True) #设置datazoom
bar.render("1.3.柱状图缩放和滑动.html")

在这里插入图片描述

2. 漏斗图

from pyecharts import Funnel #导入漏斗图
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
value = [20, 40, 70, 80, 100, 140]
funnel = Funnel("2.漏斗图示例",width=600, height=400, title_pos='center',title_top = 'bottom')
funnel.add(
    "商品",attr,value,
    is_label_show=True, #显示标签
    label_pos="inside", #标签位置  label_pos="outside", 
    label_text_color="#fff", #颜色
    legend_orient="vertical",
    legend_pos="left",
    
)
funnel.render("2.漏斗图示例.html")

在这里插入图片描述

3. 仪表盘

from pyecharts import Gauge #和之前一样 ,导入相关绘图包
gauge = Gauge("仪表盘示例",width=600, height=400) #标题
gauge.add("确诊病例", "出院率",88) #数据
#gauge.show_config()
gauge.render("3.仪表盘.html")

在这里插入图片描述

4. 折线图

from pyecharts import Line #导入相关折线图
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
v1 = [5, 20, 36, 10, 30, 100]
v2 = [55, 40, 16, 60, 45, 80] #设置数据
line = Line("4.1.折线图示例") #创建一个实例
line.add("京东", attr, v1, 
         line_width = 3,line_color = 'red',  #设置线宽,线颜色
         mark_point=["average",{"coord":["Pad",10],"name":"这是我标记的第1个点"}]) #添加数据和标记点
line.add("淘宝", attr, v2, 
         is_smooth=True, #使用光滑曲线
         #is_datazoom_show =True,
         mark_line=["max", "average"], #标记线
         mark_point=[{"coord":["电脑",80],"name":"这是我标记的第2个点"}])
line.render("4.1.折线图示例.html")

在这里插入图片描述

from  pyecharts import Line
x = ['2018-{:0>2d}'.format(s) for s in range(1,13)]
y1 = [5,10,26,30,35,30,20,26,40,46,40,50]
y2 = [8,20,24,36,40,36,40,45,50,53,48,58]
line = Line("4.2折线图","月销售总额",width = 700,height = 450)
line.add(name = "京东", x_axis = x, y_axis = y1,
         #设置lineStyle
         line_width = 2,
         line_opacity = 0.5, # 透明度
         line_color = 'red',
         #设置markPoint\markLine
         mark_point = ['min','max'], #标记点
         mark_line = ['average'] #标记线
        )
line.add(name = "淘宝", x_axis = x, y_axis = y2,
         #设置xyAxis
         is_xaxis_boundarygap = False,  # x座标刻度对准数据,而不是作为分类边界
         yaxis_min = 0,yaxis_max = 100,  # 设置y座标轴刻度范围
         #设置dataZoom
         is_datazoom_show = True, #显示 dataZoom控制条
         #设置lineStyle
         line_width = 3,
         line_type = 'dashed', # 线型,可以是solid,dashed,或者dotted
         #设置markPoint\markLine
         mark_point = [{"coord": ['2018-09', 60], "name": "2018/09销售目标"}, 
          {"coord": ['2018-11', 80], "name": "2018/10销售目标"}]  # 自定义标记点
        )
line.render("4.2.折线图示例_详细设置.html")

在这里插入图片描述

5. 饼图(玫瑰图)

from pyecharts import Pie
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
v1 = [11, 12, 13, 30, 10, 40]
pie = Pie("5.1.饼图示例" ,title_pos='center')
pie.add("", attr, v1,
        #radius=[35,75],
        is_label_show=True,#显示标签
        legend_orient="vertical", legend_pos="right") #图例设置为垂直排列,右侧
pie.render("5.1.饼图示例_环形.html")
attr1 = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
v2 = [11, 12, 13, 10, 10, 10]
v3 = [19, 21, 32, 20, 20, 33]
pie1 = Pie("5.2.饼图-玫瑰图示例", title_pos='center', width=900)
pie1.add("京东",attr1, v2,
         center=[17, 50], is_random=True, #中心座标设置
         radius=[30, 75], #半径设置,则成为了圆环
         rosetype="radius", #加了这句代码,则按照占比正比于圆环半径显示
)
pie1.add(
    "淘宝",attr1,v3,
    center=[65, 50],is_random=True,
    radius=[30, 75],rosetype="area", #按照占比正比于圆环面积显示
    is_label_show=True, #显示商品标签,如电脑:22.76
    is_legend_show=True,#显示图例
    legend_top="bottom", #图例在下方显示
)
pie1.render("5.2.饼图示例_玫瑰形.html")

在这里插入图片描述

在这里插入图片描述

6.地图示例

from pyecharts import Map
value = [155, 10, 66, 148, 33, 80, 190, 53, 49,67,
         120,190,78,45,120,91,34, 88, 168, 64, 82, 
         26, 72, 101, 66, 164, 152, 41, 79,132,45]
attr = ["福建", "山东", "北京", "上海", "甘肃", "河南", "浙江", "吉林",  "西藏","辽宁",
        "江西","湖北","山西","黑龙江","新疆","内蒙古","云南","河北", "广东","湖南",
        "四川", "安徽","青海","陕西","江苏","重庆","贵州","广西","宁夏","海南","天津"]
map = Map("6.1.全国省份地图示例", width=800, height=550)
map.use_theme("macarons") 
map.add("",attr,value,
maptype="china", #设置中国
is_visualmap=True, #设置地图可见   
#is_label_show = True,
visual_text_color="#000", #地图背景颜色
visual_range=[1, 200], #设置图例范围 默认0-100
visual_range_text=["低", "高"],#设置图例上下度量,默认 low high      
# is_piecewise=True,  #去掉这个参数和下面的pieces则图例数值是连续显示的
# pieces=[{"max": 200, "min": 161, "label": "高"},
#       {"max": 160, "min": 101, "label": "中"},
#       {"max": 100, "min": 0, "label": "低"},]
)
map.render("6.1.全国省份地图.html")

在这里插入图片描述

from pyecharts import Map
value = [90, 60, 70, 80, 50, 47, 35, 21, 59, 48, 43]
attr = ['杭州市', '金华市', '温州市', '宁波市', '衢州市','丽水市','湖州市','绍兴市','嘉兴市','台州市','舟山市']
map = Map("6.2.浙江地图示例", width=800, height=550)
map.add("", attr, value, maptype="浙江",    #设置浙江省
        is_label_show = True, is_visualmap=True, visual_text_color="#000"
) 
map.render("6.2.浙江地图示例.html")

在这里插入图片描述

value = [95.1, 23.2, 43.3, 66.4, 88.5,23]
attr= ["China", "Canada", "Brazil", "Russia", "United States","Janpan"]
map = Map("6.3.世界地图示例", width=800, height=500)
map.add( "",attr,value,
    maptype="world", #设置世界地图
    is_visualmap=True,
    visual_text_color="#000",
    is_map_symbol_show=False,
    visual_orient="horizontal" #设置图例为水平放置
)
map.render("6.3.世界地图示例.html")

在这里插入图片描述

7.热力图

from pyecharts import Geo
data = [
    ("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),
    ("盐城", 15),("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21),
    ("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25),
    ("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26), 
    ("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28), 
    ("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31),
    ("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33), 
    ("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36),
    ("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37),("惠州", 37),
    ("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38),
    ("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40),
    ("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43),
    ("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45),
    ("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50),
    ("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52),
    ("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54),
    ("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58),
    ("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59),
    ("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63),
    ("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66),
    ("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71),
    ("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75),
    ("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84),
     ("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86),
    ("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96),
    ("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)
    ("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104),
    ("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114),    
    ("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),
    ("德州", 120),("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134),
    ("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153),
    ("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193),
    ]
geo = Geo("全国主要城市空气质量热力图.html", "data from pm2.5", title_color="#fff",
         title_pos="center", width=800,height=550, background_color='#404a59')
attr, value = geo.cast(data) # 换个方式读取数据
geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",
        type='effectScatter', 
        symbol_size=15, is_visualmap=True)
geo.render("7.1.全国主要城市空气质量热力图.html")

在这里插入图片描述

geo.add("", attr, value,visual_range=[0, 200], visual_text_color="#fff",
        type="scatter",effect_scale=5,symbol_size=15,is_visualmap=True)
geo.render("7.2.全国主要城市空气质量热力图.html")

在这里插入图片描述

geo.add("", attr, value, is_visualmap=True, visual_range=[0, 300],visual_text_color='#fff',
       type="heatmap",)
geo.render("7.3.全国主要城市空气质量热力图.html")

在这里插入图片描述

from pyecharts import GeoLines, Style
style = Style(title_pos = "center",width=800,height=500,background_color="#404a59")
style_geo = style.add(is_label_show=True,line_curve=0.2,line_opacity=0.8,legend_text_color="#42A5F5",
    legend_pos="left",geo_effect_symbol="plane",geo_effect_symbolsize=15,label_color=['#42A5F5', '#BA22FF', '#46bee9'],
    label_pos="right",label_formatter="{b}",label_text_color="#FFFFFF",)
data_guangzhou = [
    ["武汉", "上海"],["武汉", "北京"],["武汉", "南京"], ["武汉", "成都"],
    ["武汉", "郑州"],["武汉", "杭州"],["武汉", "厦门"],["武汉", "深圳"],
    ["武汉", "西安"],["武汉", "贵阳"],["武汉", "乌鲁木齐"],["武汉", "长沙"],
]
geolines = GeoLines("7.4.出行线路示例", **style.init_style)
geolines.add("从武汉出发", data_guangzhou, **style_geo)
geolines.render("7.4.地理座标系线图.html")

在这里插入图片描述

8. 雷达图

from pyecharts import Radar
radar = Radar("8.雷达图", "一年的降水量与蒸发量",width=700,height=450)
#由于雷达图传入的数据得为多维数据,所以这里需要做一下处理
radar_data1 = [[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]]
radar_data2 = [[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]]
#设置column的最大值,为了雷达图更为直观,这里的月份最大值设置有所不同
schema = [ 
    ("Jan", 5), ("Feb",10), ("Mar", 10),
    ("Apr", 50), ("May", 50), ("Jun", 200),
    ("Jul", 200), ("Aug", 200), ("Sep", 50),
    ("Oct", 50), ("Nov", 10), ("Dec", 5)
]
#传入座标
radar.config(schema)
radar.add("降水量",radar_data1)
#一般默认为同一种颜色,这里为了便于区分,需要设置item的颜色
radar.add("蒸发量",radar_data2,item_color="#1C86EE")
radar.render("8.雷达图.html")

在这里插入图片描述

9. 词云图

from pyecharts import WordCloud
name = ['Python','C','C++','Matlab','R','Java','Php','Go','SQL','C#','.Net']
value = [98,60,68,70,72,104,55,60,46,60,49]
wordcloud = WordCloud(width=500, height=500)
wordcloud.add("", name, value,shape = "diamond",word_size_range=[20,70]) #设置大小、形状
wordcloud.render("9.词云图.html")

在这里插入图片描述

10. 箱型图

from pyecharts import Boxplot
x =['1班','2班','3班','4班']
y1=[78, 98, 56, 78, 90.0, 45, 78, 20, 87, 86, 74, 89, 94]
y2=[89, 82, 45, 67, 68, 78.0, 79, 98, 71, 56, 78, 81, 80]
y3=[90, 80, 60, 89, 76, 73.0, 72, 92, 89, 87, 65, 66, 76]
y4=[82, 72, 55, 100, 90.0, 78, 69, 67, 87, 66, 78, 71, 82]
box = Boxplot(title = '10.考试成绩箱型图',width = 700,height = 450)
# 预处理数据计算最大值,最小值,中位数以及上下四分位数
y_prepared = box.prepare_data([y1,y2,y3,y4]) 
box.add(name = '',x_axis = x,y_axis = y_prepared)
box.render("10.箱型图.html")

在这里插入图片描述

11. 散点-气泡图

from pyecharts import Scatter
v1 = [5,20,35,50,65,80]
v2 = [10,20,30,40,50,60]
scatter = Scatter('11.散点-气泡示例图')
scatter.add('A',v1,v2,symbol_size = 20)
scatter.add('B',v1[::-1],v2,    #v1[::-1]代表切片倒序
            is_visualmap = True,    #显示滑动条
            symbol_size = 30,       #显示图内标点大小
            vasual_range_size = [20,80]) #显示滑动范围
scatter.render('11.散点气泡图.html')   

在这里插入图片描述

五. 图表组合

我们经常需要在一个界面显示多个图表,也就是图表组合,pyecharts 支持四种图表组合,分别是:

  1. Grid:可将多个类型的图表放在一个界面显示
  2. Overlap:可将多个类型的图表放在一张图中同时显示
  3. Page:将多个图表按顺序展示在一张网页中,里面可以放置其他三种类型的图表
  4. Timeline:将多个图表制成轮播图,动态播放

12. Grid 图表组合

from pyecharts import Bar, Line, Grid

x = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
y1 = [5, 20, 36, 10, 75, 90]
y2 = [10, 25, 8, 60, 20, 80]
bar = Bar("柱状图示例",title_pos="30%")
bar.use_theme("macarons")  #指定图表主题为 macarons 
# 还不错的主题:shine   halloween  macarons  roma
bar.add("京东", x, y1, is_stack=True)
bar.add("淘宝", x, y2, is_stack=True,legend_top="7%",legend_pos="28%")

line = Line("折线图示例", title_top="45%",title_pos="40%")
x = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
y3 = [9, 10, 14, 13, 11, 13, 10]
y4 = [1, 2, 3, 5, 3, 2, 0]
line.add("卖出",x,y3,mark_point=["max", "min"],mark_line=["average"])
line.add("买入",x,y4,mark_point=["max", "min"],mark_line=["average"],legend_top="52%",legend_pos="37%")

grid = Grid(height = 600,width = 800)  #设置总的宽和高
#利用grid_bottom,grid_top,grid_left,grid_right四个参数控制子图的相对位置
#通过调节上述四个参数,可以放置多个图表,当然相应的title、legend、label也需要相应改变才美观
grid.add(bar, grid_bottom="63%",grid_right="20%")  
grid.add(line, grid_top="60%",grid_right="20%")
grid.render('12.利用Grid进行组合.html')  

在这里插入图片描述

13. Overlap图表组合

from pyecharts import Line, Bar, Overlap

attr = ["{}月".format(i) for i in range(1, 13)]
v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 102.6, 60.0, 6.4, 3.3]
v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 98.7, 58.8, 6.0, 2.3]
v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 12.5, 8.0, 3.4]
bar = Bar("14.降水量蒸发量和温度示例")
bar.use_theme("macarons") 
bar.add("蒸发量", attr, v1)
bar.add("降水量", attr, v2, yaxis_formatter=" ml",yaxis_interval=50, yaxis_max=250)

line = Line()
line.add("平均温度", attr, v3, yaxis_formatter=" °C", yaxis_interval=5)

overlap = Overlap(width=800, height=500)
# 默认不新增 x y 轴,并且 x y 轴的索引都为 0
overlap.add(bar)
# 新增一个y轴,此时 y 轴的数量为2,第二个y轴的索引为1(索引从 0 开始),所以设置 yaxis_index = 1
# 使用的是同一个 x 轴,x 轴部分不用做出改变
overlap.add(line, yaxis_index=1, is_add_yaxis=True)
overlap.render("14.利用Overlap进行图表组合_双座标轴.html")

在这里插入图片描述

from pyecharts import Line,EffectScatter,Overlap #导入相关折线图
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
v1 = [55, 40, 16, 60, 45, 80] 
line = Line("14.2线性闪烁示例")
line.use_theme("macarons") 
line.add("", attr, v1, is_smooth=True,
         is_datazoom_show =True,
         mark_line=["max", "average"], #光滑线  标记线
         mark_point=[{"coord":["Pad",60],"name":"这是我标记的第2个点"}
         ])
es = EffectScatter()
es.add('',attr,v1,effect_scale=8)   #闪烁
overlop = Overlap()
overlop.add(line)                   #必须先添加line,在添加es
overlop.add(es)
overlop.render('14.2线性闪烁示例.html')

在这里插入图片描述

14. Page 图表组合

from pyecharts import Bar, Scatter3D
from pyecharts import Page
page = Page()         
# bar
attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]
bar = Bar("15.柱状图数据堆叠示例",width = 700,height = 300)
bar.use_theme("macarons") 
bar.add("京东", attr, v1, is_stack=True)
bar.add("淘宝", attr, v2, is_stack=True)
page.add(bar)         
# scatter3D
import random
data = [[random.randint(0, 100),random.randint(0, 100),random.randint(0, 100)] for _ in range(80)]
range_color = [ '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', 
               '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
scatter3D = Scatter3D("3D 散点图示例", width= 700, height=300)
scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color)
page.add(scatter3D)  
page.render('15.Page图表组合.html')

在这里插入图片描述

14. Timeline 图表组合

from pyecharts import Bar, Timeline
from random import randint

attr = ["音响", "电视", "相机", "Pad", "手机", "电脑"] 
bar_1 = Bar("2017 年销量", "数据纯属虚构")
bar_1.add("第一季度", attr, [randint(10, 100) for _ in range(6)])
bar_1.add("第二季度", attr, [randint(10, 100) for _ in range(6)])
bar_1.add("第三季度", attr, [randint(10, 100) for _ in range(6)])
bar_1.add("第四季度", attr, [randint(10, 100) for _ in range(6)])

bar_2 = Bar("2018 年销量", "数据纯属虚构")
bar_2.add("第一季度", attr, [randint(10, 100) for _ in range(6)])
bar_2.add("第二季度", attr, [randint(10, 100) for _ in range(6)])
bar_2.add("第三季度", attr, [randint(10, 100) for _ in range(6)])
bar_2.add("第四季度", attr, [randint(10, 100) for _ in range(6)])

bar_3 = Bar("2019 年销量", "数据纯属虚构")
bar_3.add("第一季度", attr, [randint(10, 100) for _ in range(6)])
bar_3.add("第二季度", attr, [randint(10, 100) for _ in range(6)])
bar_3.add("第三季度", attr, [randint(10, 100) for _ in range(6)])
bar_3.add("第四季度", attr, [randint(10, 100) for _ in range(6)],is_legend_show=True)
timeline = Timeline(is_auto_play=True,
                    timeline_bottom=0,
                    timeline_play_interval=1000  # 每 xxx ms播放一张
                   )
timeline.add(bar_1, '2017 年')
timeline.add(bar_2, '2018 年')
timeline.add(bar_3, '2019 年')
timeline.render("16.1利用Timeline图表组合_轮播图1.html")

在这里插入图片描述

from pyecharts import Map, Timeline
from random import randint

value1 = [155, 10, 66, 148, 33, 80, 190, 53, 49.6]
attr1 = ["福建", "山东", "北京", "上海", "甘肃", "河南", "浙江", "吉林", "西藏"]
map1 = Map("2015年全国各省脱贫人数",title_pos='center')
map1.add("",attr1,value1,maptype="china",is_visualmap=True,visual_text_color="#000")

value2 = [15, 100, 36, 48, 35, 40, 160, 43, 41]
attr2 = ["安徽", "广西", "新疆" , "河南", "浙江", "吉林","上海", "甘肃","西藏"]
map2 = Map("2016年全国各省脱贫人数",title_pos='center')
map2.add("",attr2,value2,maptype="china",is_visualmap=True,visual_text_color="#000")

value3 = [55, 10, 66, 148, 33, 80, 110, 13, 60]
attr3 = ["福建", "山东", "北京", "上海", "甘肃", "河南", "山东", "吉林", "陕西"]
map3 = Map("2017年全国各省脱贫人数",title_pos='center')
map3.add("",attr3,value3,maptype="china",is_visualmap=True,visual_text_color="#000")

value4 = [15, 80, 30, 108, 53, 40, 90, 13, 20]
attr4= ["黑龙江", "江苏", "天津", "宁夏", "云南", "山西","四川", "甘肃", "河南",]
map4= Map("2018年全国各省脱贫人数",title_pos='center')
map4.add("",attr4,value4,maptype="china",is_visualmap=True,visual_text_color="#000")
value5 = [69, 40, 90, 13, 28, 30,58, 108, 53,]
attr5= ["内蒙古", "吉林", "山东", "四川", "甘肃", "河南", "浙江", "云南", "海南"]
map5= Map("2019年全国各省脱贫人数",title_pos='center')
map5.add("",attr5,value5,maptype="china",is_visualmap=True,visual_text_color="#000")
timeline = Timeline(is_auto_play=True,
                    timeline_bottom=0,
                    timeline_play_interval=1000,  # 每1000ms播放一张
                    width=800, height=600,
                    timeline_left="10%"  #timeline_left=80
                   )
timeline.add(map1, '2015 年')
timeline.add(map2, '2016 年')
timeline.add(map3, '2017 年')
timeline.add(map4, '2018 年')
timeline.add(map5, '2019 年')
timeline.render("16.2利用Timeline图表组合_轮播图2.html")

在这里插入图片描述

六. 应用与总结

总的来看,绘图着重两步,一是数据的获取与读入,文中数据只是随意写的,真正处理时往往会用到对字典列表元组的迭代、切片操作,或者用到 Pandas、Nump 、MySQL等相关库的基础知识;二是进行各项参数配置,这里面涉及很多细节。

当希望将多个图表综合展示时,我们需要图表组合设计,不仅需要基本图表知识,还需要有全局观和审美感。我们来看一个典型应用,清华大学数据库组的新冠疫情可视化项目

在这里插入图片描述
在这里插入图片描述
我们可看到,在该项目里,分别用到了含地图的时间轮播(Timeline)图、饼图、含座标轴伸缩的折线图、含标记点的可伸缩的条形堆叠图、可伸缩座标轴的散点气泡图和含饼图的日历图。这些图表在文章里小笨聪大多都已经介绍过了,当图表结合数据进行分析时,是不是更加清晰有效呢。所以大家也可以试着找一些数据,练习一下可视化。

综合来看,Pyecharts 适合于制作动态交互式图表,可用于爬取的热评影评可视化,疫情数据分析,股票行情显示等众多场景,是一个很不错很友好的可视化工具。

微信公众号“学编程的金融客” 后台回复“pyecharts”即可获取完整代码。

附:
Pyecharts 官网:
https://pyecharts.org/#/zh-cn/intro
清华大学疫情可视化项目:
https://ncov.deepeye.tech/

欢迎关注微信公众号:学编程的金融客,作者:小笨聪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章