Seaborn 折线图

在 Seaborn 中,最基本的也是绘制一个折线图。这一节我们先来简单介绍如何绘制一个折线图,然后在后面再去学习如何绘制其他图表。

Seaborn 折线图函数

在 Seaborn 中,我们可以使用 lineplot() 函数来绘制一个折线图。折线图的主要作用是:观察 “因变量 y” 随着 “自变量 x” 的变化而变化的趋势。

语法:

sns.lineplot(data, x, y)

说明:

lineplot() 函数接收以下主要参数。

  • data(可选):用于指定 DataFrame。在 Seaborn 中,所有绘图函数的 data 参数都必须是 Series 或 DataFrame 类型,不能是其他类型(例如列表)。
  • x(可选):用于指定 DataFrame 中的哪一列作为 x 轴的坐标。
  • y(可选):用于指定 DataFrame 中的哪一列作为 y 轴的坐标。

lineplot() 函数会根据提供的数据绘制线形图。如果提供了 x 和 y 参数,则它们定义了图上的 x 轴和 y 轴。如果仅提供 data 参数,则函数将尝试从数据对象本身推断出 x 轴和 y 轴。

示例 1:Seaborn 绘制一条折线

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

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 气温数据(单位:度)
data = [
    ['2025-01-01', 16],
    ['2025-01-02', 15],
    ['2025-01-03', 16],
    ['2025-01-04', 18],
    ['2025-01-05', 17]
]
df = pd.DataFrame(data, columns=['日期', '气温'])
# 绘图
sns.lineplot(data=df, x='日期', y='气温')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 绘制一条折线-1

分析:

sns.lineplot(data=df, x='日期', y='气温') 表示使用 DataFrame 中 “日期” 这一列数据作为 x 轴坐标,并且使用 “气温” 这一列作为 y 轴坐标。有了 x 轴坐标和 y 轴坐标,Seaborn 就可以绘制一个折线图出来了。

此外对于 lineplot() 函数来说,它其实有 2 种语法方式。对于这个例子来说,下面 2 种方式是等价的。

# 方式 1
sns.lineplot(data=df, x='日期', y='气温')

# 方式 2
sns.lineplot(x=df['日期'], y=df['气温'])

当我们指定 data 为一个 DataFrame 时,此时 x 和 y 的值应该是一个行名。当没有指定 data 这个参数时,此时 x 和 y 的值应该是一个 Series。小伙伴们一定要认真记住这 2 种方式,因为在很多地方都会见到。

示例 2:Seaborn 绘制多条折线

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

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 气温数据(单位:度)
data = [
    ['2025-01-01', 16, 5],
    ['2025-01-02', 15, 7],
    ['2025-01-03', 16, 8],
    ['2025-01-04', 18, 6],
    ['2025-01-05', 17, 8]
]
df = pd.DataFrame(data, columns=['日期', '广州', '北京'])
# 绘图
sns.lineplot(data=df, x='日期', y='广州')
sns.lineplot(data=df, x='日期', y='北京')

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 绘制多条折线-1

分析:

和 Matplotlib 一样,如果想要同时绘制多条折线,我们只需要调用多次 lineplot() 函数就可以了,非常的简单。

同样地,对于这个例子来说,下面 2 种方式是等价的。

# 方式 1
sns.lineplot(data=df, x='日期', y='广州')
sns.lineplot(data=df, x='日期', y='北京')

# 方式 2
sns.lineplot(x=df['日期'], y=df['广州'])
sns.lineplot(x=df['日期'], y=df['北京'])

深入了解 Seaborn 绘图

上面这种绘图方式和 Matplotlib 的绘图方式是大同小异的,都需要显式地指定 x 轴坐标和 y 轴坐标,也就是需要指定 lineplot() 函数的 x 和 y。作为比 Matplotlib 更好用的 Seaborn,它本身提供了更加简单的方式,可以不显式指定 x 和 y,然后自动地绘图。

