单变量
分布图 sns.distplot()
from scipy import stats
import matplotlib.pyplot as plt # 导入
import seaborn as sns
fig,ax=plt.subplots(2,1)
x = stats.norm.rvs(loc=0, scale=1, size=100)
sns.distplot(x, bins=20, kde=True, hist=True, rug=True, fit=stats.gamma,ax=ax[0]);
# bins直方图多少个矩阵条
# hist=True显示直方图
# kde=True 显示核密度分布图
# fit=stats.gamma 拟合
# rug=True 在x轴上显示每个观测上生成的小细条(边际毛毯)
sns.distplot(x, hist=False, color="g", kde_kws={"shade": True}, ax=ax[1])
# kde图上阴影
plt.show()
displot的输入参数 | 解释 |
---|---|
bins | 直方图多少个矩阵条 |
hist | 是否显示直方图 |
kde | 是否显示核密度估计图 |
fit | 是否显示拟合图 |
rug | 是否显示边际毛毯 |
box图
sns.boxplot
官方示例
matplotlib版本示例
import seaborn as sns
df = sns.load_dataset("tips")
sns.boxplot(data=df, x="day", y="total_bill", hue="sex", palette="PRGn")
palette=’Set1’,’Set2’,’Set3’,’PRGn’…
小提琴图
小提琴图1
每一列数据作为一个小提琴
import seaborn as sns
df = sns.load_dataset("tips")
sns.violinplot(data=df, palette="Set3", bw=.2, cut=3, linewidth=1)
小提琴图2
定义x列和y列,定义分类hue(可选)
import seaborn as sns
df = sns.load_dataset("tips")
sns.violinplot(data=df, x="day", y="total_bill", hue="sex", bw=.2, cut=3, linewidth=1, palette="PRGn")
小提琴图3
import seaborn as sns
df = sns.load_dataset("tips")
sns.violinplot(data=df, x="day", y="total_bill", hue="sex",split=True, bw=.2, cut=3, linewidth=1, palette="PRGn")
#split=True
qq图
用来看看是否服从特定分布2
(所用库:statsmodels)
from scipy.stats import t
data = t(df=5).rvs(size=1000)
import statsmodels.api as sm
from matplotlib import pyplot as plt
fig = sm.qqplot(data=data, dist=t, distargs=(3,), fit=True, line='45')
plt.show()
多变量
散点图
regplot
df = pd.DataFrame(np.random.rand(200).reshape(-1, 2), columns=['x', 'resid'])
df.loc[:, 'y'] = df.loc[:, 'x'] + df.loc[:, 'resid'] + 1
sns.regplot(x=df.x, y=df.y,
scatter=True, # 画散点图
fit_reg=True, # 回归并画回归线
ci=95, # 置信区间 [0,100]
color='r', # 颜色
marker='^', # 点的形状
ax=None # 使用哪个 axes
)
# 另一种用法
# sns.regplot(x='x', y='y', data=df)
还有些其它用法:
- order=2, 多项式回归
- sns.lmplot 可以分组把多个图画下来
- jointplot, pairplot 这两个画图方法可以设定
kind="reg"
,从而调用 regplot
jointplot
df = pd.DataFrame(np.random.rand(200).reshape(-1, 2), columns=['x', 'resid'])
df.loc[:, 'y'] = df.loc[:, 'x'] + df.loc[:, 'resid'] + 1
sns.jointplot(x=df.x, y=df.y, kind='kde', space=0)
# sns.jointplot(x='x', y='y', data=df, kind='hex', space=0)
# space 是三个子图之间的空隙
# kind='kde', 'hex', 'scatter', 'reg'
kind=’kde’:
kind=’hex’
kind=’scatter’
kind=’reg’
PairGrid
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
# 1. 用什么数据
g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")
# vars:指定画哪几个变量。默认全画
# hue:按照这一列分组
# 2. 在哪画图
# g.map = g.map_diag(对角线) + g.map_offdiag(非对角线)
# g.map_offdiag = g.map_upper + g.map_lower
# 3. 画什么图
# g.map_diag(plt.hist)
g.map_diag(sns.kdeplot, lw=3, legend=False)
# 主对角线,可以画的图有:
# a) plt.scatter(默认)
# b) plt.hist
# c) g.map_diag(sns.kdeplot, lw=3, legend=False)
g.map_upper(plt.scatter)
g.map_lower(sns.kdeplot)
# 可以画的图有:
# plt.scatter(默认)
# sns.kdeplot:对角线上就是kde,其它地方是二维kde,所以画成等高线图
# sns.regplot:带回归线和预测范围的 scatter
# 4. 美化:针对有分类 hue 的情况,会在右边显示 label
g.add_legend()
另外,还可以更精细地指定画哪些图
g = sns.PairGrid(iris, x_vars=['petal_length','sepal_width'], y_vars=['petal_length'], hue="species")
clustermap
import pandas as pd
import scipy.stats as stats
df = pd.DataFrame(stats.uniform(loc=0, scale=2).rvs(size=1000).reshape(-1, 5))
import matplotlib.pyplot as plt
import seaborn as sns
sns.clustermap(df)
plt.show()
对应的参数:
col_cluster=False
row_cluster=False
还有第二种图:
sns.clustermap(df.corr())
plt.show()
常用自定义画图
一种回归并画图的例子
# 导入包与数据
import pandas as pd
from statsmodels.sandbox.regression.predstd import wls_prediction_std
import matplotlib.pyplot as plt
import numpy as np
df=pd.DataFrame(np.random.rand(200).reshape(-1,2),columns=['x','resid'])
df.loc[:,'y']=2*df.loc[:,'x']+0.5*df.loc[:,'resid']+1
# 建模
import statsmodels.formula.api as smf
lm_s = smf.ols(formula='y ~ x', data=df).fit()
# 画图
prstd, iv_l, iv_u = wls_prediction_std(lm_s)
fig, ax = plt.subplots()
ax.plot(df.x, df.y, 'o', label="data")
ax.plot(df.x, lm_s.fittedvalues, 'r-', label="OLS")
ax.plot(df.x, iv_u, 'b--')
ax.plot(df.x, iv_l, 'b--')
ax.legend(loc='best')
plt.title('R2={a:.2f},y={b:.3f}x+{c:.3f}'.format(a=lm_s.rsquared,b=lm_s.params[0],c=lm_s.params[1]))
plt.show()