Seaborn是基于matplotlib产生的一个模块,专攻于统计可视化,可以和pandas进行无缝链接,使初学者更容易上手。相对于matplotlib,Seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系。
2.1安装:
1)linux系统
sudo pip install seaborn
2)window系统
pip install seaborn
2.2快速入门
import as sns
sns.set(style="ticks")
from matplotlib import pyplot
# 加载数据集
tips = sns.load_dataset("tips")
# 绘图
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="PRGn")
sns.despine(offset=10, trim=True)
#图片展示与保存
pyplot.savefig("GroupedBoxplots.png")
pyplot.show()
2.3seaborn常用方法
1、单变量分析绘图
1)分布的集中趋势,反映数据向其中心值靠拢或聚集的程度
x = np.random.normal(size=100)
sns.distplot(x, kde=True)# kde=False关闭核密度分布, rug表示在x轴上每个观测上生成的小细条(边际毛毯)
2、观测两个变量之间的分布关系最好用散点图
1)直接拟合概率密度函数
sns.jointplot(x="x", y="y", data=df, kind="kde")
2)能够更加直观反映点的分布情况
hex图 (数据量大的时候)¶
最好黑白相间
数据量大时候,用hex图,分辨出哪块更多(颜色深浅)
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 = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("ticks"):
sns.jointplot(x=x, y=y, kind="hex")
3、多变量两两显示
# 鹃尾花数据iris = sns.load_dataset("iris")
sns.pairplot(iris)
4、Seaborn可视化各种绘图操作
1、盒图 box graph
import matplotlib.pyplot as plt
import numpy as np
盒图关心中位数Q2、四分之一位Q1、四分之三位Q3和离群点¶
IQR = Q3 - Q1
如果Q1-1.5IQR或者Q3+1.5IQR就是离群点
tang_data = [np.random.normal(0, std, 100) for std in range(1,4)]
fig = plt.figure(figsize=(8,6))
plt.boxplot(tang_data, vert=True, notch=True)
plt.xticks([x+1 for x in range(len(tang_data))], ['x1', 'x2', 'x3'])
plt.xlabel('x')
plt.title('box plot')
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
2、单特征绘制直方图
1)distplot
x = np.random.normal(size=100)
sns.distplot(x, kde=False, bins=20)
2)countplot 计数图
countplot 故名思意,计数图,可将它认为一种应用到分类变量的直方图,也可认为它是用以比较类别间计数差,调用 count 函数的 barplot。
seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, ax=None, **kwargs)
x, y, hue: names of variables in data or vector data, optional
data: DataFrame, array, or list of arrays, optional
order, hue_order: lists of strings, optional #设置顺序
orient: “v” | “h”, optional #设置水平或者垂直显示
ax: matplotlib Axes, optional #设置子图位置,将在下节介绍绘图基础
3、分析两个特征之间的关系,利用散点图来表达
mean, cov = [0,1], [(1, .5), (.5,1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=['X1', 'X2'])
sns.jointplot(x='X1', y='X2', data=df)
# kind = 'hex' # 六边形
data = np.random.multivariate_normal(mean, cov, 2000).T
with sns.axes_style('white'):
sns.jointplot(x=data[0], y=data[1], kind='hex', color='k')
4、看两两之间变量的关系
iris = sns.load_dataset('iris')
sns.pairplot(iris)
5、条形图
sns.barplot(x='sex', y='survived', data=titanic, hue='class')
点图,不看集中趋势,就看各自的变化
sns.pointplot(x='sex', y='survived', data=titanic, hue='class')
sns.pointplot(x='class', y='survived', data=titanic, hue='sex', palette={'male':'g','female':'m'}, markers=['^', 'o'], linestyles=['-','--'])
tips = sns.load_dataset('tips', data_home='.')
# jitter 震动
sns.stripplot(x='day', y='total_bill', data=tips, jitter=True)
sns.swarmplot(x='day', y='total_bill', data=tips)
sns.swarmplot(x='day', y='total_bill', data=tips, hue='sex')
sns.swarmplot(x='day', y='total_bill', data=tips, hue='time')
6、盒图
sns.boxplot(x='day', y='total_bill', data=tips, hue='time')
7、小提琴图
sns.violinplot(x='day', y='total_bill', data=tips, hue='sex', split=True)
sns.violinplot(x='day', y='total_bill', data=tips, inner=None, split=True)
sns.swarmplot(x='day', y='total_bill', data=tips, color='k', alpha=1.0)
8、热力图通过颜色一目了然的指定值的大小,以及变化的趋势
uniform_data = np.random.rand(3,3)
sns.heatmap(uniform_data)
sns.heatmap(uniform_data, vmin=0.2, vmax=0.5)
normal_data = np.random.randn(3,3)
sns.heatmap(normal_data, center=0)
flights = sns.load_dataset('flights')
data = flights.pivot("month", "year", 'passengers')
sns.heatmap(data)
sns.heatmap(data, annot=True, fmt='d', linewidths=.5, cbar=False, cmap='YlGnBu')
9、设置画图的整体风格
def sin_plot(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)
sin_plot()
10、有五种主题风格,darkgrid whitegrid dark white ticks
sns.set_style('darkgrid')
data = np.random.normal(size=(20,6)) + np.arange(6) / 2
sns.boxplot(data=data)
11、每一个子图的风格都可以不一样,with里面一个风格,外面一个风格
with sns.axes_style('whitegrid'):
plt.subplot(211)
sin_plot()
plt.subplot(212)
sin_plot(-1)
12、布局的风格
sns.set_context("paper")
plt.figure(figsize=(8,6))
sin_plot()
sns.set_context("talk")
plt.figure(figsize=(8,6))
sin_plot()
sns.set_context("poster")
plt.figure(figsize=(8,6))
sin_plot()
sns.set_context("notebook", font_scale=3.5, rc={'lines.linewidth': 4.5})
plt.figure(figsize=(8,6))
sin_plot()