我们都知道 lineplot() 函数的 data 是一个 DataFrame,然后一个 DataFrame 包含 index(行名)、columns(列名)和 values(数据)这 3 部分,如下图所示。我们可以使用 DataFrame 的 set_index() 方法来指定某一列为行名,然后该列就会成为 “自变量 x”,而其他列就会成为 “因变量 y”。

有了自变量 x 和因变量 y, lineplot() 函数就会自动将自变量 x 作为 x 轴坐标,然后将因变量 y 作为 y 轴坐标。需要注意的是,因变量可能有多个。有多少个因变量,就会绘制多少条折线。

DataFrame 的结构

示例 3:绘制一条折线

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

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 气温数据(单位:度)
data = [
    ['2025-01-01', 16],
    ['2025-01-02', 15],
    ['2025-01-03', 16],
    ['2025-01-04', 18],
    ['2025-01-05', 17]
]
df = pd.DataFrame(data, columns=['日期', '气温'])
# 指定“日期”这一列为行名
df.set_index('日期', inplace=True)
# 绘制图表
sns.lineplot(data=df)

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 绘制一条折线-2

分析:

对于一个折线图来说,它描述的是 “因变量 y” 随着 “自变量 x” 的改变而变化的趋势,所以它需要 2 个东西:自变量 x 和因变量 y。在这个例子中,df.set_index('日期', inplace=True) 表示将 “日期” 这一列设置为行名,此时 “日期” 这一列的数据就会自动成为自变量 x(即 x 轴坐标),然后剩余的其他列会自动成为因变量 y(即 y 轴坐标)。

有了自变量和因变量,在使用 lineplot() 函数绘图时,我们就不需要显式指定 x 和 y 这两个参数了,Seaborn 会自动识别然后进行绘图。这个技巧是非常有用的,我们再来多看一个例子。

示例 4:绘制多条折线

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

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 气温数据(单位:度)
data = [
    ['2025-01-01', 16, 5],
    ['2025-01-02', 15, 7],
    ['2025-01-03', 16, 8],
    ['2025-01-04', 18, 6],
    ['2025-01-05', 17, 8]
]
df = pd.DataFrame(data, columns=['日期', '广州', '北京'])
# 指定“日期”这一列为行名
df.set_index('日期', inplace=True)
# 绘制图表
sns.lineplot(data=df)

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 绘制多条折线-2

分析:

对于这个例子来说,“日期” 这一列数据是自变量,然后剩下的 “广州” 和 “北京” 这两列数据都是因变量。由于因变量有 2 个,所以会自动绘制 2 条折线出来。当然了,如果有 n 个因变量,Seaborn 就会自动绘制 n 条折线出来。

最后需要说明的是,在实际开发中,我们更多是使用 Seaborn 自动识别的方式来绘图,而不是使用显式指定 x 和 y 的方式来绘图。

Seaborn 折线图案例

Seaborn 内置了一个数据集 flights,该数据集保存的是某航空公司 1949 ~ 1960 这 12 年内每个月的乘客人数,其中部分数据如下图所示。我们可以使用 sns.load_dataset('flights') 来加载并使用这个数据集。

Seaborn flights 数据集

示例 5:1 月份数据

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)

# 使用透视表,重构 DataFrame
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)
# 绘制图表
sns.lineplot(data=df['Jan'])

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 折线图 1 月份数据

分析:

df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)

上面这一句代码表示使用透视表的方式(即 pivot_table() 方法)将 df 进行重构。我们可以使用 print(df) 打印一下,结果如下:

