seaborn 小笔记

前置知识

大概需要了解一点点matplotlib

在开始之前

Install Seaborn and Matplotlib

Use %matplotlib inline to show picture in Jupyter.

代码里用到的数据集titanic 大概长这个样子:

所有的代码均为精简版,请勿直接运行

beautify

画图最重要的当然是美化啦!

seaborn内置了六种颜色模式,并提供了丰富的自定义颜色方法。可以通过palette设置颜色模式。前面六种是内置的颜色模式,挑选一个自己喜欢的吧!(顺带一提,pastel是真的舒服

另外,如果你想要规定颜色数,可以尝试hls或者husl

自定义的渐变色或许也是一个不错的选择

也许你喜欢内置的渐变色?

下面演示了上面提到的所有模式

sns.countplot(x='deck', data=titanic, ax=axes[0, 0], palette=sns.color_palette('deep'))
sns.countplot(x='deck', data=titanic, ax=axes[0, 1], palette=sns.color_palette('muted'))
sns.countplot(x='deck', data=titanic, ax=axes[0, 2], palette=sns.color_palette('pastel'))
sns.countplot(x='deck', data=titanic, ax=axes[1, 0], palette=sns.color_palette('bright'))
sns.countplot(x='deck', data=titanic, ax=axes[1, 1], palette=sns.color_palette('dark'))
sns.countplot(x='deck', data=titanic, ax=axes[1, 2], palette=sns.color_palette('colorblind'))
sns.countplot(x='deck', data=titanic, ax=axes[2, 0], palette=sns.color_palette('hls', 3))
sns.countplot(x='deck', data=titanic, ax=axes[2, 1], palette=sns.color_palette('light:#5A9'))
sns.countplot(x='deck', data=titanic, ax=axes[2, 2], palette=sns.color_palette('flare'))

如果你还想自定义一些东西,可以参考这个

displot

三个选项,hist(默认),kde,ecdf,效果分别和 histplot kedplot ecdf 相同。可以通过kde=True在直方图上叠加曲线。

sns.histplot(age1, stat='density', ax=axes[0, 0])
sns.histplot(age1, stat='count', ax=axes[0, 1], kde=True, bins=30, color='green')
sns.kdeplot(age1, ax=axes[1, 0], shade=True)
sns.ecdfplot(age1, ax=axes[1, 1])

一些解释:age1为事先生成的数据,ax控制其在画布的位置

P.S. 一个小坑,displot好像不支持上方这种画布,所以调用了与之效果相同的函数

barplot

barplot可以直接从数据集中画出柱状图,设置x和y代表的含义,hue用于对x轴的数据进行细分,详情如下。

sns.barplot(x='sex', y='survived', data=titanic, ax=axes[0])
sns.barplot(x='sex', y='survived', hue='class' ,data=titanic, ax=axes[1])

countplot

顾名思义,计数图,用法和barplot类似。你可以 通过x或y来选择图片的方向

sns.countplot(x='class', hue='sex', data=titanic, ax=axes[0])
sns.countplot(y='deck', data=titanic, ax=axes[1])

stripplot

绘制散点图,同样地,可以用hue进行细分,用jitter控制是否抖动

sns.stripplot(x='class', y='age', data=titanic, ax=axes[0])
sns.stripplot(x='class', y='age', data=titanic, ax=axes[1], jitter=0)
sns.stripplot(x='class', y='age', data=titanic, ax=axes[2], hue='sex')

swarmplot

同样是散点图,但是更加直观,更适合小数据

boxplot

img

同样地,可以改变x y的顺序,进行细分。

sns.boxplot(x='class', y='age', data=titanic, ax=axes[0])
sns.boxplot(x='age', y='class', hue='sex', data=titanic, order=['Second', 'Third', 'First'], ax=axes[1])

P.S. 几乎所有的图都能通过 order 和 hue_order 来更改顺序

violinplot

boxplot 的升级版,可以看到数据的更具体地分布

当hue参数只有两个级别时,可以设置'split'为True,效果如下。

如果不喜欢里面的箱子,可以换成虚线(我个人是很喜欢虚线那种啦

sns.violinplot(x='class', y='age', data=titanic, hue='sex', split=True, ax=axes[0])
sns.violinplot(x='class', y='age', data=titanic, hue='sex', split=True, ax=axes[1], inner='quartile')

regplot

绘制回归曲线,为了方便演示,数据换成了taxis qwq

可以用 ci 控制置信区间(0~100),truncate=False拓展直线,marker等参数更改样式

sns.regplot(y='total', x='distance', data=taxis, ax=axes[0])
sns.regplot(y='total', x='distance', data=taxis, ax=axes[1], ci=0, truncate=False, marker="+")

或许你会想用多项式函数或者log ?

sns.regplot(y='total', x='distance', data=taxis, order=2, ax=axes[0])
sns.regplot(y='total', x='distance', data=taxis, logx=True, ax=axes[1])

神奇地是,可以使用x_bins=4把x划分为离散的box

../_images/seaborn-regplot-7.png

lmplot

regplot 的升级版,增加了分类别地展示的功能

sns.lmplot(y='total', x='distance', hue='color', data=taxis,markers=['*','o'])

使用col来把图片分开

sns.lmplot(y='total', x='distance', col='color', hue='color', data=taxis, markers=['*', 'o'])

所以为什么黄车比绿车要贵呢,小编也不知道(可能是因为截取的数据量太少

heatmap

绘制热力图需要一个严格的函数关系,即\(z=f(x,y)\)

又换了数据qwq

以year month 为 坐标轴,绘制 passengers 的热力图如下

flights = sns.load_dataset("flights")
f = flights.pivot('year', 'month', 'passengers')
sns.heatmap(f)

可以将数据展示在图中,以及换颜色(

sns.heatmap(f, annot=True, fmt="d", cmap=sns.color_palette("cubehelix", as_cmap=True))

posted @ 2022-07-15 11:45  Ηydra  阅读(275)  评论(0编辑  收藏  举报