分享

Python绘图库之Seaborn(一)

 NeighborMrSun 2023-03-02 发布于湖南

Seaborn绘图

Seaborn是一个统计数据可视化的Python库,官方网站在这里:

https://seaborn.

它是基于Matplotlib库的可视化工具,提供了一些高级绘图API。也就是说,Seaborn库绘图相比matplotlib而言没有那么繁琐了,简洁的代码可以绘制一幅很好的图形。

Seaborn的绘图数据对象是DataFrame对象或者是array数组。一般我们使用DataFrame作为它的绘图对象。在正式地绘图之前,我们先来看下这个库的绘图风格和颜色模式吧。

绘图风格和颜色模式

绘图风格

先看绘图风格,我们之前说过matplotlib的绘图风格有很多种,其中一个就是seaborn风格。它正式Seaborn库中的绘图风格。那我们来看下具体的风格吧,以iris数据集的箱线图为例。

import seaborn as sns
import matplotlib.pyplot as plt


df = sns.load_dataset('iris'# seaborn自带的iris数据集
fig, ax = plt.subplots(figsize=(6,6))
ax.boxplot(df.iloc[:50,:2])
plt.show()

程序输出的结果见下图。

图片

这是普通的matplotlib绘图的风格,那么我们要是seaborn的绘图默认风格,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt


df = sns.load_dataset('iris'# seaborn自带的iris数据集
sns.set_theme() # 设置默认的Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
ax.boxplot(df.iloc[:50,:2])
plt.show()

程序输出的结果见下图。

图片

实际上,这个函数有一些选项可以调整的,第一个参数context,它的参数可以是字典或者是几个既定好的字符串,分别代表几个不同的风格,详细的参数取值可以参考这里

https://seaborn./generated/seaborn.plotting\_context.html

下面就不同的参数给出不同风格的图形,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt


df = sns.load_dataset('iris'# seaborn自带的iris数据集
sns.set_theme(context='notebook'# 默认风格
fig1 = plt.figure(1,figsize=(6,6))
ax1 = fig1.add_subplot()
ax1.boxplot(df.iloc[:50,:2])
sns.set_theme(context='paper')
fig2 = plt.figure(2,figsize=(6,6))
ax2 = fig2.add_subplot()
ax2.boxplot(df.iloc[:50,:2])
sns.set_theme(context='talk')
fig3 = plt.figure(3,figsize=(6,6))
ax3 = fig3.add_subplot()
ax3.boxplot(df.iloc[:50,:2])
sns.set_theme(context='poster')
fig4 = plt.figure(4,figsize=(6,6))
ax4 = fig4.add_subplot()
ax4.boxplot(df.iloc[:50,:2])
plt.show()

程序输出的结果分别见下图。 

图片

图片

图片

图片

其实绘图风格不仅仅是有context这个参数决定的,还有一个比较重要的参数style,它是用来控制轴线样式的。它不同的取值有darkgrid(默认值),whitegrid,dark,white,ticks,不同的取值搭配context='notebook'的绘图风格,执行下面的代码即可得知。

import seaborn as sns
import matplotlib.pyplot as plt


df = sns.load_dataset('iris'# seaborn自带的iris数据集
sns.set_theme(style='ticks'# 默认风格
fig1 = plt.figure(1,figsize=(6,6))
ax1 = fig1.add_subplot()
ax1.boxplot(df.iloc[:50,:2])
sns.set_theme(style='whitegrid')
fig2 = plt.figure(2,figsize=(6,6))
ax2 = fig2.add_subplot()
ax2.boxplot(df.iloc[:50,:2])
sns.set_theme(style='dark')
fig3 = plt.figure(3,figsize=(6,6))
ax3 = fig3.add_subplot()
ax3.boxplot(df.iloc[:50,:2])
sns.set_theme(style='white')
fig4 = plt.figure(4,figsize=(6,6))
ax4 = fig4.add_subplot()
ax4.boxplot(df.iloc[:50,:2])
plt.show()

程序输出的结果分别见下图。

图片

图片

图片

图片

你会发现,似乎指定style参数之后,context参数好像失效了?其实这个并不是很重要,我认为Seaborn默认的绘图风格是好看的,至少比matplotlib默认的绘图风格要好看。

颜色模式

所谓的绘图颜色模式,就是指定用哪个颜色来绘图,通过set_theme()函数的参数palette指定,它的具体取值有字符串:deep,muted,bright,pastel,dark,colorblind,或者是matplotlib的colormap的名称。如果你不记得了colormap有哪些,那么可以参考这里

https:///stable/tutorials/colors/colormaps.html

还有一些其他取值,可以参考这里

https://seaborn./generated/seaborn.color_palette.html

如果我们想要看一下具体颜色,可以通过下面的代码呈现:

import seaborn as sns
import matplotlib.pyplot as plt

sns.color_palette('deep')
sns.color_palette('muted')
sns.color_palette('bright')
sns.color_palette('pastel')
sns.color_palette('dark')
sns.color_palette('colorblind')

在notebook环境下逐行运行,部分结果见下图。

图片

散点图

散点图是用来描述变量之间关系的统计图形。绘制散点图,在Seaborn中有两种方式,现在其实是三种方式。其一是使用Figure-level function,其二是使用Axes-level function,还有一个是新版本库新增的object方法。

按照我学习matplotlib的绘图习惯,这里的第二种方式Axes-level function我是比较容易理解的。它返回的是一个Axes对象,也可以传递一个Axes图形对象作为当前绘制的图形。

下面就绘制一幅散点图,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格

fig, ax = plt.subplots(figsize=(6,6))
iris = sns.load_dataset('iris')
sns.scatterplot(data=iris,x=iris.iloc[:50,0],y=iris.iloc[:50,1], ax=ax)
plt.show()

程序输出的结果见下图。

图片

这个函数返回的是仍然是ax对象。它可以很方便地绘制分组散点图,通过参数hue指定即可,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格

fig, ax = plt.subplots(figsize=(6,6))
iris = sns.load_dataset('iris')
sns.scatterplot(data=iris,x='sepal_length',y='sepal_width', ax=ax, hue='species')
plt.show()

程序输出的结果见下图。

图片

如果你想要对不同的分类变量下散点样式进行更改,可以通过参数style很方便地指定一个分类变量,作为不同的marker散点样式,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格

fig, ax = plt.subplots(figsize=(6,6))
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time', style='time')
plt.show()

程序输出的结果见下图。

图片

这里的marker样式是随机指定的。还可以通过size来指定散点的大小,这就是绘制气泡图了,通过patelle来指定绘图颜色模式,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格

fig, ax = plt.subplots(figsize=(6,6))
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='smoker'
                size='size', palette='GnBu')
plt.show()

程序输出的结果见下图。

图片

这是绘制散点图的方式之一,具体的参数请参见这里

https://seaborn./generated/seaborn.scatterplot.html

另外一个绘制散点图的方式就是使用Figure-level function,主要是函数relplot()实现。下面仍然是绘制散点图,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格

tips = sns.load_dataset('tips')
fig = sns.relplot(kind='scatter', data=tips, x='total_bill', y='tip', hue='smoker',
                  palette='Oranges', height=6, aspect=1)
# height指定图形的高度(英寸),宽度为height*aspect
plt.show()

程序输出的结果见下图。

图片

其他的参数指定和scatterplot函数是类似的,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格
tips = sns.load_dataset('tips')
fig = sns.relplot(kind='scatter', data=tips, x='total_bill', y='tip', hue='smoker'
                  style='time', palette='YlGn', height=6,aspect=1)
# height指定图形的高度(英寸),宽度为height*aspect
plt.show()

程序输出的结果见下图。

图片

再来看指定散点大小的气泡图,还是通过参数size,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格
tips = sns.load_dataset('tips')
fig = sns.relplot(kind='scatter',data=tips, x='total_bill', y='tip', size='size',
                  hue='sex', palette='PRGn', height=6, aspect=1)
# height指定图形的高度(英寸),宽度为height*aspect
plt.show()

程序输出的结果见下图。

图片

有关relplot函数的更多详细参数请参考这里

http://seaborn./generated/seaborn.relplot.html

前面介绍了两种绘制散点图的方法,是经典的绘制散点图API,还有一个Object方法,下面来看下,执行下面的代码:

import seaborn as sns
import seaborn.objects as so

sns.set_theme() # 设置seaborn绘图风格
penguins = sns.load_dataset('penguins')
(
so.Plot(data=penguins, x='bill_length_mm', y='bill_depth_mm')
.add(so.Dot()).layout(size=(6,6)).show()
)
# 设置图形是6英寸乘以6英寸的大小,so.Dot()表示绘制散点图

程序输出的结果见下图。

图片

如果我们想要改变散点的颜色,可以执行下面的代码:

import seaborn as sns
import seaborn.objects as so

sns.set_theme() # 设置seaborn绘图风格
penguins = sns.load_dataset('penguins')
(
so.Plot
(
data=penguins, x='bill_length_mm', y='bill_depth_mm',
edgecolor='sex', edgewidth='body_mass_g'
)
.add(so.Dot(color='xkcd:plum',alpha=0.2))
.layout(size=(6,6))
.show()
)
# 通过参数color和alpha来指定颜色

程序输出的结果见下图。

图片

有关函数so.Plot()的更多参数请参考这里

http://seaborn./generated/seaborn.objects.Plot.html

有关散点函数so.Dot()的更多参数请参考这里

http://seaborn./generated/seaborn.objects.Dot.html

但是这种绘制散点图的方式有一个缺点就是无法绘制分组散点图?这一点好像是的。而且它有一些详细的参数API,很类似于matplotlib绘制散点图的参数。可以说,它的封装性没有那么强,灵活性更强,便于修改。

线图

线图是一般是用来展示趋势性数据的,也可以用来展示两个变量之间的关系。

先看第一种绘制线图的方式,使用Axes-level function,lineplot()函数,展示时间序列数据最适合使用线图,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
dowjones = sns.load_dataset('dowjones')
sns.lineplot(data=dowjones, x='Date', y='Price',ax=ax)
plt.show()

程序输出的结果见下图。

图片

还可以通过hue参数指定分组变量,绘制线图。执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
flights = sns.load_dataset('flights')
sns.lineplot(data=flights, x='year', y='passengers',ax=ax,hue='month',palette='Spectral')
plt.show()

程序输出的结果见下图。

图片

有意思的是这个数据结果是一般的列变量形式,但是时间序列数据也可能是每一列都是一个单独的月份数据,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
flights = sns.load_dataset('flights')
flights_wide = flights.pivot(index='year', columns='month', values='passengers')
sns.lineplot(data=flights_wide, ax=ax ,palette='BuGn')
plt.show()

程序输出的结果见下图。

图片

这种数据结果是以列作为每一个月份,行作为年份,中间的值就是上面数据中的passengers变量值,绘制线图也是以列作为一个变量绘制的,不需要指定参数hue了,直接给定一个数据即可。

单个线图是默认绘制置信区间的,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
flights = sns.load_dataset('flights')
sns.lineplot(data=flights, x='year', y='passengers', ax=ax,
             color='xkcd:plum', alpha=0.3)
plt.show()

程序输出的结果见下图。

图片

这里的置信区间是百分之95的置信区间,以置信带的形式呈现,通过参数errerbar指定,errstyle参数指定的是误差的呈现形式,有bars和band两种形式。有关具体的errerbar内容下面会介绍到。

如果我们并不希望绘制这个误差范围呢?使用参数estimator=None即可,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置Seaborn绘图风格
fig, ax = plt.subplots(figsize=(6,6))
flights = sns.load_dataset('flights')
sns.lineplot(data=flights, x='year', y='passengers', ax=ax,
             color='xkcd:steel', alpha=0.3, estimator=None)
plt.show()

程序输出的结果见下图。

图片

奇怪的是,它怎么和前面的线图不一样呢?这里多了很多折线,不是一条平坦的直线?实际上,指定参数estimator=None表示没有任何估计量,使用原始数据绘图,而这个原始数据正是这样子的,同一个年份对应不同的passengers数值。而参数estimator的默认值是mean,表示估计均值,因此上面绘制的图形中是一个趋于平坦的直线也是这个原因。

如果原始数据不是这样子的“分组”重复性数据,而是类似时间序列数据,那么estimator='mean'和指定为None是没有区别的。Seaborn线图是一个例子。

有关函数lineplot()的更多参数用法请参考这里

http://seaborn./generated/seaborn.lineplot.html

下面使用Figure-level的函数replot()来绘制线图,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme() # 设置默认风格
tips = sns.load_dataset('tips')
fig = sns.relplot(kind='line', data=tips, x='total_bill', y='tip', hue='smoker'
                  palette='binary', height=6,aspect=1)
# height指定图形的高度(英寸),宽度为height*aspect
plt.show()

程序输出的结果见下图。

图片

使用Figure层面的绘制线图函数,尽管是分组线图,默认地也是会绘制置信带的,执行下面的代码:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme()
fmri = sns.load_dataset('fmri')
fig = sns.relplot(kind='line', data=fmri, x='timepoint', y='signal', hue='event',
            height=6, aspect=1)
plt.show()

程序输出的结果见下图。

图片

其实,使用Axes层面的线图绘制函数默认条件下也是绘制置信带的,那为什么上面有一张对应的图没有绘制置信带呢?

很简单,因为绘制置信带需要重复结构的数据,也就是说,在不同的分组条件下,需要在给定的X轴变量值下,有多个Y轴变量值,但是前者数据结构中,当分组给定了之后,每一个年份year值对应一个乘客数量passengers。如果不分组,就有多个对应值了。

下面我们使用第三种方式来绘制线图,执行下面的代码:

import seaborn as sns
import seaborn.objects as so

sns.set_theme() # 设置seaborn绘图风格
fmri = sns.load_dataset('fmri')
(
so.Plot(
fmri, x='timepoint', y='signal', color='region', linestyle='event')
.add(so.Line(color='xkcd:plum',alpha=0.2)).layout(size=(6,6)).show()
)
# 通过参数color和alpha来指定颜色

程序输出的结果见下图。

图片

你可以看到这个数据完全是重复的,就是说在同一个X轴变量下,Y轴变量值不止一个,它完全绘制了每一个数据点。这里我们没有绘制聚合指标值,更没有绘制置信带。

函数so.Line()的更多参数请参考这里

http://seaborn./generated/seaborn.objects.Line.html

下面的代码会增加绘制聚合指标值的,比如均值或者方差等等,执行下面的代码:

import seaborn as sns
import seaborn.objects as so

sns.set_theme() # 设置seaborn绘图风格
fmri = sns.load_dataset('fmri')
(
so.Plot(
fmri, x='timepoint', y='signal', color='region', linestyle='event')
.add(so.Line(color='xkcd:plum',alpha=0.2), so.Agg()).layout(size=(6,6)).show()
)
# so.Agg()默认绘制均值

程序输出的结果见下图。

图片

函数so.Agg()的用法请参考这里

http://seaborn./generated/seaborn.objects.Agg.html

下面我们就绘制标准差置信带,通过参数so.Est()

http://seaborn./generated/seaborn.objects.Est.html

执行下面的代码:

import seaborn as sns
import seaborn.objects as so

sns.set_theme() # 设置seaborn绘图风格
fmri = sns.load_dataset('fmri')
(
so.Plot
(
data=fmri, x='timepoint', y='signal', color='region', linestyle='event'
)
.add
(
so.Line(color='xkcd:plum',alpha=0.2), so.Agg('std')
)
.add(so.Band(), so.Est(func='std'))
.layout(size=(6,6))
.show()
)
# so.Est()指定估计量和置信水平,so.Band()绘制置信带

程序输出的结果见下图。

图片

函数so.Band()的具体用法请参考这里

http://seaborn./generated/seaborn.objects.Band.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多