折线图是一种关系型数据可视化图表,用于展示一个连续变量随另一个变量变化的方式。它是最常见的图形之一,广泛应用于金融、销售、市场、医疗、自然科学等领域。
在本教程中,我们将讨论如何使用流行的 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) 技术支持
输出 :
上图展示了欧元兑美元(EUR-USD)汇率的变化趋势。我们指定了绘图的 x 、y 轴变量(参数 x 和 y ),以及从哪个数据框(data)中获取这些变量。
作为对比,若用 relplot() 创建相同图表,代码如下:
sns. relplot( x= 'Date' , y= 'Euro rate' , data= usd, kind= 'line' ) 技术支持
输出 :
此处我们额外传入了 relplot() 特有的参数:kind='line'。默认情况下,该函数创建散点图。
自定义单条 Seaborn 折线图
我们可以通过多种方式自定义上面的图表,使其更易读、更具信息量。例如:调整画布尺寸、添加标题和坐标轴标签、设置字体大小、自定义线条、添加并自定义标记等。下面看看如何在 Seaborn 中实现这些改进。
调整画布尺寸
由于 Seaborn 构建于 matplotlib 之上,我们可以使用 matplotlib.pyplot 来调整画布大小:
fig = plt. subplots( figsize= ( 20 , 5 ) )
sns. lineplot( x= 'Date' , y= 'Euro rate' , data= usd) 技术支持
输出 :
而对于 relplot(),可以通过 height 和 aspect(宽高比)参数达到同样目的:
sns. relplot( x= 'Date' , y= 'Euro rate' , data= usd, kind= 'line' , height= 6 , aspect= 4 ) 技术支持
输出 :
添加标题和坐标轴标签
要为图表添加标题与坐标轴标签,可在 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' ) 技术支持
输出 :
调整字体大小
调整字体大小的便捷方式是使用 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 ) 技术支持
输出 :
注意,我们还添加了 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 ) 技术支持
输出 :
添加标记并自定义其颜色、样式和大小
可以在折线上添加标记并自定义其外观。在这种情况下,我们同样可以使用来自 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 折线图。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) 技术支持
输出 :
上面我们从初始数据框 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' ) 技术支持
输出 :
只需一行简单代码,我们就为三类数据创建了 Seaborn 折线图。请注意此处传入的是初始数据框 daily_exchange_rate_df,而不是为不同货币分别创建的子集。
使用 style 参数
style 参数与 hue 的作用相同,但它通过不同的线型(实线、虚线、点线等)来区分类别,而不改变颜色:
sns. lineplot( x= 'Date' , y= 'Euro rate' , data= daily_exchange_rate_df, style= 'Currency' ) 技术支持
输出 :
使用 size 参数
与 hue 和 style 类似,size 参数会为每个类别创建一条独立的折线。它不影响颜色和线型,而是通过不同的线宽来区分类别:
sns. lineplot( x= 'Date' , y= 'Euro rate' , data= daily_exchange_rate_df, size= 'Currency' ) 技术支持
输出 :
自定义包含多条线的 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 ) 技术支持
输出 :
更改每条线的颜色、样式和粗细
前面我们看到,当使用 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 ) 技术支持
输出 :
也可以直接应用现有的 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 时,我们仍可通过传入 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 ) 技术支持
输出 :
而当使用 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 ) 技术支持
输出 :
在上述传给 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 ) 技术支持
输出 :
最后,当使用 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 ) 技术支持
输出 :
要自定义该图所有折线的颜色与线型,需要提供 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 ) 技术支持
输出 :
添加标记并自定义其颜色、样式和大小
我们可能希望在 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 ) 技术支持
输出 :
但如果希望为每条线使用不同的标记,则需要使用 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 ) 技术支持
输出 :
在上图中,我们可以通过提供 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 的功能与实现方式,建议学习我们的课程 Intermediate Data Visualization with Seaborn 。
折线图是一种关系型数据可视化图表,用于展示一个连续变量随另一个变量变化的方式。它是最常见的图形之一,广泛应用于金融、销售、市场、医疗、自然科学等领域。
在本教程中,我们将讨论如何使用流行的 Python 可视化库 Seaborn,在 Python 中创建并自定义折线图。
数据集介绍
为了便于练习 Seaborn 折线图,我们将首先下载一个 Kaggle 数据集 Daily Exchange Rates per Euro 1999-2024。然后,我们会导入所需的包、读取并清洗数据框。以下代码演示了清洗步骤,具体细节在此不展开:
输出:
得到的数据框包含 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 折线图
我们可以按如下方式创建展示两个连续变量关系的折线图:
输出:
上图展示了欧元兑美元(EUR-USD)汇率的变化趋势。我们指定了绘图的 x、y 轴变量(参数 x 和 y),以及从哪个数据框(data)中获取这些变量。
作为对比,若用
relplot()创建相同图表,代码如下:输出:
此处我们额外传入了
relplot()特有的参数:kind='line'。默认情况下,该函数创建散点图。自定义单条 Seaborn 折线图
我们可以通过多种方式自定义上面的图表,使其更易读、更具信息量。例如:调整画布尺寸、添加标题和坐标轴标签、设置字体大小、自定义线条、添加并自定义标记等。下面看看如何在 Seaborn 中实现这些改进。
调整画布尺寸
由于 Seaborn 构建于 matplotlib 之上,我们可以使用
matplotlib.pyplot来调整画布大小:输出:
而对于 relplot(),可以通过 height 和 aspect(宽高比)参数达到同样目的:
输出:
添加标题和坐标轴标签
要为图表添加标题与坐标轴标签,可在 seaborn 折线图对象上调用
set(),传入 title、xlabel和ylabel参数:输出:
调整字体大小
调整字体大小的便捷方式是使用
set_theme(),并尝试不同的font_scale参数值:输出:
注意,我们还添加了
style='white'以避免覆盖初始样式。更改线条颜色、样式和粗细
要自定义折线,可传入一些与
matplotlib.pyplot.plot通用的可选参数,如color、linestyle或linewidth:输出:
添加标记并自定义其颜色、样式和大小
可以在折线上添加标记并自定义其外观。在这种情况下,我们同样可以使用来自 matplotlib 的参数,如
marker、markerfacecolor或markersize:输出:
文档提供了可用于改进 seaborn 折线图美观度的完整参数列表。尤其可以查看所有可选标记样式。
在我们的Seaborn 速查表中,您还可以找到在 Seaborn 中自定义折线图的其他方法。
包含多条线的 Seaborn 折线图
我们经常需要探索多个连续变量如何随另一个连续变量变化。为此,可以构建包含多条线的 Seaborn 折线图。
lineplot()和relplot()同样适用于这种情况。创建包含多条线的 Seaborn 折线图
从技术上讲,可以通过为每个因变量(即每条线)分别绘制一个坐标轴对象来创建多折线图:
输出:
上面我们从初始数据框
daily_exchange_rate_df中提取了澳元和加元两个子集,并分别绘制了各自的欧元汇率随时间的变化。不过,还有更高效的方法:使用hue、style或size参数,它们在lineplot()和relplot()中都可用。使用 hue 参数
该参数的工作方式如下:将数据框中一个包含分类值的列名赋给它,seaborn 会为每个类别生成一条折线,并为每条线分配不同颜色:
输出:
只需一行简单代码,我们就为三类数据创建了 Seaborn 折线图。请注意此处传入的是初始数据框
daily_exchange_rate_df,而不是为不同货币分别创建的子集。使用 style 参数
style 参数与 hue 的作用相同,但它通过不同的线型(实线、虚线、点线等)来区分类别,而不改变颜色:
输出:
使用 size 参数
与 hue 和 style 类似,size 参数会为每个类别创建一条独立的折线。它不影响颜色和线型,而是通过不同的线宽来区分类别:
输出:
自定义包含多条线的 Seaborn 折线图
现在让我们尝试调整图表的美观度。其中一些技巧与单折线图相同,另一些仅适用于多折线图。
整体调整
我们可以与单折线图相同的方式,调整画布尺寸、添加标题与坐标轴标签、修改字体大小:
输出:
更改每条线的颜色、样式和粗细
前面我们看到,当使用 hue、style 或 size 参数时,seaborn 会为多折线图提供默认的颜色/样式/线宽集合。必要时,我们可以覆盖这些默认设置,自行选择颜色/样式/线宽。
当使用 hue 参数时,可以同时传入
palette参数,提供一个 matplotlib 颜色名的列表或元组。我建议阅读我们的教程 Seaborn 色板:选色速查,了解更多配色理论,并获取让可视化更出色的灵感。输出:
也可以直接应用现有的 matplotlib 色板:
输出:
同时,在使用
hue时,我们仍可通过传入linestyle和linewidth参数来统一调整所有线的线型和线宽:输出:
而当使用 style 参数创建多折线图时,可以为名为 dashes 的参数传入一个由列表(或元组)组成的列表(或元组):
输出:
在上述传给 dashes 的嵌套列表中,每个子列表的第一个数表示对应折线的线段长度,第二个数表示间隔长度。
注意:若要表示实线,需要将间隔长度设为 0,例如:
[1, 0]。若要统一调整该图所有折线的颜色与线宽,可像自定义单折线图那样传入 color 和 linewidth 参数:
输出:
最后,当使用 size 参数创建多折线图时,可以通过
sizes参数控制每条线的线宽。它接收一个整数列表(或元组):输出:
要自定义该图所有折线的颜色与线型,需要提供 linestyle 和 color 参数:
输出:
添加标记并自定义其颜色、样式和大小
我们可能希望在 Seaborn 多折线图上添加标记。
若要在所有折线上添加相同颜色、样式和大小的标记,需要使用 matplotlib 的相关参数,如 marker、
markerfacecolor、markersize等,与单折线图相同:输出:
但如果希望为每条线使用不同的标记,则需要使用 markers 参数。不过根据 seaborn 的功能限制,该参数仅在指定了 style 参数时有效:
输出:
在上图中,我们可以通过提供 dashes 参数,并为每条线设置
[1, 0]的线型模式,使所有折线均为实线:输出:
结论
回顾一下,在本教程中,我们学习了使用单条或多条折线创建并自定义 Seaborn 折线图的多种方法。
进一步来说,借助 seaborn,我们还可以做更多自定义。例如:
想要更深入地了解 seaborn 的功能与实现方式,建议学习我们的课程 Intermediate Data Visualization with Seaborn。