跳至主要内容

Python Seaborn 折线图教程:创建数据可视化

了解如何使用 Seaborn(流行的 Python 可视化库)在 Python 中创建并自定义折线图。
· 12分钟 阅读

使用 AI 探索

折线图是一种关系型数据可视化图表,用于展示一个连续变量随另一个变量变化的方式。它是最常见的图形之一,广泛应用于金融、销售、市场、医疗、自然科学等领域。

在本教程中,我们将讨论如何使用流行的 Python 可视化库 Seaborn,在 Python 中创建并自定义折线图。

数据集介绍

为了便于练习 Seaborn 折线图,我们将首先下载一个 Kaggle 数据集 Daily Exchange Rates per Euro 1999-2024。然后,我们会导入所需的包、读取并清洗数据框。以下代码演示了清洗步骤,具体细节在此不展开:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

daily_exchange_rate_df = pd.read_csv('euro-daily-hist_1999_2022.csv')
daily_exchange_rate_df = daily_exchange_rate_df.iloc[:, [0, 1, 4, -2]]
daily_exchange_rate_df.columns = ['Date', 'Australian dollar', 'Canadian dollar', 'US dollar']
daily_exchange_rate_df = pd.melt(daily_exchange_rate_df, id_vars='Date', value_vars=['Australian dollar', 'Canadian dollar', 'US dollar'], value_name='Euro rate', var_name='Currency')
daily_exchange_rate_df['Date'] = pd.to_datetime(daily_exchange_rate_df['Date'])
daily_exchange_rate_df = daily_exchange_rate_df[daily_exchange_rate_df['Date']>='2022-12-01'].reset_index(drop=True)
daily_exchange_rate_df['Euro rate'] = pd.to_numeric(daily_exchange_rate_df['Euro rate'])

print(f'Currencies: {daily_exchange_rate_df.Currency.unique()}\n')
print(df.head())
print(f'\n{daily_exchange_rate_df.Date.dt.date.min()}/{ daily_exchange_rate_df.Date.dt.date.max()}')

输出:

Currencies: ['Australian dollar' 'Canadian dollar' 'US dollar']

        Date           Currency  Euro rate
0 2023-01-27  Australian dollar     1.5289
1 2023-01-26  Australian dollar     1.5308
2 2023-01-25  Australian dollar     1.5360
3 2023-01-24  Australian dollar     1.5470
4 2023-01-23  Australian dollar     1.5529

2022-12-01/2023-01-27

得到的数据框包含 2022 年 01.12.2022 至 27.01.2023(含)期间,澳元、加元和美元相对于欧元的每日(工作日)汇率。

现在,我们已经准备好开始创建并自定义 Python Seaborn 折线图了。

Seaborn 折线图基础

在 Seaborn 中创建折线图,可以使用两个函数之一:lineplot() 或 relplot()。总体而言,它们共享大量相同功能和参数名。主要区别在于,relplot() 允许在不同分面上绘制多条折线;而 lineplot() 支持置信区间和数据聚合。

本教程中,我们主要使用 lineplot() 函数。

课程 Introduction to Data Visualization with Seaborn 将帮助您学习并练习 seaborn 库的主要函数与方法。您也可以查看我们的 Seaborn 入门教程,加深对这一流行 Python 库的理解。

创建单条 Seaborn 折线图

我们可以按如下方式创建展示两个连续变量关系的折线图:

usd = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='US dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)

输出:

使用 lineplot 的 Seaborn 单折线图

上图展示了欧元兑美元(EUR-USD)汇率的变化趋势。我们指定了绘图的 x、y 轴变量(参数 x 和 y),以及从哪个数据框(data)中获取这些变量。

作为对比,若用 relplot() 创建相同图表,代码如下:

sns.relplot(x='Date', y='Euro rate', data=usd, kind='line')

输出:

使用 relplot 的 Seaborn 单折线图

此处我们额外传入了 relplot() 特有的参数:kind='line'。默认情况下,该函数创建散点图。

自定义单条 Seaborn 折线图

我们可以通过多种方式自定义上面的图表,使其更易读、更具信息量。例如:调整画布尺寸、添加标题和坐标轴标签、设置字体大小、自定义线条、添加并自定义标记等。下面看看如何在 Seaborn 中实现这些改进。

