Matplotlib基础教程之折线图

简介: 俗话说,一图胜千言。数据可视化便是将数据通过图形化的方式展现出来,它更加便于我们观察数据蕴含的的规律,洞察了数据蕴含的规律后,我们能够做更好的商业决策。

1. 数据可视化的意义

俗话说,一图胜千言。数据可视化便是将数据通过图形化的方式展现出来,它更加便于我们观察数据蕴含的的规律,洞察了数据蕴含的规律后,我们能够做更好的商业决策。

2. 什么是折线图?

折线图是一个由点和线组成的统计图表,常用来表示数值随连续时间间隔或有序类别的变化。在折线图中,x 轴通常用作连续时间间隔或有序类别(比如阶段1,阶段2,阶段3)。y 轴用于量化的数据,如果为负值则绘制于 y 轴下方。连线用于连接两个相邻的数据点。

折线图用于分析事物随时间或有序类别而变化的趋势。如果有多组数据,则用于分析多组数据随时间变化或有序类别的相互作用和影响。折线的方向表示正/负变化。折线的斜率表示变化的程度。

3. 折线图的绘制

本节课我们来看如何作折线图。首先我们需要安装 matplotlib 库,可以使用命令 pip install matplotlib 进行安装。matplotlib 库安装完成后,我们便可以使用 matplotlib 库来作图了。例如:

from matplotlib import pyplot as plt
dev_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(dev_x, dev_y)
plt.show()

上述代码的第一行从 matplotlib 导入 pyplot 并起别名 plt。dev_x、dev_y 为两个列表,分别包含 11 个数据,接下来调用 plot 函数便可以进行作图,plot 函数的参数为两组数据,调用 plot 函数之后,还需要调用 show 函数,否则不会显示图形。上述代码得到的图形如下所示:

网络异常,图片无法展示
|

上述图形中没有标识横坐标、纵坐标所表示的含义以及整个图形的标题。下面我们来添加上述信息:

from matplotlib import pyplot as plt
dev_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(dev_x, dev_y)
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.show()

上述代码通过 xlabel 函数添加横坐标代表的含义,通过 ylabel 函数添加纵坐标代表的含义,通过 title 函数添加图形的标题。添加上述信息之后的图形如下图所示:

网络异常,图片无法展示
|

上面做的图中只包含一条折线,现在我们来添加另外一条曲线。

from matplotlib import pyplot as plt
dev_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(dev_x, dev_y)
py_dev_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(py_dev_x, py_dev_y)
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.show()

上面的代码中,我们通过另外一组数据又添加了一条折线。仔细观察代码我们可以发现,dev_xpy_dev_x 是相同的,为了代码的简洁,我们可以只保留一份,例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y)
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y)
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.show()

执行完上述代码生成的图形如下图所示:

网络异常,图片无法展示
|

由于图形中有两条折线,每条折线代表的含义并没有在图形中标识出来,这样我们便不能对两条折线进行区分,为了对两条折线进行区分,我们需要为两条折线分别加上标签。例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y)
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y)
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend(['全部开发者','Python开发者'])
plt.show()

上面代码中,我们通过 legend 函数为两条折线打上标签,legend 函数的参数为一个列表,列表中元素的顺序需和折线的绘制顺序保持一致,不然会导致错乱。当我们改变折线的绘制顺序时,要同步改变作为 legend 函数参数的列表中元素的顺序。这是上面方法的缺陷,下面我们来看另外一种方法。

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.show()

上面的方法通过在 plot 函数中添加参数 label 来实现标签的添加,添加过参数 label 后,我们同样需要调用 legend 函数,否则标签不会显示出来,只不过此时调用 legend 函数不需要传入参数。为折线添加完标签之后的图形如下图所示:

网络异常,图片无法展示
|

上面图形的样式都是默认的,我们也可以通过参数来设置图形的样式,包括折线的颜色、形状以及粗细等等。例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者", color="blue", marker=".", linestyle="-")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者", color="green", marker=".", linestyle="--")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.show()

上面的代码中,我们通过 color 参数指定图形的颜色,marker 参数指定每个数据点的标记,linestyle 参数指定图形的形状。执行完上述代码后的图形如下图所示:

网络异常,图片无法展示
|

color 参数的值也可以是一个 Hex 值,Hex 值由六位十六进制数组成,前两位十六进制数代表红色的强度,中间两位十六进制数代表绿色的强度,最后两位十六进制数代表蓝色的强度。例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者", color="#FF0000", marker=".", linestyle="-")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者", color="#00FF00", marker=".", linestyle="--")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.show()

上面的代码中,通过 Hex 值 #FF0000 指定颜色为红色,通过 Hex 值 #00FF00 指定颜色为绿色。执行完上述代码后的图形如下图所示:

网络异常,图片无法展示
|

我们还可以为图形加上网格线,例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者", color="#FF0000", marker=".", linestyle="-")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者", color="#00FF00", marker=".", linestyle="--")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.grid(True)
plt.show()

上面代码中,调用 grid 函数并传入 True 参数,执行完上述代码后的图形如下图所示:

网络异常,图片无法展示
|

为了使得图形中的空白区域更少些,我们调用 tight_layout 函数对空白区域进行自动填充,例如:

from matplotlib import pyplot as plt
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者", color="#FF0000", marker=".", linestyle="-")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者", color="#00FF00", marker=".", linestyle="--")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

添加 tight_layout 函数的调用后,生成的图形如下图所示:

网络异常,图片无法展示
|

上面我们是通过设置参数的方式来改变图形的样式,pyplot 也自带了一些样式供我们直接使用,例如:

