本文共 15675 字,大约阅读时间需要 52 分钟。
Seaborn是一个在Python中制作有吸引力和信息丰富的统计图形的库。它建立在之上,并与堆栈紧密集成,包括支持来自和和数据结构和统计例程。 Seaborn旨在将可视化作为探索和理解数据的核心部分。绘图函数对包含整个数据集的数据框和数组进行操作,并在内部执行必要的聚合和统计模型拟合以生成信息图。如果matplotlib“试图让事情变得简单容易和难以实现”,seaborn图使一套明确的方案让事情变得容易。 Seaborn可以认为是对matplotlib的补充,而不是它的替代品。在数据可视化方面能够很好的表现。
%matplotlib inlineimport numpy as npimport pandas as pdfrom scipy import stats, integrateimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)np.random.seed(sum(map(ord, "distributions"))) 1 2 3 4 5 6 7 8
最方便快捷的方式~
# kde表示生成核密度估计x = np.random.normal(size=100)sns.distplot(x, kde=True) 1 2 3
更精细的刻画,调节bins,对数据更具体的做分桶操作。
sns.distplot(x, kde=True, bins=20) 1
使用rug生成实例:
sns.distplot(x, kde=False, bins=20, rug=True) 1
生成实例的好处:指导你设置合适的bins。
通过观测估计概率密度函数的形状。
有什么用呢?待定系数法求概率密度函数~核密度估计的步骤:
* 每一个观测附近用一个正态分布曲线近似 * 叠加所有观测的正太分布曲线 * 归一化在seaborn中怎么画呢?
sns.kdeplot(x) 1
bandwidth的概念:用于近似的正态分布曲线的宽度。
sns.kdeplot(x)sns.kdeplot(x, bw=.2, label="bw: 0.2")sns.kdeplot(x, bw=2, label="bw: 2")plt.legend() 1 2 3 4
x = np.random.gamma(6, size=200)sns.distplot(x, kde=False, fit=stats.gamma) 1 2
mean, cov = [0, 1], [(1, .5), (.5, 1)]data = np.random.multivariate_normal(mean, cov, 200)df = pd.DataFrame(data, columns=["x", "y"]) 1 2 3
两个相关的正态分布~
sns.jointplot(x="x", y="y", data=df) 1
x, y = np.random.multivariate_normal(mean, cov, 1000).Twith sns.axes_style("ticks"): sns.jointplot(x=x, y=y, kind="hex") 1 2 3
sns.jointplot(x="x", y="y", data=df, kind="kde") 1
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) 1 2 3 4
更炫酷的效果:
f, ax = plt.subplots(figsize=(6, 6))cmap = sns.cubehelix_palette(as_cmap=True, dark=1, light=0)sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True) 1 2 3
先绘制图形图像,然后再往图中添加额外的效果。
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$") 1 2 3 4
iris = sns.load_dataset("iris")iris.head() 1 2
sns.pairplot(iris) 1
g = sns.PairGrid(iris)g.map_diag(sns.kdeplot)g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=20) 1 2 3
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)np.random.seed(sum(map(ord, "regression")))tips = sns.load_dataset("tips") 1 2 3 4 5 6 7 8 9
最简单的方式:散点图 + 线性回归 + 95%置信区间
sns.lmplot(x="total_bill", y="tip", data=tips) 1
sns.lmplot(x="size", y="tip", data=tips) 1
方法1:加个小的抖动
sns.lmplot(x="size", y="tip", data=tips, x_jitter=.08) 1
方法2:离散取值上用均值和置信区间代替散点,求出均值和方差并在图上表示
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean) 1
有些时候线性拟合效果不错,但有时数据的分布并不适合用线性方式拟合。
anscombe = sns.load_dataset("anscombe")sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), ci=None, scatter_kws={ "s": 80}) 1 2
如图,用线性拟合的方式效果不是很好
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), ci=None, scatter_kws={ "s": 80}) 1
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), order=2, ci=None, scatter_kws={ "s": 80}) 1
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), robust=True, ci=None, scatter_kws={ "s": 80}) 1
tips["big_tip"] = (tips.tip / tips.total_bill) > .15sns.lmplot(x="total_bill", y="big_tip", data=tips, y_jitter=.05) 1 2
sns.lmplot(x="total_bill", y="big_tip", data=tips, logistic=True, y_jitter=.03, ci=None) 1
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), scatter_kws={ "s": 80}) 1
拟合的好,就是白噪声的分布
拟合的差,就能看出一些模式sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), scatter_kws={ "s": 80}) 1
# 指定hue参数sns.lmplot(x="total_bill", y="tip", hue = "day", data=tips) 1 2
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"]) 1
尝试增加更多的分类条件
# hue与col配合sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips) 1 2
# hue、col与row一起使用sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", row="sex", data=tips) 1 2
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, col_wrap=2, size=5) 1
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, aspect=0.5) 1
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="whitegrid", color_codes=True)np.random.seed(2017)titanic = sns.load_dataset("titanic")tips = sns.load_dataset("tips")iris = sns.load_dataset("iris") 1 2 3 4 5 6 7 8 9 10 11
titanicsns.barplot(x="sex", y="survived", hue="class", data=titanic) 1 2
当有一维数据是分类数据时,散点图成为了条带形状。
sns.stripplot(x="day", y="total_bill", data=tips) 1
散点图绘制的时候很多点集中在一起,为了更清楚的表示,需要进行如下两种方法的操作。
法一:抖动。
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) 1
法二:生成蜂群图,避免散点重叠
sns.swarmplot(x="day", y="total_bill", data=tips) 1
在每一个一级分类内部可能存在二级分类
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips) 1
上边缘、上四分位数、中位数、下四分位数、下边缘
sns.boxplot(x="day", y="total_bill", hue="time", data=tips) 1
箱图 + KDE(Kernel Distribution Estimation)
sns.violinplot(x="total_bill", y="day", hue="time", data=tips) 1
sns.violinplot(x="day", y="total_bill", hue="time", data=tips) 1
sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False) 1 2
sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False) 1
非对称提琴图
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="stick") 1
sns.barplot(x="sex", y="survived", hue="class", data=titanic) 1
sns.countplot(x="deck", data=titanic) 1
sns.pointplot(x="sex", y="survived", hue="class", data=titanic) 1
修改颜色、标记、线型
sns.pointplot(x="class", y="survived", hue="sex", data=titanic, palette={ "male": "g", "female": "m"}, markers=["^", "o"], linestyles=["-", "--"]) 1 2 3
sns.factorplot(x="day", y="total_bill", hue="smoker", col="time", data=tips, kind="swarm") 1
多分类标准的子图
g = sns.PairGrid(tips, x_vars=["smoker", "time", "sex"], y_vars=["total_bill", "tip"], aspect=.75, size=3.5)# 对网格中的每一个图做violinplotg.map(sns.violinplot, palette="bright"); 1 2 3 4 5 6
通过seaborn对数据可视化可以看出数据的分布等情况。
更具体的代码。
原始地址:
Seaborn
其实是在matplotlib的基础上进行了更高级的 API
封装,从而使得作图更加容易seaborn
就能做出很具有吸引力的图,而使用matplotlib
就能制作具有更多特色的图。应该把Seaborn
视为matplotlib
的补充pip3 install seaborn
即可#-*- coding: utf-8 -*-import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as sns#%matplotlib inline # 为了在jupyter notebook里作图,需要用到这个命令 1 2 3 4 5 6 7
seaborn
中的数据集:tips = sns.load_dataset('tips')
kde
是高斯分布密度图,绘图在0-1之间hist
是否画直方图rug
在X轴上画一些分布线fit
可以制定某个分布进行拟合label
legend时的值axlabel
制定横轴的说明sns.distplot(tips['total_bill'], bins=None, hist=True, kde=False, rug=True, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)sns.plt.show() 1 2 3 4 5
from scipy import statssns.distplot(tips.total_bill, fit=stats.gamma, kde=False)sns.plt.show() 1 2 3
data2
可以是二维的分布shade
是否填充 kernel
核函数,还有很多核函数,比如cos, biw等cumulative
累积的作图,最后的值应该是接近1gridsize
多少个点估计ax = sns.kdeplot(tips['total_bill'], data2=tips.tip, shade=False, vertical=False, kernel="gau", bw="scott", gridsize=100, cut=3, clip=None, legend=True, cumulative=False, shade_lowest=True, ax=None) sns.plt.show() 1 2 3 4 5 6
iris
为例 data
: DataFrame格式的数据hue
: label类别对应的column namevars
: 指定feature的列名kind
: 作图的方式,可以是reg或scatterdiag_kind
: 对角线作图的方式,可以是hist或kdeiris = sns.load_dataset('iris') g = sns.pairplot(iris, hue='species', hue_order=None, palette=None, vars=list(iris.columns[0:-1]), x_vars=None, y_vars=None, kind="reg", diag_kind="hist", markers=['o','s','D'], size=1.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None) sns.plt.show() 1 2 3 4 5 6 7 8 9
x
: X轴数据y
: Y轴数据hue
: 区分不同种类数据的column namedata
: DataFrame类型数据jitter
: 将数据分开点,防止重叠tips = sns.load_dataset('tips') ax = sns.stripplot(x='day', y='total_bill', hue=None, data=tips, order=None, hue_order=None, jitter=True, split=False, orient=None, color=None, palette=None, size=5, edgecolor="gray", linewidth=0, ax=None) 1 2 3 4 5 6 7
ax = sns.stripplot(x='sex', y='total_bill', hue='day', data=tips, order=None, hue_order=None, jitter=True, split=False, orient=None, color=None, palette=None, size=5, edgecolor="gray", linewidth=0, ax=None) 1 2 3 4 5 6
tips = sns.load_dataset('tips') ax = sns.swarmplot(x='sex', y='total_bill', hue='day', data=tips) sns.plt.show() 1 2 3
x, y
:指定X轴,Y轴的columns name值hue
: 指定要区分的类别tips = sns.load_dataset('tips') ax = sns.boxplot(x='day', y='total_bill', hue=None, data=tips, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=.75, width=.8, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None) sns.plt.show() 1 2 3 4 5 6 7 8
- 可以和上面的stripplot一起用
tips = sns.load_dataset('tips') ax = sns.boxplot(x='day', y='total_bill', hue=None, data=tips, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=.75, width=.8, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None) sns.stripplot(x='day', y='total_bill', hue=None, data=tips, order=None, hue_order=None, jitter=True, split=False, orient=None, color=None, palette=None, size=5, edgecolor="gray", linewidth=0, ax=None) sns.plt.show() 1 2 3 4 5 6 7 8 9 10 11 12 13
kind
: 有scatter” | “reg” | “resid” | “kde” | “hextips = sns.load_dataset('tips') from scipy import stats g = sns.jointplot(x='total_bill', y='tip', data=tips, kind="reg", stat_func=stats.pearsonr, color=None, size=6, ratio=5, space=.2, dropna=True, xlim=None, ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None) sns.plt.show() 1 2 3 4 5 6 7 8 9 10
g = (sns.jointplot(x='total_bill', y='tip',data=tips).plot_joint(sns.kdeplot)) 1 2
inner
: 指定图里面用什么划分,有"box", "quartile", "point", "stick", None
quartile
为四分位数划分stick
很像rug,就是可以看出密度情况scale
: 缩放每个图对应的area, 取值有 "area", "count", "width"
area
指定每个有相同的areacount
会按数量缩放(数量少的就比较窄扁)tips = sns.load_dataset('tips') ax = sns.violinplot(x='day', y='total_bill', hue='smoker', data=tips, order=None, hue_order=None, bw="scott", cut=2, scale="area", scale_hue=True, gridsize=100, width=.8, inner="quartile", split=False, orient=None, linewidth=None, color=None, palette='muted', saturation=.75, ax=None) sns.plt.show() 1 2 3 4 5 6 7 8 9 10 11 12
estimator
:点的取值是,默认是np.mean
tips = sns.load_dataset('tips') sns.pointplot(x='time', y='total_bill', hue='smoker', data=tips, order=None, hue_order=None, estimator=np.mean, ci=95, n_boot=1000, units=None, markers="o", linestyles="-", dodge=False, join=True, scale=1, orient=None, color=None, palette=None, ax=None, errwidth=None, capsize=None) sns.plt.show() 1 2 3 4 5 6 7 8 9
mean value
,和点图其实差不多tips = sns.load_dataset('tips') sns.barplot(x='day', y='total_bill', hue='sex', data=tips, order=None, hue_order=None, estimator=np.mean, ci=95, n_boot=1000, units=None, orient=None, color=None, palette=None, saturation=.75, errcolor=".26", errwidth=None, capsize=None, ax=None) sns.plt.show() 1 2 3 4 5 6 7 8
tips = sns.load_dataset('tips') sns.countplot(x='day', hue='sex', data=tips) sns.plt.show() 1 2 3
kind
即可,有point
, bar
, count
, box
, violin
, strip
row
和col
指定绘制的行数和列数,给出一个种类类型的列名即可 titanic = sns.load_dataset('titanic') sns.factorplot(x='age', y='embark_town', hue='sex', data=titanic, row='class', col='sex', col_wrap=None, estimator=np.mean, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind="box", size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None) sns.plt.show() 1 2 3 4 5 6 7 8 9 10 11 12 13 14
flight = sns.load_dataset('flights') flights = flight.pivot('month','year','passengers') sns.heatmap(flights, annot=True, fmt='d') sns.plt.show() 1 2 3 4
hue
差不多,指定类别np.mean
gammas = sns.load_dataset('gammas') sns.tsplot(data=gammas, time='timepoint', unit='subject', condition='ROI', value='BOLD signal', err_style="ci_band", ci=68, interpolate=True, color=None, estimator=np.mean, n_boot=5000, err_palette=None, err_kws=None, legend=True, ax=None) sns.plt.show() 1 2 3 4 5 6 7 8
原始地址:
转载地址:http://qqyws.baihongyu.com/