调整画布尺寸

由于 Seaborn 构建于 matplotlib 之上,我们可以使用 matplotlib.pyplot 来调整画布大小:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd)

输出:

Seaborn 单折线图——使用 relplot 调整画布尺寸

而对于 relplot(),可以通过 height 和 aspect(宽高比)参数达到同样目的:

sns.relplot(x='Date', y='Euro rate', data=usd, kind='line', height=6, aspect=4)

输出:

Seaborn 折线图

添加标题和坐标轴标签

要为图表添加标题与坐标轴标签,可在 seaborn 折线图对象上调用 set(),传入 title、xlabel 和 ylabel 参数:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')

输出:

Seaborn 单折线图——添加标题与坐标轴标签

调整字体大小

调整字体大小的便捷方式是使用 set_theme(),并尝试不同的 font_scale 参数值:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 单折线图——调整字体大小

注意,我们还添加了 style='white' 以避免覆盖初始样式。

更改线条颜色、样式和粗细

要自定义折线,可传入一些与 matplotlib.pyplot.plot 通用的可选参数,如 color、linestyle 或 linewidth:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, linestyle='dotted', color='magenta', linewidth=5).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 单折线图——自定义线条

添加标记并自定义其颜色、样式和大小

可以在折线上添加标记并自定义其外观。在这种情况下,我们同样可以使用来自 matplotlib 的参数,如 marker、markerfacecolor 或 markersize:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, marker='*', markerfacecolor='limegreen', markersize=20).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 单折线图——添加并自定义标记

文档提供了可用于改进 seaborn 折线图美观度的完整参数列表。尤其可以查看所有可选标记样式。

在我们的Seaborn 速查表中,您还可以找到在 Seaborn 中自定义折线图的其他方法。

包含多条线的 Seaborn 折线图

我们经常需要探索多个连续变量如何随另一个连续变量变化。为此,可以构建包含多条线的 Seaborn 折线图。lineplot() 和 relplot() 同样适用于这种情况。

创建包含多条线的 Seaborn 折线图

从技术上讲,可以通过为每个因变量(即每条线)分别绘制一个坐标轴对象来创建多折线图:

aud = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Australian dollar'].reset_index(drop=True)
cad = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Canadian dollar'].reset_index(drop=True)

sns.lineplot(x='Date', y='Euro rate', data=usd)
sns.lineplot(x='Date', y='Euro rate', data=aud)
sns.lineplot(x='Date', y='Euro rate', data=cad)

输出:

Seaborn 多折线图——为因变量分别创建坐标轴对象

上面我们从初始数据框 daily_exchange_rate_df 中提取了澳元和加元两个子集,并分别绘制了各自的欧元汇率随时间的变化。不过,还有更高效的方法:使用 hue、style 或 size 参数,它们在 lineplot() 和 relplot() 中都可用。

使用 hue 参数

该参数的工作方式如下:将数据框中一个包含分类值的列名赋给它,seaborn 会为每个类别生成一条折线,并为每条线分配不同颜色:

sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency')

输出:

使用 hue 的 Seaborn 多折线图

只需一行简单代码,我们就为三类数据创建了 Seaborn 折线图。请注意此处传入的是初始数据框 daily_exchange_rate_df,而不是为不同货币分别创建的子集。

使用 style 参数

style 参数与 hue 的作用相同,但它通过不同的线型(实线、虚线、点线等)来区分类别,而不改变颜色:

sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency')

输出:

使用 style 的 Seaborn 多折线图

使用 size 参数

与 hue 和 style 类似,size 参数会为每个类别创建一条独立的折线。它不影响颜色和线型,而是通过不同的线宽来区分类别:

sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency')

输出:

使用 size 的 Seaborn 多折线图

自定义包含多条线的 Seaborn 折线图

现在让我们尝试调整图表的美观度。其中一些技巧与单折线图相同,另一些仅适用于多折线图。

整体调整

我们可以与单折线图相同的方式,调整画布尺寸、添加标题与坐标轴标签、修改字体大小:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 多折线图——整体调整

更改每条线的颜色、样式和粗细

前面我们看到,当使用 hue、style 或 size 参数时,seaborn 会为多折线图提供默认的颜色/样式/线宽集合。必要时,我们可以覆盖这些默认设置,自行选择颜色/样式/线宽。

