import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
# 画不同的sin曲线图
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默认风格
sns.set()
'''
5种主题风格
darkgrid
whitegrid
dark
white
ticks
'''
sns.set_style("darkgrid")
sinplot()
sns.set_style("whitegrid")
sinplot()
sns.set_style("dark")
sinplot()
sns.set_style("white")
sinplot()
sns.set_style("ticks")
sinplot()
# 去掉上面和右边的边框
sinplot()
sns.despine()
# 设置图距离原点的偏移
sns.despine(offset=10)
# 再去掉左边轴
sns.despine(left=True)
# 指定风格
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
# 指定整体画风的大小
sns.set_context("paper")
sns.set_context("talk")
sns.set_context("poster")
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}) # 指定画图线条的粗细
# sns默认色调
current_palette = sns.color_palette()
sns.palplot(current_palette)
# 超过6个种类,使用圆形画板,hls颜色空间均匀分割
sns.palplot(sns.color_palette("hls", 8))
# l:调节亮度;s:调节饱和度
sns.palplot(sns.hls_palette(8, l=.7, s=.9))
# 使用在画图中
data = np.random.normal(size=(20, 8)) + np.arange(8) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls", 8))
# 颜色对比
sns.palplot(sns.color_palette("Paired",12))
# 你把颜色命名记住,就能用xkcd来指定颜色了
colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))
# 渐变颜色
sns.palplot(sns.color_palette("Blues"))
# 反转
sns.palplot(sns.color_palette("BuGn_r"))
# 色调线性变换
sns.palplot(sns.color_palette("cubehelix", 8))
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
# 和上面渐变一样,但是你能指定
sns.palplot(sns.light_palette("green"))
sns.palplot(sns.dark_palette("purple"))
sns.palplot(sns.light_palette("navy", reverse=True))
特征分布
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")))
x = np.random.normal(size=100)
# 直方图
sns.distplot(x,kde=False)
# 指定bins
sns.distplot(x, bins=20, kde=False)
# 散点图
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")
# 一次性画出两两的关系
sns.pairplot(iris)
多变量,回归分析
# 载入数据集
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
# 画出回归图,两种形式,推荐regplot
sns.regplot(x="total_bill", y="tip", data=tips)
sns.lmplot(x="total_bill", y="tip", data=tips)
# 数据是整数,可以添加抖动
sns.regplot(x="size", y="tip", data=tips, x_jitter=.05)
# 指定只画数据集中的某一类数据
anscombe = sns.load_dataset("anscombe")
anscombe.tail()
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 100})
# 非线性拟合,二次
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80});
# 分类别的进行对比
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
markers=["o", "x"], palette="Set1");
# 横纵坐标对比
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker",
col="time", row="sex", data=tips);
数据重叠,增加抖动
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", color_codes=True)
np.random.seed(sum(map(ord, "categorical")))
titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
# 把点都画出来,发现有很多重叠的部分,不方便观察
sns.stripplot(x="day", y="total_bill", data=tips);
# 给每个点随机的增加抖动,让其错开一点
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True)
# 把数据均匀展开
sns.swarmplot(x="day", y="total_bill", data=tips)
盒图,查看异常离群点
# 绘制盒图
sns.boxplot(x="day", y="total_bill", hue="time", data=tips);
# 绘制小提琴图
sns.violinplot(x="total_bill", y="day", hue="time", data=tips);
# 左右对比
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=["-", "--"]);
多层面板分类图,只需要指定kind
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips)
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")
sns.factorplot(x="day", y="total_bill", hue="smoker",
col="time", data=tips, kind="swarm")
sns.factorplot(x="time", y="total_bill", hue="smoker",
col="day", data=tips, kind="box", size=4, aspect=.5)
seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', 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, **kwargs)
Parameters:
- x,y,hue 数据集变量 变量名
- date 数据集 数据集名
- row,col 更多分类变量进行平铺显示 变量名
- col_wrap 每行的最高平铺数 整数
- estimator 在每个分类中进行矢量到标量的映射 矢量
- ci 置信区间 浮点数或None
- n_boot 计算置信区间时使用的引导迭代次数 整数
- units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
- order, hue_order 对应排序列表 字符串列表
- row_order, col_order 对应排序列表 字符串列表
- kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点 size 每个面的高度(英寸) 标量 aspect 纵横比 标量 orient 方向 "v"/"h" color 颜色 matplotlib颜色 palette 调色板 seaborn颜色色板或字典 legend hue的信息面板 True/False legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False share{x,y} 共享轴线 True/False
# 加载数据
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set(style="ticks")
np.random.seed(sum(map(ord, "axis_grids")))
tips = sns.load_dataset("tips")
# 实例化
g = sns.FacetGrid(tips, col="time")
# 画图,指定要画啥
g.map(plt.hist, "tip");
# 画散点图,指定点的透明程度以及类别
g = sns.FacetGrid(tips, col="sex", hue="smoker")
g.map(plt.scatter, "total_bill", "tip", alpha=.7)
g.add_legend();
# 指定画图的顺序
from pandas import Categorical
ordered_days = tips.day.value_counts().index
# 自己指定顺序
ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
size=1.7, aspect=4,)
g.map(sns.boxplot, "total_bill");
# 自己制定调色板颜色
pal = dict(Lunch="seagreen", Dinner="gray")
g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
g.add_legend();
# 制定画数据的形状
g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
g.add_legend();
# 设置x,y轴的名字
# 设置x,y轴的取值
with sns.axes_style("white"):
g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=.5);
g.set_axis_labels("Total bill (US Dollars)", "Tip");
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]);
g.fig.subplots_adjust(wspace=.02, hspace=.02);
# 画出全部的两两的图,并指定对角线以及非对角线的图
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris)
g.map(plt.scatter);