前言
我们都知道python上的一款可视化工具 matplotlib , 但是它是静态的。后来发现了 pyecharts 模块,简直好用到不行,可视化类型非常多,它是基于 Echarts 开发的。
Echarts 是百度开源的一个数据可视化 JS 库,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 就诞生了。
下面带大家快速了解 pyecharts 以及基本使用方法:
✨ 特性
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图,为地理数据可视化提供强有力的支持
✨ 安装
1pip install pyecharts
注意:pyecharts 共有两个版本,v0.5.X 和 V1.0.X 间完全不兼容,且v0.5.X版本作者已经不维护了,请使用V1.0.X
示例数据
pyecharts 给我们提供了示例数据,后面的图表示例的数据均来自 Faker 类,Faker 类的定义如下:
1class Faker: 2 clothes = ["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"] 3 drinks = ["可乐", "雪碧", "橙汁", "绿茶", "奶茶", "百威", "青岛"] 4 phones = ["小米", "三星", "华为", "苹果", "魅族", "VIVO", "OPPO"] 5 fruits = ["草莓", "芒果", "葡萄", "雪梨", "西瓜", "柠檬", "车厘子"] 6 animal = ["河马", "蟒蛇", "老虎", "大象", "兔子", "熊猫", "狮子"] 7 cars = ["宝马", "法拉利", "奔驰", "奥迪", "大众", "丰田", "特斯拉"] 8 dogs = ["哈士奇", "萨摩耶", "泰迪", "金毛", "牧羊犬", "吉娃娃", "柯基"] 9 week = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] 10 week_en = "Saturday Friday Thursday Wednesday Tuesday Monday Sunday".split() 11 clock = ( 12 "12a 1a 2a 3a 4a 5a 6a 7a 8a 9a 10a 11a 12p " 13 "1p 2p 3p 4p 5p 6p 7p 8p 9p 10p 11p".split() 14 ) 15 visual_color = [ 16 "#313695", 17 "#4575b4", 18 "#74add1", 19 "#abd9e9", 20 "#e0f3f8", 21 "#ffffbf", 22 "#fee090", 23 "#fdae61", 24 "#f46d43", 25 "#d73027", 26 "#a50026", 27 ] 28 months = ["{}月".format(i) for i in range(1, 13)] 29 provinces = ["广东", "北京", "上海", "江西", "湖南", "浙江", "江苏"] 30 guangdong_city = ["汕头市", "汕尾市", "揭阳市", "阳江市", "肇庆市", "广州市", "惠州市"] 31 country = [ 32 "China", 33 "Canada", 34 "Brazil", 35 "Russia", 36 "United States", 37 "Africa", 38 "Germany", 39 ] 40 days_attrs = ["{}天".format(i) for i in range(30)] 41 days_values = [random.randint(1, 30) for _ in range(30)] 42 43 def choose(self) -> list: 44 return random.choice( 45 [ 46 self.clothes, 47 self.drinks, 48 self.phones, 49 self.fruits, 50 self.animal, 51 self.dogs, 52 self.week, 53 ] 54 ) 55 56 @staticmethod 57 def values(start: int = 20, end: int = 150) -> list: 58 return [random.randint(start, end) for _ in range(7)] 59 60 @staticmethod 61 def rand_color(): 62 return random.choice( 63 [ 64 "#c23531", 65 "#2f4554", 66 "#61a0a8", 67 "#d48265", 68 "#749f83", 69 "#ca8622", 70 "#bda29a", 71 "#6e7074", 72 "#546570", 73 "#c4ccd3", 74 "#f05b72", 75 "#444693", 76 "#726930", 77 "#b2d235", 78 "#6d8346", 79 "#ac6767", 80 "#1d953f", 81 "#6950a1", 82 ] 83 )
常用的图表类型
Bar:柱状图/条形图
柱状图对应的模块是 Bar
除此之外可以设置全局配置和系列配置项。配置项都是基于 options
示例代码:
1# coding: utf-8 2from example.commons import Faker 3from pyecharts import options as opts 4from pyecharts.charts import Bar 5 6def bar_base(): 7 8 bar = Bar(init_opts=opts.InitOpts(page_title="bar页面")) # 设置html页面标题 9 # bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]) # 设置x轴的参数 10 11 bar.add_xaxis(Faker.choose()) 12 bar.add_yaxis("A", Faker.values()) 13 bar.add_yaxis("B", Faker.values()) 14 15 # 设置全局配置项,可选 16 bar.set_global_opts(opts.TitleOpts(title="主标题", subtitle="副标题")) 17 # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件 18 bar.render("bar.html") # 也可以自己指定文件名 19 20if __name__ == "__main__": 21 bar_base()
运行代码后会在当前目录生成一个 ”bar.html“ 的文件,我们在浏览器中打开它。效果图如下:
bar.html
生成的页面支持-点击取消显示某 Series
只显示A
除了上述的使用方法之外,pyecharts 所有方法均支持链式调用!
翻转XY轴
代码如下:
1def bar_reversal_axis() -> Bar: 2 3 # pyecharts 所有方法均支持链式调用。 4 c = ( 5 Bar(init_opts=opts.InitOpts(page_title="bar页面")) 6 .add_xaxis(Faker.choose()) 7 .add_yaxis("商家A", Faker.values()) 8 .add_yaxis("商家B", Faker.values()) 9 .reversal_axis() 10 .set_global_opts(toolbox_opts=opts.ToolboxOpts()) # 设置工具箱配置项 11 .set_series_opts(label_opts=opts.LabelOpts(position="right")) # 系列配置项 12 .set_global_opts(title_opts=opts.TitleOpts(title="Bar-翻转 XY 轴")) # 全局配置项 13 ) 14 return c 15 16 17if __name__ == "__main__": 18 bar_reversal_axis().render("bar.html")
效果图如下:
翻转 XY 轴
部分堆叠数据
同个类目轴上系列配置相同的 stack 值可以堆叠放置
例如堆叠放置A,B的代码如下:
1def bar_stack1() -> Bar: 2 c = ( 3 Bar() 4 .add_xaxis(Faker.choose()) 5 6 # 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。 7 # stack: Optional[str] = None, 8 .add_yaxis("A", Faker.values(), stack="stack1") 9 .add_yaxis("B", Faker.values(), stack="stack1") 10 .add_yaxis("C", Faker.values()) 11 .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) 12 .set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(部分)")) 13 ) 14 return c
部分堆叠数据
区域缩放配置项
1def bar_datazoom_slider() -> Bar: 2 c = ( 3 Bar(init_opts=opts.InitOpts(page_title="bar页面")) 4 .add_xaxis(Faker.days_attrs) 5 .add_yaxis("商家A", Faker.days_values) 6 .set_global_opts( 7 title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"), 8 datazoom_opts=[opts.DataZoomOpts(type_="slider",)] 9 ) 10 ) 11 return c
区域缩放配置项的设置方法在 DataZoomOpts 类中,我们可以点进去查看源码:
源码
其中,主要用到的参数含义如下:
1 type_: str = "slider", # 组件类型,可选 "slider", "inside" 2 # 拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。 3 is_realtime: bool = True, 4 5 # 布局方式是横还是竖。可选值为:'horizontal', 'vertical' 6orient: str = "horizontal",
知道参数的含义后我们可以来试试效果
比如我们要将区域缩放布局改为竖,将 orient 定义为 vertical 即可,代码就不展示,可以自己动手试试!
HeatMap:热力图
热力图主要通过颜色去表现数值的大小,必须要配合 visualMap 组件使用。
直角坐标系上必须要使用两个类目轴。
热力图使用的方法函数是 add_yaxis,下面是函数的用法说明:
1def add_yaxis( 2 # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 3 series_name: str, 4 5 # Y 坐标轴数据 6 yaxis_data: Sequence, 7 8 # 系列数据项 9 value: Sequence, 10 11 # 是否选中图例 12 is_selected: bool = True, 13 14 # 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 15 xaxis_index: Optional[Numeric] = None, 16 17 # 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。 18 yaxis_index: Optional[Numeric] = None, 19 20 # 标签配置项,参考 `series_options.LabelOpts` 21 label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(), 22 23 # 标记点配置项,参考 `series_options.MarkPointOpts` 24 markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None, 25 26 # 标记线配置项,参考 `series_options.MarkLineOpts` 27 markline_opts: Union[opts.MarkLineOpts, dict, None] = None, 28 29 # 提示框组件配置项,参考 `series_options.TooltipOpts` 30 tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, 31 32 # 图元样式配置项,参考 `series_options.ItemStyleOpts` 33 itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, 34) 35
其中series_name, yaxis_data, value 是三个必传参数
示例代码如下:
1import random 2from example.commons import Faker 3from pyecharts import options as opts 4from pyecharts.charts import HeatMap 5 6 7def heatmap_base() -> HeatMap: 8 value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] 9 c = ( 10 HeatMap() 11 .add_xaxis(Faker.clock) 12 .add_yaxis("series", Faker.week, value) 13 .set_global_opts(title_opts=opts.TitleOpts(title="HeatMap-基本示例"), 14 visualmap_opts=opts.VisualMapOpts(), ) 15 ) 16 17 return c 18 19 20if __name__ == "__main__": 21 heatmap_base().render("heatMap.html")
WordCloud:词云图
词云图用的的方法函数是 add,使用方法如下:
1def add( 2 # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 3 series_name: str, 4 5 # 系列数据项,[(word1, count1), (word2, count2)] 6 data_pair: Sequence, 7 8 # 词云图轮廓,有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选 9 shape: str = "circle", 10 11 # 单词间隔 12 word_gap: Numeric = 20, 13 14 # 单词字体大小范围 15 word_size_range=None, 16 17 # 旋转单词角度 18 rotate_step: Numeric = 45, 19 20 # 提示框组件配置项,参考 `series_options.TooltipOpts` 21 tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, 22) 23
其中series_name, data_pair, shape 是三个必传参数
示例代码如下:
1from pyecharts.charts import WordCloud 2from pyecharts import options as opts 3 4words = [ 5 ("火箭", 10000), 6 ("勇士库里", 8888), 7 ("在你写这个教程之前,我已经会用了", 6181), 8 ("哈登", 6386), 9 ("金州拉文", 5055), 10 ("杜兰特", 6467), 11 ("戳眼", 2244), 12 ("NBA", 1868), 13 ("季后赛", 1484), 14 ("约老师", 1112), 15 ("利拉德", 865), 16 ("双卡双待", 847), 17 ("字母歌MVP", 5582), 18 ("卡哇伊", 555), 19 ("猛龙", 550), 20 ("大帝", 462), 21 ("西蒙斯不投三分", 366), 22 ("JB", 360), 23 ("科尔垃圾", 282), 24 ("格林公式", 273), 25 ("欧文", 2650), 26] 27 28 29def wordcloud_base() -> WordCloud: 30 c = ( 31 WordCloud() 32 .add("", words, word_size_range=[20, 50], shape="diamond", word_gap=10) 33 .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud-shape-diamond")) 34 ) 35 return c 36 37 38if __name__ == "__main__": 39 wordcloud_base().render("wordCloud.html")
效果图如下:
NBA词云图
保存为图片
前面我们讲的几种图形生成方法,最后都保存成 html文件,pyecharts 还提供了保存为图片的方式
需要安装 snapshot_selenium,同时需要将浏览器驱动保存路径 cheromdriver.exe 加入到环境变量中
1pip install snapshot_selenium
示例代码如下:
1# coding: utf-8 2import random 3 4from pyecharts.charts import WordCloud 5from pyecharts import options as opts 6from snapshot_selenium import snapshot as driver 7from pyecharts.render import make_snapshot 8 9words = [ 10 ("火箭", 10000), 11 ("勇士库里", 8888), 12 ("在你写这个教程之前,我已经会用了", 6181), 13 ("哈登", 6386), 14 ("金州拉文", 5055), 15 ("杜兰特", 6467), 16 ("戳眼", 2244), 17 ("NBA", 1868), 18 ("季后赛", 1484), 19 ("约老师", 1112), 20 ("利拉德", 865), 21 ("双卡双待", 847), 22 ("字母歌MVP", 5582), 23 ("卡哇伊", 555), 24 ("猛龙", 550), 25 ("大帝", 462), 26 ("西蒙斯不投三分", 366), 27 ("JB", 360), 28 ("科尔垃圾", 282), 29 ("格林公式", 273), 30 ("欧文", 2650), 31] 32 33 34def wordcloud_base() -> WordCloud: 35 c = ( 36 WordCloud() 37 .add("", words, word_size_range=[20, 50], shape="diamond", word_gap=10) 38 .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud-shape-diamond")) 39 ) 40 return c 41 42 43if __name__ == "__main__": 44 make_snapshot(driver, wordcloud_base().render(), "wordcloud.png") 45 # wordcloud_base().render("wordCloud.html")
最后会在当前目录生成一张 wordcloud.png 的图片
总结
1.根据自己想制作的图形,导入相关的包
2.进行图表的基础设置,创建图表对象
3.需要了解该图表对象下面的函数中参数的含义,及其使用方法
4.配置项主要是在 options中进行配置,有全局配置项和系列配置项,需要了解配置项下面对象含义使用方法
5.利用render()方法来报存图表
pyecharts 还有许多好玩的 3D图表 和 地图图表,由于篇幅有限,下篇将继续介绍 地图系玩法,欢迎关注!
觉得对你有用,就帮忙点个赞呗…