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
同样地,可以改变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
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))