Pyecharts 折线图语法
在 Pyecharts 中,我们可以使用 Line 这个模块来绘制一个折线图。折线图的主要作用是:观察 “因变量 y” 随着 “自变量 x” 的变化而变化的趋势。
语法:
line = Line()
line.add_xaxis(xaxis_data)
line.add_yaxis(series_name, y_axis)
说明:
首先我们需要使用 Line() 来创建一个折线图对象 line,然后调用 add_xaxis() 方法来添加 x 轴数据,并且调用 add_yaxis() 方法来添加 y 轴数据。
对于 add_xaxis() 方法来说,参数 xaxis_data 用于定义 x 轴数据。对于 add_yaxis() 方法来说,参数 series_name 用于定义系列名,参数 y_axis 用于定义 y 轴数据。
有一点我们要非常清楚:Pyecharts 的大多数方法接收的参数应为列表,虽然在某些情况下可以使用 Series 或 DataFrame,但不建议这样做。
示例 1:Pyecharts 绘制一条折线
import pandas as pd
from pyecharts.charts import Line
# 数据
data = [
['1月', 450],
['2月', 420],
['3月', 560],
['4月', 480],
['5月', 530],
['6月', 620]
]
df = pd.DataFrame(data, columns=['月份', '上衣'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
# 渲染
line.render()
运行之后,当前项目目录下会多了一个 render.html,如下图所示。在浏览器中打开 render.html,此时效果如下图所示。


分析:
from pyecharts.charts import Line 表示导入 Line 这个模块。Line 模块本质上是一个类,所以 line = Line() 其实就是使用 Line 这个类来创建一个实例对象。
因为 Pyecharts 是用于 Web 开发的,所以它会把图表渲染成一个 HTML 文件。如果你使用的是 VSCode 进行开发,那么可以安装一个名为 “Live Server” 的插件,然后界面右下角可以找到一个【Go Live】的按钮,如下图所示。

我们首先点击打开 render.html,然后再点击【Go Live】按钮,这样就可以自动使用浏览器查看 render.html 的效果了,如下图所示。

对于 add_xaxis() 和 add_yaxis() 这两个方法来说,它的参数名是可以省略的,下面 2 种方式是等价的。不过在实际开发中,我们还是建议把参数名写上。
# 不省略参数名
line.add_xaxis(xaxis_data=list(df['月份']))
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
# 省略参数名
line.add_xaxis(list(df['月份']))
line.add_yaxis('上衣', list(df['上衣']))
由于 Pyecharts 中所有的方法都支持链式调用,所以对于这个例子来说,下面 2 种方式的等价的。
# 方式1:分开调用
line.add_xaxis(xaxis_data=list(df['月份']))
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
line.render()
# 方式2:链式调用
line.add_xaxis(xaxis_data=list(df['月份'])).add_yaxis(series_name='上衣', y_axis=list(df['上衣'])).render()
当然了,当链式调用的代码比较长时,我们可以分行来显示每一个方法。不过如果是分行显示,我们需要在外层加一个 “()”,如果不加就会报错,代码如下。
# 分行显示
(
line.add_xaxis(xaxis_data=list(df['月份']))
.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
.render()
)
需要特别说明的是:一般情况下,Pyecharts 中的数据要求是一个列表,而不能是 Series 或 DataFrame。某些情况下,虽然使用 Series 或 DataFrame 不会报错,但我们并不建议这样去做。
那么问题来了:“明明这里可以直接使用列表的方式来操作,为什么我们还使用 Pandas 来操作呢?这不是多此一举吗?” 之所以使用 Pandas,有以下 2 个非常重要的原因。
- Pyecharts 并未提供能够读取文件的简单方法,而 Pandas 却可以很轻松地读取一个文件中的数据(包括 CSV、Excel 等)。如果不使用 Pandas,那么就得使用最原始的方式来读取,这是非常麻烦的。
- Pandas 可以很轻松地获取某一列的内容,比如想要获取 “衬衫” 这一列,只需要使用 df['衬衫'] 就可以了。由于数据要求是一个列表,我们再使用 list() 函数将其转换成列表就可以了,非常的简单。
Pyecharts 绘制的图表用户体验非常好,并且具备非常强大的交互功能。首先打开页面的时候,所有图表都会有一个动画效果。然后当我们将鼠标移到某一个节点上时,会弹出一个提示框来显示该节点的数据,如下图所示。

提示框由 2 部分组成:第 1 行是描述文本,第 2 行是数据信息。对于 add_yaxis() 方法来说,参数 series_name 用于定义系列名。这个 “系列名” 指的就是提示框中第一行的描述文本以及图例内容,如下图所示。如果修改 series_name 的值,那么这 2 个地方也会同时被修改。

示例 2:Pyecharts 绘制多条折线
import pandas as pd
from pyecharts.charts import Line
# 数据
data = [
['1月', 450, 110],
['2月', 420, 220],
['3月', 560, 150],
['4月', 480, 310],
['5月', 530, 250],
['6月', 620, 160]
]
df = pd.DataFrame(data, columns=['月份', '上衣', '裤子'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
# 第1条折线
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
# 第2条折线
line.add_yaxis(series_name='裤子', y_axis=list(df['裤子']))
# 渲染
line.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
由于这 2 条折线共享 x 轴数据,也就是说它们的 x 轴数据是一样的,所以这里只需要调用一次 add_xaxis() 方法就可以了。而 add_yaxis() 方法用于设置 y 轴数据,由于这里有 2 条折线,所以需要调用 2 次。当然了,如果有 n 条折线,那么就调用 n 次 add_yaxis() 方法。
示例 3:x 轴数据要求是一个字符串
import pandas as pd
from pyecharts.charts import Line
# 数据
data = [
[1, 450],
[2, 420],
[3, 560],
[4, 480],
[5, 530],
[6, 620]
]
df = pd.DataFrame(data, columns=['月份', '上衣'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']))
# 渲染
line.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
这里绘制出来折线图效果比较奇怪,当 x 轴坐标为 2 时,对应的 y 轴坐标应该是 420,而不是 450(x 轴坐标为 1 时才是 450)。很明显,这里的坐标数据并没有正确对应,而是整体向右偏移了 1 个单位。为什么会出现这种情况呢?
这是因为 Pyecharts 中要求 x 轴数据是一个字符串,而不能是其他类型数据。如果是其他类型数据,就可能会出现坐标数据不对应的情况。至于 pyecharts 为什么要这样做,我们不必纠结太多,只需要按照语法规定来就可以了。
对于这个例子来说,我们可以使用 DataFrame 的 astype() 方法来将 df['月份'] 这一列数据修改成字符串型。修改后的代码如下,再次运行后的效果如下图所示。
line.add_xaxis(xaxis_data=list(df['月份'].astype('str')))

小伙伴们一定要记住一点:Pyecharts 大多数图表都要求 x 轴数据是字符串,而不能是整型或浮点型。
Pyecharts 折线图样式
在 Pyecharts 中,我们还可以对折线图进行一些样式的自定义,主要包括 3 个方面:① 平滑线;② 线条外观;③ 面积图。
示例 4:折线图使用平滑线
import pandas as pd
from pyecharts.charts import Line
# 数据
data = [
['1月', 450, 110],
['2月', 420, 220],
['3月', 560, 150],
['4月', 480, 310],
['5月', 530, 250],
['6月', 620, 160]
]
df = pd.DataFrame(data, columns=['月份', '上衣', '裤子'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
# 第1条折线
line.add_yaxis(series_name='上衣', y_axis=list(df['上衣']), is_smooth=True)
# 第2条折线
line.add_yaxis(series_name='裤子', y_axis=list(df['裤子']), is_smooth=True)
# 渲染
line.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
对于折线图来说,我们可以使用 add_yaxis() 方法的 is_smooth 参数来定义线条为平滑线。当 is_smooth = True 时,线条为平滑线;当 is_smooth = False 时,线条为直线。其中 is_smooth 默认值为 False。
示例 5:折线图的线条外观
import pandas as pd
from pyecharts.charts import Line
import pyecharts.options as opts
# 数据
data = [
['1月', 450, 110],
['2月', 420, 220],
['3月', 560, 150],
['4月', 480, 310],
['5月', 530, 250],
['6月', 620, 160]
]
df = pd.DataFrame(data, columns=['月份', '上衣', '裤子'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
# 第1条折线
line.add_yaxis(
series_name='上衣',
y_axis=list(df['上衣']),
linestyle_opts=opts.LineStyleOpts(type_='dashed')
)
# 第2条折线
line.add_yaxis(
series_name='裤子',
y_axis=list(df['裤子']),
linestyle_opts=opts.LineStyleOpts(type_='dotted')
)
# 渲染
line.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
如果想要改变线条的样式,我们可以使用 add_yaxis() 方法的 linestyle_opts 参数来实现。需要注意的是,linestyle_opts 参数的取值比较特殊,它的取值是 Pyecharts.options 模块下一个方法的返回值。所以我们首先需要使用 import pyecharts.options as opts 来导入 pyecharts.options 才行。
当 linestyle_opts 取值为 opts.LineStyleOpts(type_='dashed'),表示定义线条为 “虚线” ;当 linestyle_opts 取值为 opts.LineStyleOpts(type_='dotted') 时,表示定义线条为 “点线” 。可能很多初学的小伙伴会觉得这种语法方式非常奇怪,为什么不直接定义成 linestyle_opts='dashed',而是定义成 linestyle_opts= opts.LineStyleOpts(type_='dashed') 呢?
语法这东西是官方规定的,我们只需要遵循规则就可以了。就像红绿灯一样,我们没必要纠结为什么是 “绿灯走红灯停”,而不是 “绿灯停红灯走”。像上面这种语法方式,我们后面会经常遇到,多接触几次就懂了。
示例 6:Pyecharts 面积图
import pandas as pd
from pyecharts.charts import Line
import pyecharts.options as opts
# 数据
data = [
['1月', 450, 110],
['2月', 420, 220],
['3月', 560, 150],
['4月', 480, 310],
['5月', 530, 250],
['6月', 620, 160]
]
df = pd.DataFrame(data, columns=['月份', '上衣', '裤子'])
# 绘图
line = Line()
line.add_xaxis(xaxis_data=list(df['月份']))
# 第1条折线
line.add_yaxis(
series_name='上衣',
y_axis=list(df['上衣']),
areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
)
# 第2条折线
line.add_yaxis(
series_name='裤子',
y_axis=list(df['裤子']),
areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
)
# 渲染
line.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
如果想要使用面积图来表示,我们可以使用 add_yaxis() 方法的 areastyle_opts 参数来实现。areastyle_opts 和 linestyle_opts 一样,也需要使用 import pyecharts.options as opts 导入 pyecharts.options 这个模块。
对于自定义样式,有以下非常重要的 2 点需要跟小伙伴们说明一下的。
- 对于绝大多数图表的自定义样式,我们都是使用 add_yaxis() 方法提供的参数来实现的,而不是使用其他方法。
- 如果参数名是 “xxx_opts” 这种形式的,那么该参数的取值肯定就是 Pyecharts.options 下的一个属性或方法。