from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

上述代码使用了 fivethirtyeight 样式,生成的图形如下图所示:

网络异常,图片无法展示
|

还有其他的样式,例如 ggplot:

from matplotlib import pyplot as plt
plt.style.use('ggplot')
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
dev_y = [38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752]
plt.plot(ages_x, dev_y, label="全部开发者")
py_dev_y = [45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640]
plt.plot(ages_x, py_dev_y, label="Python开发者")
plt.xlabel("年龄")
plt.ylabel("年薪")
plt.title("年龄和薪水的关系")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

生成的图形如下图所示:

网络异常,图片无法展示
|

4. 应用场景

4.1 适用场景

同一变量随时间或有序类别而变化的趋势,例如上面的例子中薪水随年龄的变化趋势。

4.2 不适用场景

1. x 轴节点过多。
2. 数据样本过多,导致折线堆积,难以聚焦到重点。
3. 变量数值大多数情况下为 0。
相关文章
|
4月前
|
数据可视化 Python
Python数据可视化利器Matplotlib实战教程
本文将介绍如何使用Python中强大的数据可视化工具Matplotlib,通过丰富的示例和实战操作,帮助读者快速掌握Matplotlib的基本用法和高级技巧,实现数据可视化的艺术。
|
7天前
|
数据可视化 Python
NumPy 教程 之 NumPy Matplotlib 7
使用Python的绘图库Matplotlib与NumPy结合进行数据可视化,提供Matplotlib作为MatLab开源替代方案的有效方法,以及如何利用plt()函数将数据转换成直观的直方图示例。
31 11
|
7天前
|
Python
NumPy 教程 之 NumPy Matplotlib 6
Matplotlib 是一个强大的 Python 绘图库,能与 NumPy 协同工作,提供类似 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。通过 `numpy.histogram()` 函数示例,展示了如何创建数据频率分布图,该函数接受输入数组和 bin 参数,生成对应频率的直方图。示例代码及输出清晰展示了 bin 的边界与对应频率的关系。
27 11
|
8天前
|
Python
NumPy 教程 之 NumPy Matplotlib 4
使用 Python 的绘图库 Matplotlib,结合 NumPy,生成各种图形,作为 MatLab 的开源替代方案。您将学习到如何用 matplotlib 和 NumPy 包来创建正弦波图形,以及如何在同一图中利用 subplot() 函数组织和展示不同的子图,例如同时绘制正弦和余弦曲线。通过实际代码示例,加深对这些功能的理解。
28 12
|
5天前
|
API Python
Matplotlib 教程 之 Matplotlib Pyplot 2
Matplotlib 的子库 Pyplot 提供了类似 MATLAB 的绘图 API,是常用的 2D 图表绘制模块。通过 `import matplotlib.pyplot as plt` 导入后,可使用如 `plot()`, `scatter()`, `bar()`, `hist()`, `pie()`, `imshow()` 和 `subplots()` 等函数来轻松生成并调整图表。其中 `plot()` 用于绘制线图和散点图,接受 `x` 和 `y` 数据及可选格式参数 `fmt`。
21 8
|
23小时前
|
Python
Matplotlib 教程 之 Matplotlib 绘图标记 3
这段Matplotlib教程展示了如何通过`plot()`方法的`marker`参数来自定义图表标记,为数据点添加独特的视觉风格。例如,通过设置`marker = '*'`,可以使每个数据点显示为星形标记。这在需要对坐标轴进行特殊标注时尤为有用。下面的示例代码生成了一个带有星形标记的简单折线图。
5 1
|
8天前
|
Python
NumPy 教程 之 NumPy Matplotlib 3
使用Python的绘图库Matplotlib与NumPy结合,创建有效的MatLab开源替代方案。它还支持与PyQt和wxPython等图形工具包搭配使用。通过向`plot()`函数添加特定格式字符串,可以展示离散值而非线性图。提供了多种线型和标记选项,例如实线`-`、虚线`--`、点标记`.`等,以及颜色缩写如蓝色`b`、绿色`g`等。示例代码展示了如何用圆点表示数据点而非线条。
30 10
|
3天前
|
API Python
Matplotlib 教程 之 Matplotlib Pyplot 8
Matplotlib教程之Matplotlib Pyplot第8部分介绍了Pyplot子库,其提供类似MATLAB的绘图API,常用于绘制2D图表。通过导入`matplotlib.pyplot`并设置别名`plt`来使用其功能,如`plot()`、`scatter()`、`bar()`等。此外还支持颜色、线型及标记参数,示例展示了如何绘制正弦和余弦图形。
8 2
|
8天前
|
Python
NumPy 教程 之 NumPy Matplotlib 5
Matplotlib 是 Python 的绘图库,配合 NumPy 可作为 MatLab 的开源替代方案,并能与 PyQt 和 wxPython 等图形工具包共同使用。本教程重点讲解 `bar()` 函数用于生成条形图的方法,并通过实例展示了如何创建并显示两组数据的条形图。
25 7
|
5天前
|
API Python
Matplotlib 教程 之 Matplotlib Pyplot 4
Matplotlib 子库 Pyplot,提供了类似 MATLAB 的绘图 API,便于用户绘制 2D 图表。Pyplot 包含一系列函数,如 `plot()`、`scatter()`、`bar()`、`hist()`、`pie()` 和 `imshow()` 等,可对图像进行各种修改。通过 `import matplotlib.pyplot as plt` 导入库后,即可使用这些函数。此外,还介绍了颜色、线型和标记等参数的使用方法。
12 2