Python主要有两种数据作图方法:

  • matplotlib 简单方便,适合数值作图与科学作图(论文发表)
  • pyecharts 流程复杂,但功能强大。图形为交互式,适合项目开发、商业分析。(国人开发

Pyecharts库

pyecharts 是一个用于生成 Echarts 图表的类库。而Echarts 是百度开源的一个数据可视化 JS 库。

用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图,pyecharts的作者写了此项目。

官网:https://pyecharts.org

GitHub地址:https://github.com/pyecharts/pyecharts

安装

命令行窗口中,通过以下命令完成安装

1
pip install pyecharts

可通过此方式查看当前版本:

1
2
import pyecharts 
print(pyecharts.__version__)

导包

1
2
from pyecharts.charts from [图形类别]
# 当需要设置内容时,还需导入opt、faker等class类

关于上述代码中的【图形类别】,是在设置不同类型的图形时,导入不同的对象

如:BarPie……

最新的pyecharts支持链式调用

基本图表

柱状图

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pyecharts import options as opts
from pyecharts.charts import Bar
#实例化柱状图Bar类
bar = Bar()
#通过bar对象,设置内容,如:
# 设置x,y轴数据
bar.add_xaixs(["类型1","类型2","类型3"])
bar.add_yaixs("数据1",[1222,1234,698])
# 渲染柱状图,默认在当前路径下生成html文件,可传递相对路径str参数自定义路径
bar.render()


#由于支持链式调用,所以,也可以直接设置(以后的示例都直接使用链式)
b = (
Bar()
.add_xaxis(["类型1","类型2","类型3"])
.add_yaxis("数据1",[1222,1234,698])
.render("/demo/bartest.html")
)

这样,即可生成一个最简单的柱状图,如下:

bar-demo1

实现单类多柱

实现一个类别里有多个数据,如疫情每个地区拥有确诊人数和治愈人数。

注意,之后的文章中,出现的类目,即表示普通意义上x轴的“类别”

1
2
3
4
5
6
7
8
9
10
11
b = (
Bar()
.add_xaxis(["类型1","类型2","类型3"])
.add_yaxis("数据1",[1222,1234,698])
#直接在之后再添加yaixs即可
.add_yaxis("数据2",[123,234,345])
#以下省略
.add_yaxis("数据x",[...])
#渲染
.render("/demo/bartest.html")
)

实现多据占比

实现多个数据并成一个柱形,显示占比,效果如下:

bar-demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#为了方便处理数据,这里我们将y坐标数据单独用一个列表变量保存
#之后调用时直接传递即可,如传入list1列表
list1 = [
1222,
1234,
698
]
bar.add_yaxis("数据1",list1)

#事实上,yaxis在使用数据时,是使用列表中字典的value值
list1 = [
{'value':1222},
{'value':1234},
{'value':698}
]

#与此同时,还可以在字典中增加关键字:percent,以此实现占比显示
list1 = [
# 此处均已前面代码中的数据为例
# 所以占比的分母是“数据1”中的1222+“数据2”中的123
# 下同
{"value":1222,"percent":1222/(1222+123)},
{"value":1234,"percent":1234/(1234+234)},
{"value":698,"percent":698/(698+345)}
]
list2 = [
{"value":123,"percent":123/(1222+123)},
{"value":234,"percent":234/(1234+234)},
{"value":345,"percent":345/(698+345)}
]

#此外,还需再导入JsCode,丰富显示
from pyecharts.commons.utils import JsCode
#实例化并渲染
b = (
Bar()
.add_xaxis(["类型1","类型2","类型3"])

#设置stack,为stack属性值相同的类目数据设置堆叠效果,stack值可自定义,这里设置为stack1
.add_yaxis("数据1",list1,stack="stack1", category_gap="50%")
#category_gap同一系列的柱间距离,默认为类目间距的 20%,可设固定值
.add_yaxis("数据2",list2,stack="stack1", category_gap="50%")

#设置 系列配置项(本文章之后有详解)
.set_series_opts(
#设置 标签(label)配置项
label_opts=opts.LabelOpts(
#将百分比数据显示在柱的右侧
position="right",
#调用JsCode中自定义的函数实现百分比显示
formatter=JsCode(
"function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
),
)
)
#渲染
.render("demo/bartest.html")
)

上述代码运行得到的图形与前面给出的示例有出入,原因是没有设置主题。

pyecharts内置有10+个主题,之后再慢慢介绍

实现标签倾斜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
b = (
Bar()
.add_xaxis(
[
"名字很长的X轴标签1",
"名字很长的X轴标签2",
"名字很长的X轴标签3",
"名字很长的X轴标签4",
"名字很长的X轴标签5",
"名字很长的X轴标签6",
]
)
.add_yaxis("商家A", [10, 20, 30, 40, 50, 40])
.add_yaxis("商家B", [20, 10, 40, 30, 40, 50])
#设置 全局配置项
.set_global_opts(
#对x轴中的标签设置旋转,默认正值为逆时针,这里取-15
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
)
#渲染
.render("demo/bartest.html")
)

此外,还可以通过代码实现x-y坐标的翻转

1
.reversal_axis()

实现滑动条

许多时候,当数据/类目过多时,不宜在有限的“屏幕”上展示图,因此我们可以添加"水平滑动条"

官方名称是:区域缩放配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pyecharts import options as opts
from pyecharts.charts import Bar
#导入 虚拟数据类 ,可实现随机生成虚拟数据
from pyecharts.faker import Faker

c = (
Bar()
#随机时间
.add_xaxis(Faker.days_attrs)
#随机数据值
.add_yaxis("商家A", Faker.days_values)
#设置 全局配置项
.set_global_opts(
#使用滑动条(Zoom)
datazoom_opts=opts.DataZoomOpts(),
#默认是横向滑动,可通过以下代码改成竖向
#datazoom_opts=opts.DataZoomOpts(orient="vertical")
#上述两种方式默认通过光标移动,可通过以下代码改成允许鼠标中键滚动
#datazoom_opts=opts.DataZoomOpts(type_="inside"),
)
#渲染
.render("demo/bartest.html")
)

实现工具箱显示

1
2
3
4
5
6
7
#设置全局配置项
.set_global_opts(
#开启工具箱
toolbox_opts=opts.ToolboxOpts(),
#取消显示图例组件
legend_opts=opts.LegendOpts(is_show=False),
)

工具箱拥有许多拓展功能,如:区域选择,转化为折线图,保存图片等等

实现标注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#设置全局配置项
.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="平均值"),
]
),
#添加标注线
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="min", name="最小值"),
opts.MarkLineItem(type_="max", name="最大值"),
opts.MarkLineItem(type_="average", name="平均值"),
]
),
#添加自定义标注点
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(name="自定义标记点", coord=[x[2], y[2]], value=y[2])]
),#此处x,y表示两个坐标的列表对象,coord参数的值应该是列表对象

