PYTHON数据可视化(三)seaborn

来源:互联网 发布:淘宝1次破损补寄 编辑:程序博客网 时间:2024/05/22 13:57

seaborn库手册翻译(第二章)

数据分布的可视化

当我们处理数据时,第一件事是探索变量的分布。这一章手册将会对seaborn库中检验单变量,双变量分布的函数进行简单介绍。

%matplotlib inlineimport numpy as npimport pandas as pdfrom scipy import stats, integrateimport matplotlib.pyplot as plt
import seaborn as snssns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

画出单变量分布

在seaborn中观察单变量分布最简便的方法是调用displot函数,在默认情况下,将会画出一个直方图和一个通过( kernel density estimate(KDE).)核密度估计计算出的概率密度函数。

x = np.random.normal(size=100)sns.distplot(x);

233

直方图

直方图实际上非常普遍,marplotlib中也有hist函数。
我们在这移除概率密度函数曲线,然后画出 rug plot,这会在样本点出画出小竖杠。你可以通过rugplot函数画出rug,当然这在一功能在displot():

sns.distplot(x, kde=False, rug=True);

233
当画直方图时,最重要的选项是格子的数目。在缺失状态下displot()函数运用了一个很简单的准则对这一数字进行了不错的猜想。但是试试更少或者更多可能展现出数据更多的特征。

核密度估计

核密度估计并非广为人知,但是它确实是在绘制分布形状时的有力工具。与在直方图中一样,KDE图中一条轴为样本分布,另一条轴为密度。

sns.distplot(x, hist=False, rug=True);

233
画出KDE曲线比直方图需要跟多的计算,首先依据以每个观测为均值建立多个正态分布。(具体估计方法。。我去查查书)

x = np.random.normal(0, 1, size=30)bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)support = np.linspace(-4, 4, 200)kernels = []for x_i in x:    kernel = stats.norm(x_i, bandwidth).pdf(support)    kernels.append(kernel)    plt.plot(support, kernel, color="r")sns.rugplot(x, color=".2", linewidth=3);

233
接下来将其汇总,调整至积分等于1。

density = np.sum(kernels, axis=0)density /= integrate.trapz(density, support)plt.plot(support, density);

233
我们可以看到如果我们调用seaborn库中的kdeplot()函数可以画出相同的图像。这个函数在displot()函数中也被调用,相比之下在你只想要密度函数估计时,它提供了更加细致的选项和接口。

sns.kdeplot(x, shade=True);

233
KDE中的bandwith(bw)参数,控制估计拟合数据的紧密程度。类似于直方图中分箱(bin)数量。默认的就不错了,但是你也可以调整,来得到一些别的信息。

sns.kdeplot(x)sns.kdeplot(x, bw=.2, label="bw: 0.2")sns.kdeplot(x, bw=2, label="bw: 2")plt.legend();

233
从上面的图形中,你可以看到画出的估计曲线超过了观测的最大最小值。我们可以通过cut参数控制这一情况,不过这只会改变图形的样子,并不会改变实际估计出来的曲线。

sns.kdeplot(x, shade=True, cut=0)sns.rugplot(x);

233

拟合分布

你也可以用displot()函数,拟合一个分布(也许是你的猜想)(参数由数据集决定),并将其可视化,观察拟合情况。

x = np.random.gamma(6, size=200)sns.distplot(x, kde=False, fit=stats.gamma);

233

绘制双变量分布

绘制双变量分布是有时是十分有用的。在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"])

散点图

散点图是jointplot函数的默认结果。

sns.jointplot(x="x", y="y", data=df);

233

像素图

也可以在jointplot中完成,白色背景效果最好。

x, y = np.random.multivariate_normal(mean, cov, 1000).Twith sns.axes_style("white"):    sns.jointplot(x=x, y=y, kind="hex", color="k");

233

核密度估计

当然也可以用jointplot画出概率密度分布

233

你也可以用kdeplot函数画出双变量核密度函数。这可以允许你指定某一变量在你希望的数轴上。

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

233
如果你想使密度函数更加的连续,你可以提高等高线的数量(increase the number of contour levels)比如下面这种骚操作~。~

f, ax = plt.subplots(figsize=(6, 6))cmap = sns.cubehelix_palette(as_cmap=True, dark=0, light=1, reverse=True)sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True);

233

jointplot()函数使用JointGrid来管理图形。为了令使用达到最大的灵活性,可以直接使用JointGrid来绘制图形。 jointplot()在绘制后返回JointGrid对象,可以使用它添加更多图层或调整可视化的其他方面:

g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")g.ax_joint.collections[0].set_alpha(0)g.set_axis_labels("$X$", "$Y$")plt.show()

233

多变量成组可视化

如果你想绘制数据集中多个成对的变量,你可以使用pairplot()函数。它会生成一个含有轴的矩阵,在默认状态下,会将数据集中所有列成对可视化。

iris = sns.load_dataset("iris")sns.pairplot(iris);

233

g = sns.PairGrid(iris)g.map_diag(sns.kdeplot)g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6);
/Users/mwaskom/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.  warnings.warn("No labelled objects found. "

233

原创粉丝点击