Fork me on GitHub

pyecharts-7-折线图

Pyecharts-7-绘制折线图

本文中记录的是如何利用pyecharts绘制折线图。详细的资料参见官网

导入库

1
2
3
4
5
6
7
8
from pyecharts import options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType, ChartType

import pandas as pd
import numpy as np

基本作图

通过一个简单的例子来介绍如何最基本的折线图

  • 导入Line()
  • 导入x/y轴的数据
  • 全局设置项
1
2
3
4
5
6
7
8
c = (
Line()
.add_xaxis(['语文','数学','英语','体育']) # 指定x/y轴数据
.add_yaxis("张三",[68,75,83,100], is_step=True) # is_step=True 表示呈梯状显示数据
.add_yaxis("李四",[82,98,78,82])
.set_global_opts(title_opts=opts.TitleOpts(title="Line-基本示例"))
)
c.render_notebook()

面积图

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
data_x = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
data_y = [820, 932, 901, 934, 1290, 1330, 1320]


c = (
Line()
.add_xaxis(xaxis_data=data_x) # 加入x轴数据
.add_yaxis(
series_name="面积图的制作", # 图的名称
y_axis=data_y, # 加入y轴数据
symbol="emptyCircle", # 设置每个数据的符号标志
is_symbol_show=True, # 显示符号标志
label_opts=opts.LabelOpts(is_show=False),
areastyle_opts=opts.AreaStyleOpts(opacity=1, color="#B07570"), # 设置透明度和标签
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(is_show=False),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
# boundary_gap 放在最后一个配置项, 不然会被覆盖
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), # 保持图形从x=0开始,否则会出现间隙
)
)

c.render_notebook()

面积图(左边存在间隙)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker

c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.7))
.add_yaxis("商家B", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.3))
.set_global_opts(title_opts=opts.TitleOpts(title="Line-面积图"),
# xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), # 从x=0开始,否则?会出现间隙
)
)

c.render_notebook()

制作面积图(紧贴y轴)

利用pyecharts制作面积图,紧贴y轴的样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), is_smooth=True) # 对两个商家进行对比
.add_yaxis("商家B", Faker.values(), is_smooth=True) # is_smooth表示用圆滑的曲线,而不是纯折线
.set_series_opts(
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Line-面积图(紧贴Y轴)"),
xaxis_opts=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
is_scale=False,
boundary_gap=False,
),
)
)

c.render_notebook()

空值处理

如果某组数据中出现了空值,如何处理?

1
2
3
4
5
6
7
8
9
10
11
y = Faker.values()
y[3], y[5] = None, None # 将第3个和第5个数据指定为None
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", y, is_connect_nones=True) # 在这里进行设置
.set_global_opts(title_opts=opts.TitleOpts(title="Line-连接空数据"))
# .render("line_connect_null.html")
)

c.render_notebook()

堆叠折线图

将多条折线图绘制在一张图中:添加多条y轴数据

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
x_data = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
y_data = [820, 932, 901, 934, 1290, 1330, 1320]


c = (
Line()
.add_xaxis(xaxis_data=x_data) # 指定x轴数据

# 添加多条y轴数据
.add_yaxis(
series_name="邮件营销",
stack="总量",
y_axis=[120, 132, 101, 134, 90, 230, 210],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="联盟广告",
stack="总量",
y_axis=[220, 182, 191, 234, 290, 330, 310],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="视频广告",
stack="总量",
y_axis=[150, 232, 201, 154, 190, 330, 410],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="直接访问",
stack="总量",
y_axis=[320, 332, 301, 334, 390, 330, 320],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="搜索引擎",
stack="总量",
y_axis=[820, 932, 901, 934, 1290, 1330, 1320],
label_opts=opts.LabelOpts(is_show=False),
)

.set_global_opts(
title_opts=opts.TitleOpts(title="堆叠折线图"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
)
)

c.render_notebook()

堆叠面积

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
import pyecharts.options as opts
from pyecharts.charts import Line


x_data = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]

c = (
Line()
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="邮件营销",
stack="总量",
y_axis=[120, 132, 101, 134, 90, 230, 210],
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="联盟广告",
stack="总量",
y_axis=[220, 182, 191, 234, 290, 330, 310],
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="视频广告",
stack="总量",
y_axis=[150, 232, 201, 154, 190, 330, 410],
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="堆叠区域图"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
)
)

c.render_notebook()

多个x轴

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import pyecharts.options as opts
from pyecharts.charts import Line

from pyecharts.commons.utils import JsCode

# 如何使用JsCode
js_formatter = """function (params) {
console.log(params);
return '降水量 ' + params.value + (params.seriesData.length ? ':' + params.seriesData[0].data : '')
}"""

