Seaborn
Seaborn和Matplotlib的区别:matplotlib是高度自定义的,很多参数需要你自己去调,但是你很难知道怎么调节参数以获取一个很漂亮的图像;Seaborn则包含一些定制的好的主题和一些高层次的参数去调节matplotlib
我们在学习之前可以先看官网gallery,了解它都能画些怎样的图片
我们一样使用如下方式引入seaborn:
import seaborn as sns
控制图形美学
我们先定义一个简单函数去画一些正弦波,通过例子我们可以知道如何调整的不同风格参数。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(sum(map(ord, "aesthetics")))
def sinplot(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)
sinplot()
plt.show()
画出来就是matplotlib默认风格的图像。
如果我们想换成seaborn默认风格的图像,我们需要调用set()函数:
sns.set()
sinplot()
plt.show()
Seaborn库把matplotlib的参数分为两种,一种是设置图形的审美外观风格,另一种则是为了调节缩放以达到更好的观察效果。
设置风格通过axes_style()和set_style()实现,为了缩放图形一般用plotting_context()和set_context();对于两种情况,前一个函数返回一个字典值(等一下我们就讲),后一个用于设置matplotlib。
风格
seaborn预设了五种主题分格:darkgrid、whitegrid、dark、white和ticks。默认的是darkgrid。我们来设置一个dark看看效果(正常情况下绘图很少用到grid)
sns.set_style("dark")
sinplot()
plt.show()
我们可以用 despine() 去掉顶部和右边的线条:
sinplot()
sns.despine()
plt.show()
其是seaborn样式是可以直接覆盖的,刚刚我们讲到axes_style()会返回一个字典值,表示当前样式设置值,内容如下:
print(sns.axes_style())
{'axes.facecolor': '#EAEAF2',
'axes.edgecolor': 'white',
'axes.grid': False,
'axes.axisbelow': True,
'axes.linewidth': 0.0,
'axes.labelcolor': '.15',
'figure.facecolor': 'white',
'grid.color': 'white',
'grid.linestyle': '-',
'text.color': '.15',
'xtick.color': '.15',
'ytick.color': '.15',
'xtick.direction': 'out',
'ytick.direction': 'out',
'xtick.major.size': 0.0,
'ytick.major.size': 0.0,
'xtick.minor.size': 0.0,
'ytick.minor.size': 0.0,
'legend.frameon': False,
'legend.numpoints': 1,
'legend.scatterpoints': 1,
'lines.solid_capstyle': 'round',
'image.cmap': 'rocket',
'font.family': ['sans-serif'],
'font.sans-serif': ['Arial', 'DejaVu Sans', 'Liberation Sans', 'Bitstream Vera Sans', 'sans-serif']
}
如果我们想自定义,直接构造一个字典参数传入set_style即可:
sns.set_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
plt.show()
缩放
seaborn预设了四种上下文(contexts),分别是paper,notebook,talk和poster。默认的是notebook,我们之前用的就是绘图用的就是plots。我们换一种看一下
sns.set_context("paper")
sinplot()
plt.show()
可能你已经想到,我们是不是也可以跟style一样,通过往set_context()传入字典参数设置contexts,没错确实如此。
print(sns.plotting_context())
{'font.size': 12.0,
'axes.labelsize': 11.0,
'axes.titlesize': 12.0,
'xtick.labelsize': 10.0,
'ytick.labelsize': 10.0,
'legend.fontsize': 10.0,
'grid.linewidth': 1.0,
'lines.linewidth': 1.75,
'patch.linewidth': 0.3,
'lines.markersize': 7.0,
'lines.markeredgewidth': 0.0,
'xtick.major.width': 1.0,
'ytick.major.width': 1.0,
'xtick.minor.width': 0.5,
'ytick.minor.width': 0.5,
'xtick.major.pad': 7.0,
'ytick.major.pad': 7.0
}
下面是一个使用的例子:
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
选取调色板
颜色显然比图形风格的其他方面都更加重要,因为颜色使用得当就可以有效显示或隐藏数据中的特征。seaborn让你更容易选择和使用那些适合你数据和视觉的颜色。
我们可以color_palette()创建调色板:
current_palette = sns.color_palette()
sns.palplot(current_palette)
seaborn默认颜色主题共有六种,分别是deep, muted, pastel, bright, dark, 和 colorblind.我们可以把他们当作参数传入:
current_palette = sns.color_palette("dark") # 直接传入对应的参数即可变化
sns.palplot(current_palette)
使用圆形颜色系统
如果要区分超过六个类别,最简单的方法是在圆形颜色空间中绘制均匀间隔的颜色(使色调发生变化,从而保持亮度和饱和度不变)。这是大多数seaborn函数在需要使用比默认颜色循环中设置的颜色更多的颜色时默认使用的功能。
最常用的方法是使用hls颜色空间,这是RGB值的简单转换。
sns.palplot(sns.color_palette("hls", 8))
seaborn还提供了与husl系统的接口,这也使得选择均匀间隔的色调变得容易,同时保持表观亮度和饱和度更加均匀。
sns.palplot(sns.color_palette("husl", 8))
使用分类Color Brewer调色板
视觉上令人愉悦的分类调色板的另一个来源是Color Brewer工具。我们来看一些例子:
sns.palplot(sns.color_palette("Paired"))
sns.palplot(sns.color_palette("Set2", 10))
当然,您可能只想使用一组特别喜欢的颜色。 因为color_palette()接受颜色列表,所以这很容易做到。
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))
设置默认调色板
color_palette()函数有一个名为set_palette()的伴侣。 set_palette()接受与color_palette()相同的参数,但它会更改默认的matplotlib参数,以便调色板用于所有绘图。
def sinplot(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)
sns.set_palette("husl")
sinplot()
color_palette()函数也可以在with语句中用于临时更改调色板。
with sns.color_palette("PuBuGn_d"):
sinplot()
分布数据集的可视化
在处理一组数据时,通常首先要做的是了解变量是如何分布的。这一章将简要介绍seborn中用于检查单变量和双变量分布的一些工具。我们来看看一些函数的例子,这些函数让我们很容易比较变量的分布。
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
单变量分布
最方便的方式是快速查看单变量分布无疑是使用distplot()函数。默认情况下,这将绘制一个直方图,并拟合出核密度估计(KDE)。
x = np.random.normal(size=100)
sns.distplot(x);
直方图
直方图应当是非常熟悉的函数了,在matplotlib中就存在hist函数。直方图通过在数据的范围内切成数据片段,然后绘制每个数据片段中的观察次数,来表示整体数据的分布。
sns.distplot(x, kde=False, rug=True);
我们可以通过bins参数控制切分数据片段的数量:
sns.distplot(x, bins=20, kde=False, rug=True);
核密度估计(KDE)
或许你对核密度估计可能不像直方图那么熟悉,但它是绘制分布形状的有力工具。如同直方图一样,KDE图会对一个轴上的另一轴的高度的观测密度进行描述:
sns.distplot(x, hist=False, rug=True);
拟合参数分布
还可以使用distplot()将参数分布拟合到数据集,并可视化地评估其与观察数据的对应关系:
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma);
双变量分布
在绘制两个变量的双变量分布也是有用的。在seaborn中这样做的最简单的方法就是在jointplot()函数中创建一个多面板数字,显示两个变量之间的双变量(或联合)关系以及每个变量的单变量(或边际)分布和轴。
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
散点图
双变量分布的最熟悉的可视化方式无疑是散点图,其中每个观察结果以x和y值表示。这是两个方面的地毯图。可以使用matplotlib中的plt.scatter函数绘制散点图,它也是jointplot()函数显示的默认方式。
sns.jointplot(x="x", y="y", data=df);
HexBin图
直方图的双变量类似物被称为“hexbin”图,因为它显示了落在六边形仓内的观测数。该图适用于较大的数据集。通过matplotlib plt.hexbin函数和jointplot()中的样式可以实现。 它最好使用白色背景:
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");
核密度估计
使用上述内核密度估计程序可视化双变量分布也是可行的。在seaborn中,这种图用等高线图显示,可以在jointplot()中作为样式传入参数使用:
sns.jointplot(x="x", y="y", data=df, kind="kde");