python科学计算——数据可视化(2) Seaborn

写在前面

在前面的文章介绍了Matplotlib的可视化基本功能,seaborn是基于Matplotlib的基础上进行了封装,能够快速的绘制精美的图表,使用起来比matplotlib更为方便简洁,本文是参考seaborn的官方文档进行的总结。

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()。

Figure样式控制

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"))

这里写图片描述
如果要反序这些渐变色,则在颜色后面加_r:

sns.palplot(sns.color_palette("Blues_r"))

这里写图片描述
cubehelix调色板:

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)

这里写图片描述
该函数常用的参数由如下几个:

  1. bins:数据的划分区间;
  2. kde:进行核密度估计;
  3. rug:数据在轴上的分布。

KDE曲线

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");

这里写图片描述

KDE

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)

这里写图片描述
这些数据有的地方重叠了,指定参数jitter能将数据散开:

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=["-", "--"])

这里写图片描述

线性关系图

个人感觉在实际中用得很少,需要可参考这里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值