还在用Matplotlib? 又一可视化神器pyecharts登场

2021-01-19 12:03:48 浏览数 (1)

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文件
代码语言:javascript复制
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-

0 人点赞