当使用 hue 参数时,可以同时传入 palette 参数,提供一个 matplotlib 颜色名的列表或元组。我建议阅读我们的教程 Seaborn 色板:选色速查,了解更多配色理论,并获取让可视化更出色的灵感。

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen']).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 hue 并提供自定义色板的 Seaborn 多折线图

也可以直接应用现有的 matplotlib 色板:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette='spring').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 hue 并提供标准色板的 Seaborn 多折线图

同时,在使用 hue 时,我们仍可通过传入 linestyle 和 linewidth 参数来统一调整所有线的线型和线宽:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen'], linestyle='dashed', linewidth=5).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 hue——统一调整线型、颜色与线宽的 Seaborn 多折线图

而当使用 style 参数创建多折线图时,可以为名为 dashes 的参数传入一个由列表(或元组)组成的列表(或元组):

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 style 并提供自定义线型模式的 Seaborn 多折线图

在上述传给 dashes 的嵌套列表中,每个子列表的第一个数表示对应折线的线段长度,第二个数表示间隔长度。

注意:若要表示实线,需要将间隔长度设为 0,例如:[1, 0]。

若要统一调整该图所有折线的颜色与线宽,可像自定义单折线图那样传入 color 和 linewidth 参数:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]], color='darkviolet', linewidth=4).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 style——统一调整线型、颜色与线宽的 Seaborn 多折线图

最后,当使用 size 参数创建多折线图时,可以通过 sizes 参数控制每条线的线宽。它接收一个整数列表(或元组):

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 size 并自定义线宽的 Seaborn 多折线图

要自定义该图所有折线的颜色与线型,需要提供 linestyle 和 color 参数:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5], linestyle='dotted', color='teal').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

使用 size——统一调整线型、颜色与线宽的 Seaborn 多折线图

添加标记并自定义其颜色、样式和大小

我们可能希望在 Seaborn 多折线图上添加标记。

若要在所有折线上添加相同颜色、样式和大小的标记,需要使用 matplotlib 的相关参数,如 marker、markerfacecolor、markersize 等,与单折线图相同:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', marker='o', markerfacecolor='orangered', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 多折线图——相同颜色、样式与大小的标记

但如果希望为每条线使用不同的标记,则需要使用 markers 参数。不过根据 seaborn 的功能限制,该参数仅在指定了 style 参数时有效:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 多折线图——不同样式的标记

在上图中,我们可以通过提供 dashes 参数,并为每条线设置 [1, 0] 的线型模式,使所有折线均为实线:

fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], dashes=[[1, 0], [1, 0], [1, 0]], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)

输出:

Seaborn 多折线图——实线与不同样式的标记

结论

回顾一下,在本教程中,我们学习了使用单条或多条折线创建并自定义 Seaborn 折线图的多种方法。

进一步来说,借助 seaborn,我们还可以做更多自定义。例如:

  • 按多个分类变量对折线分组
  • 自定义图例
  • 在不同分面上创建多折线图
  • 显示并自定义置信区间
  • 为时间序列折线图自定义时间轴刻度及其标签

想要更深入地了解 seaborn 的功能与实现方式,建议学习我们的课程 Intermediate Data Visualization with Seaborn。

Seaborn 折线图常见问题

什么是 Seaborn 中的折线图?

折线图是 Seaborn 中的一种图表类型,通过用直线连接数据点来展示两个变量之间的关系。

哪类数据最适合用 Seaborn 折线图展示?

当两个变量之间存在明确关系,且变量为连续或有序类型时,折线图最为适用。

我可以在同一张图中绘制多条折线吗?

可以。您可以使用 hue 参数按某个分类变量分组,从而在同一张图上绘制多条折线。

Seaborn 中折线图与散点图有什么区别?

Seaborn 中的折线图用直线展示两个变量的关系,而散点图则使用单个数据点来展示关系。

我可以在折线图中添加回归线吗?

可以。您可以使用 regplot() 函数为折线图添加回归线,它会在两个变量之间拟合并绘制线性回归模型。

如何将我的 Seaborn 折线图保存为文件?

您可以使用 matplotlib 库中的 savefig() 函数将 Seaborn 折线图保存为文件,该函数会将当前图形保存到指定的路径和格式。

主题