在前面的文章介绍了Matplotlib的可视化基本功能,seaborn是基于Matplotlib的基础上进行了封装,能够快速的绘制精美的图表,使用起来比matplotlib更为方便简洁,本文是参考seaborn的官方文档进行的总结。
先看一下利用Matplotlib的绘制图像:
def sinp(flip=1):
x = np.linspace(0,14,100)
for i in range(1,7):
plt.plot(x, np.sin(x+i*.5)*(7-i)*flip)
sinp()
plt.show()
上面是用Matplotlib默认样式来进行绘图的,要变成seaborn的默认样式,简单的调用sns.set()就可以了:
sns.set()
sinp()
上图是用seaborn的默认样式的绘制结果,两图之间还是由比较大的差别,可以想象到,sns.set()是调用了matplotlib中的函数进行了设置。seaborn的控制参数包括两部分,figure样式的控制是用set_style()和axes_style(),而控制图表的plotting_context() 和set_context()。
seaborn预先定义了5中主题样式,以适合不同场景需要,分别是:darkgrid, whitegrid, dark, white, 和ticks,默认是darkgrid。
sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data)
sns.set_style("dark")
sinp()
sns.set_style("white")
sinp()
# 刻度样式
sns.set_style("ticks")
sinplot()
# 移除轴
sinplot()
sns.despine()
f, ax = plt.subplots()
sns.violinplot(data=data)
# trim是左下角不连接,offset
sns.despine(offset=10,trim=True)
plt.show()
seaborn预定义了4种图表的样式定义,分别是:paper、notebook、talk和poster,默认是notebook,分别看看效果:
sns.set_context("paper")
sinp()
sns.set_context("talk")
sinp()
sns.set_context("poster")
sinp()
除此之外,还可以为set_context()提供其他参数来控制样式。
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinp()
seaborn中的调色板使用函数color_palette(),该函数接受seaborn或者matplotlib(除了jet)的colormap对象,或者接受RGB、十六进制的颜色表示以及HTML的颜色名,如果不使用任何参数调用color_palette()则返回当前调色板,set_palette()函数则将传入的调色板选择为当前调色板。
定性调色板(Qualitative color palettes)适合于区分没有固定顺序的离散数据。
# 获取seaborn的默认调色板
current_palette = sns.color_palette()
sns.palplot(current_palette)
默认的seaborn调色板只有6中颜色,如果需要增加更多的颜色,最简单的方式是hls颜色空间:
sns.palplot(sns.color_palette("hls", 10))
同时可以使用参数来调整颜色的饱和度和亮度:
通过传入颜色来创建调色板:
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))
colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))
所有的颜色名参见这里,此外,seaborn提供了一个xkcd_rgb可以快速使用这些颜色名:
plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
sns.palplot(sns.color_palette("Blues"))
sns.palplot(sns.color_palette("Blues_r"))
sns.palplot(sns.color_palette("cubehelix", 8))
sns.palplot(sns.color_palette("BrBG", 7))
distplot()是绘制单变量的数据分布图:
x = np.random.normal(size=100)
sns.distplot(x)
该函数同样可以实现直方图的绘制,其中的rug参数可以控制显示数据在轴上的位置:
sns.distplot(x, bins=20, kde=False, rug=True)
kdeplot()是对数据进行核密度估计分布的函数,其中参数shade是控制是否对kde曲线进行阴影填充,bw控制核密度的窗口大小,cut控制曲线切割。
sns.kdeplot(x,shade=True)
sns.kdeplot(x,shade=True,cut=0)
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df)
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
sns.jointplot(x=x, y=y, kind="hex", color="k");
sns.jointplot(x="x", y="y", data=df, kind="kde")
f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df.x, df.y, ax=ax)
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax)
f, ax = plt.subplots(figsize=(6, 6))
cmap = sns.cubehelix_palette(as_cmap=True, dark=.2, light=1, reverse=True)
sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True)
iris = sns.load_dataset("iris")
sns.pairplot(iris)
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6)
有时候,我们需要对数据按照某一个属性进行绘制观察,而seaborn也提供了这些函数。
# 按tips数据中横轴为“day”的属性进行“total”展示
tips = sns.load_dataset("tips")
sns.stripplot(x="day", y="total_bill", data=tips)
sns.stripplot(x="day", y="total_bill", data=tips,jitter=True)
另一个方法是使用swarmplot函数进行绘制,该函数使用了算法将点进行散布,避免重叠:
sns.swarmplot(x="day", y="total_bill", data=tips)
而有时候,这些点也是有类别的,按照上述的分类绘制无法观测不同类别的点的分布,hue参数能解决这一点:
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips)
sns.boxplot(x="day", y="total_bill", hue="time", data=tips)
sns.violinplot(x="total_bill", y="day", hue="time", data=tips)
由于小提琴图是和kde估计相关的,所以同样提供了一些参数来控制kde估计:
sns.violinplot(x="total_bill", y="day", hue="time", data=tips,
bw=.1, scale="count", scale_hue=False)
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True)
sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5)
sns.barplot(x="sex", y="survived", hue="class", data=titanic)
sns.pointplot(x="sex", y="survived", hue="class", data=titanic)
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"])
个人感觉在实际中用得很少,需要可参考这里。