月份      Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
年份
1949  112.0  118.0  132.0  129.0  121.0  135.0  148.0  148.0  136.0  119.0  104.0  118.0
1950  115.0  126.0  141.0  135.0  125.0  149.0  170.0  170.0  158.0  133.0  114.0  140.0
1951  145.0  150.0  178.0  163.0  172.0  178.0  199.0  199.0  184.0  162.0  146.0  166.0
1952  171.0  180.0  193.0  181.0  183.0  218.0  230.0  242.0  209.0  191.0  172.0  194.0
1953  196.0  196.0  236.0  235.0  229.0  243.0  264.0  272.0  237.0  211.0  180.0  201.0
1954  204.0  188.0  235.0  227.0  234.0  264.0  302.0  293.0  259.0  229.0  203.0  229.0
1955  242.0  233.0  267.0  269.0  270.0  315.0  364.0  347.0  312.0  274.0  237.0  278.0
1956  284.0  277.0  317.0  313.0  318.0  374.0  413.0  405.0  355.0  306.0  271.0  306.0
1957  315.0  301.0  356.0  348.0  355.0  422.0  465.0  467.0  404.0  347.0  305.0  336.0
1958  340.0  318.0  362.0  348.0  363.0  435.0  491.0  505.0  404.0  359.0  310.0  337.0
1959  360.0  342.0  406.0  396.0  420.0  472.0  548.0  559.0  463.0  407.0  362.0  405.0
1960  417.0  391.0  419.0  461.0  472.0  535.0  622.0  606.0  508.0  461.0  390.0  432.0

其中,pivot_table() 函数用于根据一个或多个索引和一个或多个列的值来创建类似电子表格的透视表,它接收以下 3 个参数。

  • index:用于指定用作透视表索引的列。
  • columns:用于指定用作透视表列的列。
  • values:用于指定要聚合的值。

然后 sns.lineplot(data=df['Jan']) 表示数据部分是 “Jan” 的人数。需要注意的是,此时的 df 的行名是 “年份”,列名是 “Jan”。由于只有 1 列,所有绘制的是一条折线。

示例 6:12 个月的数据

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)

# 使用透视表,重构 DataFrame
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)
# 绘制图表
sns.lineplot(data=df)

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 折线图 12 个月的数据

分析:

对于这个例子来说,DataFrame 的行名是 “年份”,列名是 “月份”。由于这里有 12 个列,所以会自动绘制 12 条折线出来。

示例 7:每年的航班情况

import matplotlib.pyplot as plt
import seaborn as sns

# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})

# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)

# 使用透视表,重构 DataFrame
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)
# 行列转置
df = df.T
# 绘制图表
sns.lineplot(data=df)

# 显示
plt.show()

运行之后,效果如下图所示。

Seaborn 折线图每年航班情况

分析:

如果想要绘制每年的航班情况,那么列名就应该是 “年份”,而行名就应该是 “月份”,此时我们可以使用 T 属性来进行行列转置。执行了 df=df.T 之后,此时得到的 df 如下:

年份    1949   1950   1951   1952   1953   1954   1955   1956   1957   1958   1959   1960
月份
Jan  112.0  115.0  145.0  171.0  196.0  204.0  242.0  284.0  315.0  340.0  360.0  417.0
Feb  118.0  126.0  150.0  180.0  196.0  188.0  233.0  277.0  301.0  318.0  342.0  391.0
Mar  132.0  141.0  178.0  193.0  236.0  235.0  267.0  317.0  356.0  362.0  406.0  419.0
Apr  129.0  135.0  163.0  181.0  235.0  227.0  269.0  313.0  348.0  348.0  396.0  461.0
May  121.0  125.0  172.0  183.0  229.0  234.0  270.0  318.0  355.0  363.0  420.0  472.0
Jun  135.0  149.0  178.0  218.0  243.0  264.0  315.0  374.0  422.0  435.0  472.0  535.0
Jul  148.0  170.0  199.0  230.0  264.0  302.0  364.0  413.0  465.0  491.0  548.0  622.0
Aug  148.0  170.0  199.0  242.0  272.0  293.0  347.0  405.0  467.0  505.0  559.0  606.0
Sep  136.0  158.0  184.0  209.0  237.0  259.0  312.0  355.0  404.0  404.0  463.0  508.0
Oct  119.0  133.0  162.0  191.0  211.0  229.0  274.0  306.0  347.0  359.0  407.0  461.0
Nov  104.0  114.0  146.0  172.0  180.0  203.0  237.0  271.0  305.0  310.0  362.0  390.0
Dec  118.0  140.0  166.0  194.0  201.0  229.0  278.0  306.0  336.0  337.0  405.0  432.0

上一篇: Seaborn 刻度范围

下一篇: Seaborn 散点图

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号