#添加自定义标注线
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(y=50, name="自定义标注线")]
)

饼状图

简单演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pyecharts import options as opts
#导入饼状图(Pie)类
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
Pie()
#不同于柱状图要设置x-y,直接add
#add需传入类目(可以为空)、元组列表,如[('湖北',12345),('成都',1997)]
.add("", [list(z) for z in zip(Faker.choose(), Faker.values())])

#设置饼状图颜色
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])

#设置全局配置:标题(同样适用于柱状图)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))

#设置系列配置:更改标签显示方式
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))

#渲染
.render("demo/pie_base.html")
)

实现外观修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#位置修改

.add(
"",
[list(z) for z in zip(Faker.choose(), Faker.values())],
#饼圆形位置/相对于容器的百分比
center=["35%", "50%"],
)

.set_global_opts(
#图表标题
title_opts=opts.TitleOpts(title="Pie-调整位置"),
#图形位置设置/相对容器百分比
legend_opts=opts.LegendOpts(pos_left="15%"),
)
1
2
3
4
5
6
7
8
9
#半径修改
.add(
"",
[list(z) for z in zip(Faker.choose(), Faker.values())],
#内半径和外半径/相对容器百分比
radius=["40%", "75%"],
)

#以此可实现环形圆

玫瑰图

在半径修改成圆环之下,将每一分块依据其大小显示为不规则

  • 关键字参数:rosetype
  • 值:radius、area
    • None:规则
    • radius:扇区圆心角展现数据的百分比,半径展现数据的大小
    • area:所有扇区圆心角相同,仅通过半径展现数据大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
v = Faker.choose()
c = (
Pie()
.add(
"",
[list(z) for z in zip(v, Faker.values())],
radius=["30%", "75%"],
center=["25%", "50%"],
#玫瑰图类型1
rosetype="radius",
label_opts=opts.LabelOpts(is_show=False),
)
.add(
"",
[list(z) for z in zip(v, Faker.values())],
radius=["30%", "75%"],
center=["75%", "50%"],
#玫瑰图类型2
rosetype="area",
)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例"))
#渲染
.render("demo/pie.html")
)

示例图:

rose-pie-demo

从上述代码和示例图中可见,当多次使用.add()时,可生成多个图

实现内外兼修图

暂时搁浅

矩形树图

雷达图

地图

配置项

全局配置

全局配置项可通过 set_global_options 方法设置

官方示例图

系列配置

主题配置

导包

1
from pyecharts.globals import ThemeType

连接后端框架

Flask框架

参考资料

1.pyecharts官方网站