转载::https://blog.csdn.net/mengenqing/article/details/80658163
Matplotlib试着让简单的事情更加简单,困难的事情变得可能,而Seaborn就是让困难的东西更加简单。
用Matplotlib最大的困难是其默认的各种参数,而Seaborn则完全避免了这一问题。
seaborn是针对统计绘图的,一般来说,seaborn能满足数据分析90%的绘图需求,够用了,如果需要复杂的自定义图形,还是要Matplotlib。
第一,单变量单特征数据分析图---直方图
-
import numpy
as np
-
import seaborn
as sns
-
from scipy
import stats, integrate
-
%matplotlib inline
-
sns.set(color_codes=
True)
-
np.random.seed(sum(map(ord,
"distributions")))
#每次产生的随机数相同
-
x = np.random.gamma(
6, size=
200)
-
sns.distplot(x, kde=
False, fit=stats.gamma)
第二,散点图:观测两个变量之间的分布关系最好的图之一
-
import numpy
as np
-
import pandas
as pd
-
import seaborn
as sns
-
import matplotlib.pyplot
as plt
-
from scipy
import stats, integrate
-
%matplotlib inline
-
sns.set(color_codes=
True)
-
mean, cov = [
0.5,
1], [(
1,
.5),(
.5,
1)]
#设置均值(一组参数)和协方差(两组参数)
-
data = np.random.multivariate_normal(mean, cov,
200)
-
df = pd.DataFrame(data, columns=[
"x",
"y"])
-
print(df.head())
-
sns.jointplot(x=
"x", y=
"y", data=df)
-
plt.show()
数据量大的情况下,用hex散点图
-
import numpy
as np
-
import pandas
as pd
-
import seaborn
as sns
-
import matplotlib.pyplot
as plt
-
from scipy
import stats, integrate
-
%matplotlib inline
-
sns.set(color_codes=
True)
-
mean, cov = [
0,
1], [(
1,
.5), (
.5,
1)]
-
x, y = np.random.multivariate_normal(mean, cov,
1000).T
-
with sns.axes_style(
"ticks"):
-
sns.jointplot(x=x, y=y, kind=
"hex", color=
"k")
-
plt.show()
第三,比较图:观察变量两两之间的关系
-
import numpy
as np
-
import pandas
as pd
-
import seaborn
as sns
-
import matplotlib.pyplot
as plt
-
from scipy
import stats, integrate
-
%matplotlib inline
-
sns.set(color_codes=
True)
-
iris = sns.load_dataset(
"iris")
-
sns.pairplot(iris)
#对角线是直方图(统计数量),其他的是散点图
-
print(iris.head(
2))
-
plt.show()
第四,回归分析图
regplot()和lmplot()都可以绘制回归关系,推荐regplot()
regplot()
和lmplot()
都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。我将着力讲解二者的区别,这会帮助你选用恰当的工具。
在最简单的调用中,两个函数都会画出双变量的散点图,然后以y~x拟合回归方程和预测值95%置信区间并将其画出。
两者间主要的区别是,regplot接受各种格式的x y,包括numpy arrays ,pandas series 或者pandas Dataframe对象。相比之下,lmplot()只接受字符串对象。这种数据格式被称为’long-form’或者’tidy’。除了输入数据的便利性外,regplot()
可以看做拥有lmplot()
特征的一个子集,所以接来下我们将用lmplot()
进行演示。
公共头文件:
-
%matplotlib inline
-
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")
-
-
print(tips.head(
2))
-
sns.regplot(x=
"total_bill", y=
"tip", data=tips)
-
plt.show()
当数据具有高阶关系时,lmplot()
与regplot
可以用多项式回归来来简单探索数据间的非线性关系:
-
anscombe = sns.load_dataset(
"anscombe")
-
sns.lmplot(x=
"x", y=
"y", data=anscombe.query(
"dataset == 'II'"),
-
order=
2, ci=
None, scatter_kws={
"s":
80})
-
plt.show()
采用robust回归解决忽略异常点,即:在拟合曲线的时候不考虑这个点:
-
anscombe = sns.load_dataset(
"anscombe")
-
sns.lmplot(x=
"x", y=
"y", data=anscombe.query(
"dataset == 'III'"),
-
robust=
True, ci=
None, scatter_kws={
"s":
80})
-
plt.show()
三个变量回归图的比较:
-
tips = sns.load_dataset(
"tips")
-
sns.lmplot(x=
"total_bill", y=
"tip", hue=
"smoker",
-
col=
"time", row=
"sex", data=tips)
-
plt.show()
jointplot()可以通过传递kind =”reg”来显示关键子图的线性回归拟合
-
sns.jointplot(x=
"total_bill", y=
"tip", data=tips, kind=
"reg")
-
plt.show()
第五,多变量分析及分类属性绘图
树形图分析的功能类似于散点图,显示每个数据
-
tips = sns.load_dataset(
"tips")
-
sns.swarmplot(x=
"day", y=
"total_bill",hue=
"sex",data=tips)
-
plt.show()
小提琴图:
-
sns.violinplot(x=
"day", y=
"total_bill", hue=
"sex", data=tips, split=
True)
#hue是用来分类的,去掉hue="sex" 和split=True, 不影响图的形状,只是没有分类而已
-
plt.show()
小提琴和树形混合图:
-
sns.violinplot(x=
"day", y=
"total_bill",hue=
"sex", data=tips, split=
True )
-
sns.swarmplot(x=
"day", y=
"total_bill", data=tips, color=
"k", alpha=
.5)
-
plt.show()
盒图:
-
sns.boxplot(x=
"day", y=
"total_bill", hue=
"time", data=tips)
-
plt.show()
第六,FacetGrid及绘制多变量
-
g = sns.FacetGrid(tips, row=
"smoker", col=
"time", margin_titles=
True)
-
g.map(sns.regplot,
"size",
"total_bill", color=
".1", fit_reg=
False, x_jitter=
.2)
-
plt.show()
指定画图的顺序:利用Categorical指定
-
from pandas
import Categorical
-
ordered_days = tips.day.value_counts().index
-
print (ordered_days)
-
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")
-
plt.show()
可指定对角线和非对角线画的图形种类:
-
iris = sns.load_dataset(
"iris")
-
g = sns.PairGrid(iris, hue=
"species")
-
g.map_diag(plt.hist)
#指定对角线画的图的类型
-
g.map_offdiag(plt.scatter)
#指定非对角线画的图的类型
-
#g.map(plt.scatter)#如果所有图的用以中类型,则用这个搞定
-
g.add_legend()
#加图例
-
print(iris.head(
2))
-
plt.show()
第七,热度图
-
%matplotlib inline
-
import matplotlib.pyplot
as plt
-
import numpy
as np;
-
np.random.seed(
0)
-
import seaborn
as sns;
-
sns.set()
-
uniform_data = np.random.randn(
3,
3)
-
print (uniform_data)
-
heatmap = sns.heatmap(uniform_data,vmin=
-0.5, vmax=
0.9,center=
0,annot=
True,fmt=
"f",linewidths=
.5)
-
#vmin指定小于等于-0.5为一种颜色,vmax指定为大于等于0.9为一种颜色,center指定颜色以0向两侧变化
-
#注释项annot=True,fmt=“d”即是在图上显示数据值,linwidth=.5加上一个格,这个图会比较更清晰
-
plt.show()
-
flights = sns.load_dataset(
"flights")
-
flights = flights.pivot(
"year",
"month",
"passengers")
#创建透视图,第一个参数为纵坐标,第二个参数为横坐标,第三个参数为值
-
print (flights.head(
1))
-
ax = sns.heatmap(flights, annot=
True,fmt=
"d",linewidths=
.5)