c = (
Line(init_opts=opts.InitOpts(width="1600px", height="800px"))
.add_xaxis(
xaxis_data=[
"2016-1",
"2016-2",
"2016-3",
"2016-4",
"2016-5",
"2016-6",
"2016-7",
"2016-8",
"2016-9",
"2016-10",
"2016-11",
"2016-12",
]
)
.extend_axis(
xaxis_data=[
"2015-1",
"2015-2",
"2015-3",
"2015-4",
"2015-5",
"2015-6",
"2015-7",
"2015-8",
"2015-9",
"2015-10",
"2015-11",
"2015-12",
],
xaxis=opts.AxisOpts(
type_="category",
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
axisline_opts=opts.AxisLineOpts(
is_on_zero=False, linestyle_opts=opts.LineStyleOpts(color="#6e9ef1")
),
axispointer_opts=opts.AxisPointerOpts(
is_show=True, label=opts.LabelOpts(formatter=JsCode(js_formatter))
),
),
)
.add_yaxis(
series_name="2015 降水量",
is_smooth=True,
symbol="emptyCircle",
is_symbol_show=False,
# xaxis_index=1,
color="#d14a61",
y_axis=[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
label_opts=opts.LabelOpts(is_show=False),
linestyle_opts=opts.LineStyleOpts(width=2),
)
.add_yaxis(
series_name="2016 降水量",
is_smooth=True,
symbol="emptyCircle",
is_symbol_show=False,
color="#6e9ef1",
y_axis=[3.9, 5.9, 11.1, 18.7, 48.3, 69.2, 231.6, 46.6, 55.4, 18.4, 10.3, 0.7],
label_opts=opts.LabelOpts(is_show=False),
linestyle_opts=opts.LineStyleOpts(width=1),
)
.set_global_opts(
legend_opts=opts.LegendOpts(),
tooltip_opts=opts.TooltipOpts(trigger="none", axis_pointer_type="cross"),
xaxis_opts=opts.AxisOpts(
type_="category",
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
axisline_opts=opts.AxisLineOpts(
is_on_zero=False, linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
axispointer_opts=opts.AxisPointerOpts(
is_show=True, label=opts.LabelOpts(formatter=JsCode(js_formatter))
),
),
yaxis_opts=opts.AxisOpts(
type_="value",
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
),
)
)

c.render_notebook()

自定义特殊点/均线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker

c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis(
"商家A",
Faker.values(),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]), # markpoint_opts设置最小值
)
.add_yaxis(
"商家B",
Faker.values(),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]), # markline_opts设置平均值
)
.set_global_opts(title_opts=opts.TitleOpts(title="自定义特殊点-MarkPoint"))
)

c.render_notebook()

JsCode使用

使用案例

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
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType

# 添加两组数据:数值+百分比
list1 = [
{"value": 12, "percent": 12 / (12 + 3)},
{"value": 23, "percent": 23 / (23 + 21)},
{"value": 33, "percent": 33 / (33 + 5)},
]

list2 = [
{"value": 3, "percent": 3 / (12 + 3)},
{"value": 21, "percent": 21 / (23 + 21)},
{"value": 5, "percent": 5 / (33 + 5)},
]

c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis([1, 2, 3])
.add_yaxis("product1", list1, stack="stack1", category_gap="50%") # 如果两个stack设置不同,则表示为并排显示,相同则表示为堆叠显示
.add_yaxis("product2", list2, stack="stack1", category_gap="50%")
.set_series_opts(
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode("function(x){return Number(x.data.percent * 100).toFixed() + '%';}"),
)
)
)

c.render_notebook()

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
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType

# 添加两组数据:数值+百分比
list1 = [
{"value": 12, "percent": 12 / (12 + 3)},
{"value": 23, "percent": 23 / (23 + 21)},
{"value": 33, "percent": 33 / (33 + 5)},
]

list2 = [
{"value": 3, "percent": 3 / (12 + 3)},
{"value": 21, "percent": 21 / (23 + 21)},
{"value": 5, "percent": 5 / (33 + 5)},
]

c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis([1, 2, 3])
# stack设置不同则表示为并行排列
.add_yaxis("product1", list1, stack="stack2", category_gap="50%")
.add_yaxis("product2", list2, stack="stack1", category_gap="50%")
.set_series_opts(
label_opts=opts.LabelOpts(
position="top", # 百分比显示的位置
formatter=JsCode("function(x){return Number(x.data.percent * 100).toFixed() + '%';}"),
)
)
)

c.render_notebook()

JsCode妙用

JsCode只是一段字符串,包含着JS代码,在知乎的这篇文章中介绍了如何使用JsCode,使用小结:

  • JsCode 的引入:from pyecharts.commons.utils import JsCode

  • 任何参数的 JsCode 在不知道怎么使用的情况下,均可以使用万能回调函数和浏览器控制台去查看。

    • 万能回调函数: JsCode("funtion(x) {console.log(x); return x;}")
    • 浏览器控制台:F12 --> 选择 Console / 控制台选项卡
  • 不是任何回调函数都只有一个参数的,部分回调函数在测试过程中可以写成:JsCode("function(params, item) { console.log(params, item); return params;}")

本文标题:pyecharts-7-折线图

发布时间:2020年10月10日 - 18:10

原始链接:http://www.renpeter.cn/2020/10/10/pyecharts-7-%E6%8A%98%E7%BA%BF%E5%9B%BE.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea