Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
快速入门
pyecharts安装
代码语言:javascript复制# pip 安装:
pip install pyecharts
# 源码安装
git clone https://github.com/pyecharts/pyecharts.git
cd pyecharts
pip install -r requirements.txt
python setup.py install
# 或者执行 python install.py
入门操作
代码语言:javascript复制import pyecharts
print(pyecharts.__version__) # 查看版本
[out] 1.7.0
from pyecharts.faker import Faker # 用来产生伪数据的包
print(Faker.choose())
print(Faker.values())
[out] ['可乐', '雪碧', '橙汁', '绿茶', '奶茶', '百威', '青岛']
[48, 113, 60, 66, 139, 77, 128]
第一个pyecharts程序
- bar.add_x/yaxis() 添加横/纵坐标
- bar.render() 存储文件,默认html文件
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()
# render_notebook 则在notebook页面中直接显示
bar.render_notebook()
可以看到,与基本的Matplotlib绘图相比,pyecharts的交互以及可视化更为友好,更适合于项目开发、商业报告。
配置项
俗话说,授人与鱼不如授人与渔。我不会展示所有的绘图技巧,但是我会告诉你如何查看官方文档来实现自己对任何配置的使用。
官方文档:http://pyecharts.org/#/zh-cn/
全局配置项
全局配置项可通过 set_global_options 方法设置。下图中展示的内容均可以通过全局配置来设置。
从官方文档中可以看到,全局配置项包括很多,每一个配置项中以类的形式存在,而类中的属性则是我们要配置的内容。具体是个什么样的规则呢,下面通过一个栗子来演示一下。
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
bar.render_notebook()
上方程序显示结果比前面的程序多了蓝色方框中的内容,也就是主/副标题。对应的程序为bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题")),下面就来解析一下这句代码。
前面说了全局配置用 set_global_options 方法设置,最外层肯定是这个函数了。添加主/副标题就要看文档了,文档中标题配置项为TitleOpts,也就是类名,其中主/副标题的属性名为 title 和 subtitle ,其中提示为 title: Optional[str]=None 解读为可选项,字符串类型,默认为空,除此之外看到代码中还有个接收变量 title_opts ,其实它就是类名小写后在 opts 前加个下划线。这就是这句代码的完整解析,如果不太理解下面再举个栗子。
按照上面的代码组成来编写:
代码语言:javascript复制bar.set_global_opts(datazoom_opts=opts.DataZoomOpts(is_show=True))
放到完整程序中执行后得到显示结果为:
短短一行代码就实现了上面的效果,而且完全凭借官方文档来编写的程序。
上述的编写配置程序的方法是比较通用的,但是也有例外,与位置信息有关的,就不能完全按照将类名小写加下划线处理,因为位置信息分 x,y 轴。例如 AxisOpts:坐标轴配置项,它的接收变量就得区分 xaxis_opts 和 yaxis_opts。
系列配置项
系列配置项可通过 set_series_options 方法设置。其规律与全局配置项是类似的,完全可以利用上面的方法。下面仅举个栗子展示一下。
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 将柱上的数字不显示
bar.render_notebook()
上面通过 bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) 这句话将前面演示图像中柱子上面的数字显示去掉了,这句代码也完全用的上面介绍的编写方法。
二层调用
除了上面所说的配置方法以外,还有一个重要的操作,不仅仅是系列配置,全局配置也会用到,放在这里写是为了前面先搞懂如何使用一层的配置方法。说回来,二层的方法也很简单,只是在上面方法中再套一层语句。
看一下上面图中的标记点配置项,其中的 data 属性,data: Sequence[Union[MarkPointItem, dict]] = None,表明是个 Sequence 类型,而这个队列里面是系列配置项中的标记点数据项(MarkPointOpts),也就是标记点数据项继承自标记点配置项。在看一下标记点数据项。
标记点数据项中的属性是之前提到的一层情况,可以正常编写程序。那么拼在一块又该如何使用呢,下面再给一个实例。
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# 不同之处在于,在 MarkPointOpts 的里面再调用 MarkPointItem 的属性,定义的name为交互方式下,鼠标在对应点时显示的内容
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markpoint_opts = opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值")
]
))
bar.render_notebook()
例外
上面的内容适用于部分内容,还有一些并不是在global和series中配置,例如颜色,在坐标轴中(add_yaxis)配置;主题,在初始化对象时(bar = Bar())配置。但是配置语句的方法还是通用的,上面讲述的内容完全可以利用。
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts import options as opts
bar = Bar(init_opts=opts.InitOpts(theme="dark"))
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.render_notebook()
当然,想适用更丰富的主题,可以调用主题包:
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
注:配置项仅写一句,可以把多个配置写在一个语句里,但是如果写了多个配置语句,肯会把上面的配置语句效果忽略掉,全局、系列配置项均是。
数据格式
pyecharts 本质上在做的事情就是将 Echarts 的配置项由 Python dict 序列化为 JSON 格式,所以 pyecharts 支持什么格式的数据类型取决于 JSON 支持什么数据类型。
那么,该如何转换呢?主要有两种方法,一是利用列表生成式,二是tolist方法。
代码语言:javascript复制1、
# for int
[int(x) for x in your_numpy_array_or_something_else]
# for float
[float(x) for x in your_numpy_array_or_something_else]
# for str
[str(x) for x in your_numpy_array_or_something_else]
2、
Series.tolist()
常用图表绘制
仔细观察官方的案例可以发现,大部分的绘图方法都是类似的,只要掌握了规律,就能得心应手。主要有两种书写形式,官方常用的是链式调用的方法,我们也可以使用单独调用的写法。
代码语言:javascript复制from pyecharts.charts import Bar
from pyecharts import options as opts
# V1 版本开始支持链式调用
bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
)
bar.render()
# 不习惯链式调用的开发者依旧可以单独调用方法
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.render()
链式调用的方法,上面程序在连接处回车了,也许一时看懵了,其实就是不断的向对象中添加方法,可以写为 Bar().add_xaxis().add_yaxis() 。如果不习惯这样书写的话可以按照创建对象,分别向对象中添加方法。
图表的类型有很多种,需要绘制某种类型的图,就导相应包,例如:
代码语言:javascript复制# 画饼图
from pyecharts.charts import Pie
pie = Pie()
# 日历图
from pyecharts.charts import Calendar
cal = Calender()
# 雷达图
from pyecharts.charts import Radar
rader = Rader()
.........
由于图表类型很多,在这里就不一一列举,仅演示其中一种图表--词云。
代码语言:javascript复制from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType
words = [
("花鸟市场", 1446),("汽车", 928),("视频", 906),("电视", 825),("家居饰品", 29),("家居日常用品", 10),("生活服务", 883),("物流配送", 536),("家政服务", 108),("摄影服务", 49),("搬家服务", 38),("物业维修", 37),("婚庆服务", 24),("二手回收", 24),("鲜花配送", 3),("维修服务", 3)
]
wordCloud = WordCloud()
wordCloud.add("", words, word_size_range=[20, 100])
wordCloud.render_notebook()
其他类型图表可以参照官方文档中的案例,以及里面类的说明。它可以绘制的图形还有很多,而且十分友好。下面展示部分效果(来自官网)。
地图绘制
pyecharts 除了上述的神奇效果之外,还有一个十分常用的功能,那就是地图。对地图操作的类有Geo和Map,还可以调用百度地图的API。调用之后,添加属性仍然与前面讲到的方式一样,完全可以照着官网介绍自己编写代码。下面仅举个例子,具体想要绘制地图的样式可以参考官网。
代码语言:javascript复制from pyecharts import options as opts
from pyecharts.charts import Map
def map_visualmap() -> Map:
c = (
Map()
.add("商家A", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
return c
map_visualmap().render_notebook()
-END-