seaborn的详解03

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

画出单变量分布

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


# coding=utf-8

import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns

'''
sum(map(ord, "distributions"))
    解释;
        ord()为内置函数  把字符转化为ASSIC码
        map(函数) 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
        # 提供了两个列表,对相同位置的列表数据进行相加
        map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
        [3, 7, 11, 15, 19]
        map的列表在sum([3, 7, 11, 15, 19]) 求和
        
        # sum(map(ord, "distributions")) 等价于下面的代码
            count = 0
            for item in 'distributions':
                count+=ord(item)
 

'''
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions"))) #seed目的 每次产生的随机数都一样
x = np.random.normal(size=100) #正态分布函数
sns.distplot(x,kde=False) #kde 是核密度估计的参数  False是不做
plt.show()



直方图

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

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

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

核密度估计

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

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

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

233

像素图

也可以在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"); #kind 指定为hex类型

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") #鸢尾花数据集 4个特征 是seaborn定义好的数据  直接调用,加载
sns.pairplot(iris);

233

g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6);
  • 1
  • 2
  • 3
/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. "
  • 1
  • 2

233





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值