目录
简介
整体布局风格设置
5种主题
每个风格如下图所展示
* whitegrid
* darkgrid
* dark
* white
* ticks
风格细节设置
sns.despine()
画子图时风格可以不同
sns.set_context() :
"paper"
"talk"
"poster"
"notebook"
调色板
离散型色板
分类色板
圆形画板
hls_palette()函数来控制颜色的亮度和饱和度
l- 亮度 lightness
s- 饱和 saturation
调色板颜色设置
使用xkcd颜色来命名颜色
连续画板
cubehelix_palette()调色板
light_palette()和dark_palette()调用定制连续调色板
单变量分析绘图
直方图
数据分布情况
生成数据
两个变量
散点图
sns.jointplot()
"hex"图
sns.pairplot()
回归分析绘图
regplot()
多变量分析绘图
sns.stripplot(x,y,data)
sns.swarmplot()
盒图
sns.violinplot()小提琴图
图的套用
分类属性绘图
条形图
sns.barplot()
点图
sns.pointplot()
宽型数据
盒图横着画
多层面板分类图
sns.factorplot()
Facetgrid使用方法
Facetgrid绘制多变量
热度图的绘制
Seaborn是一个在matplotlib库的基础上封装的另一个库。提供了很多模板,只需一两行代码就能画出一个很漂亮的图,更加方便。
使用之前,先安装:pip install seaborn
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 最后一行是在jupyter中需要写的,在pycharm中去掉即可
%matplotlib inline # 让图可以直接显示在notebook上
# 用plt作图
def sinplot(flip=1):
x = np.linspace(0,14,100)# 在0到14上找出100个点
for i in range(1,7):# 画六条线
plt.plot(x,np.sin(x+i * .5) * (7-i) * flip)
sinplot()
# seaborn有模板可以直接调动
sns.set()# seaborn默认的一些组合
sinplot()
# 设置风格,可以传入上面的5种风格之一
sns.set_style("whitegrid")
data = np.random.normal(size = (20,6))+ np.arange(6)/2
sns.boxplot(data = data)
np.random.normal()的意思是一个正态分布
numpy.random.normal(loc=0,scale=1e-2,size=shape)
参数loc(float):正态分布的均值,对应着这个分布的中心。
loc=0说明这一个以Y轴为对称轴的正态分布,参数scale(float):正态分布的标准差,对应分布的宽.scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
参数size(int 或者整数元组):size=(1,2)/size=2,默认为None。
sns.set_style("darkgrid")
sinplot()
sns.set_style("dark")
sinplot()
sns.set_style("white")
sinplot()
sns.set_style("ticks")
sinplot()
sinplot()
# 默认值:去掉上面和右面的刻度线
sns.despine()
sns.violinplot(data)
sns.despine(offset=10)# offset:距轴线10刻度远
sns.set_style("whitegrid")
sns.boxplot(data = data,palette="deep")
sns.despine(left=True)# 隐藏左边的轴线
# 指定with域内是一个风格,外可以是另一种风格
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
sns.set()
sns.set_context("paper")
plt.figure(figsize=(8,6))
sinplot()
sns.set_context("talk")
plt.figure(figsize=(8,6))
sinplot()
sns.set_context("poster")
plt.figure(figsize=(8,6))
sinplot()
# font_scale:字体大小,linewidth:线的粗细
sns.set_context("notebook",font_scale=1.5,rc={"lines.linewidth":3.5})
sinplot()
* 颜色很重要
* color_palette():能传入任何Matplotlib所支持的颜色
* color_palette():不传参数则默认颜色
* set_palette():设置所有图的颜色
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(rc={"figure.figsize":(6,6)})# 画板大小
# 默认颜色 10个
current_palette = sns.color_palette()
sns.palplot(current_palette)
当你需要超过10种颜色时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会保持亮度和饱和度不变)。这是大多数的使用比默认颜色循环中设置的颜色 更多时的默认方案。
最常用的是使用“hls”的 颜色空间,这是RGB值得一个简单转换。
sns.palplot(sns.color_palette("hls", 14))
data = np.random.normal(size=(20,14)) + np.arange(14) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls",14))
# 与上面的颜色一一对应
sns.palplot(sns.hls_palette(14,l=.3,s=.8))
sns.palplot(sns.color_palette("Paired",8))
# 颜色一深一浅成对儿出现
应用:例如有好多国家参加比赛,每个国家有两个运动员,这两个运动员就可以用一深一浅的同一个色系表示,
xkcd包含了一套众包努力的针对随机RGB颜色的命名。产生了954个可以随时通过xkcd_rgb字典中调用的命名颜色。
plt.plot([0,1],[0,1],sns.xkcd_rgb["pale red"],lw=3)
plt.plot([0,1],[0,2],sns.xkcd_rgb["medium green"],lw=5)
plt.plot([0,1],[0,3],sns.xkcd_rgb["denim blue"],lw=7)
指定一个固定的颜色。颜色的命名可以查看官方文档。
色彩随着数据变,比如,数据越重要,颜色越深
sns.palplot(sns.color_palette("Blues"))
默认颜色由浅到深
如果有深入浅,在面板名称后加_r后缀
sns.palplot(sns.color_palette("BuGn_r"))
色调线性变换
sns.color_palette("cubehelix",8)
还可以自己指定色调区间
sns.palplot(sns.cubehelix_palette(8,start=.5,rot=-.75))
sns.palplot(sns.light_palette("green"))
# 如图1
sns.palplot(sns.dark_palette("green"))
# 如图2
sns.palplot(sns.light_palette("navy", reverse=True))
# reverse=True:颜色由深到浅 如图3
x,y=np.random.multivariate_normal([0,0],[[1,-.5],[-.5,1]],size=300).T
pal = sns.dark_palette("green",as_cmap=True)
sns.kdeplot(x,y,cmap=pal)
从里到外-->颜色从浅到深
实际画图时,没必要自己指定颜色空间,使用默认的即可,所以这里不在演示指定颜色空间
%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
sns.set(color_codes=True)
np.random.seed(sum(map(ord,"distributions")))
# 随机生成一个高斯数据
x=np.random.normal(size=100)
sns.distplot(x,kde=False)
# 接近一个高斯分布
sns.distplot(x,bins=20,kde=False)# 将当前数据切分成20小块
x=np.random.gamma(6,size=200)
sns.distplot(x,kde=False,fit=stats.gamma)
# fit传进当前要统计的指标
distplot()中能传入很多参数
根据均值和协方差生成数据。协方差:协方差在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
mean, cov = [0,1],[(1,.5),(.5,1)]
# 指定均值和协方差,生成200个数据
data = np.random.multivariate_normal(mean,cov,200)
df = pd.DataFrame(data,columns=["x","y"])#转换成pandas中的DataFrame结构
df
观测单个变量的特征时,用直方图;观察两个变量的之间的分布关系最好用散点图
sns.jointplot(x="x",y="y",data=df)
当数据量大时,用hex图比较好看,另外风格可以是上面说的5种风格的任意一种,建议“white”
x,y=np.random.multivariate_normal(mean, cov, 1000).T
# 当数据很多时,点会堆叠在一起,散点图不太好看
# hex图容易看出 那个区域分布的点多
with sns.axes_style("white"):
sns.jointplot(x=x,y=y,kind="hex",color="k")
这个函数会绘制出每两个特征的散点图,对角线位置为当前这一个变量的直方图
# 鸢尾花的数据集(seaborn内置的数据集),有四个特征,当然也可以用pandas读入其他数据
iris = sns.load_dataset("iris")
sns.pairplot(iris)
%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set(color_codes=True)
np.random.seed(sum(map(ord,"regression")))
# 内置数据集 tips
tips = sns.load_dataset("tips")
tips.head()
regplot()和lmplot()都可以绘制回归关系,刚开始使用seaborn推荐 regplot(),另一个支持一些更高级的部分,这个以后再说
sns.regplot(x="total_bill",y="tip",data=tips)
%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
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,jitter=True)
# jitter=True:使原本重叠在一起的点随机向左向右偏动,更容易观察
sns.swarmplot(x="day",y="total_bill",hue="sex",data=tips)
# 使数据更均匀的分布在左右;hue="sex"加上图例
# 另外其他的一些参数也是通用的可以通过官方文档查看具体使用
* IQR即统计学概念四分位距,第一/四分位与第三/四分位之间的距离
* N=1.5IQR 如果一个值>Q3+N 或
sns.boxplot(x="day",y="total_bill",hue="time",data=tips)
盒子下面为1/4,上面为3/4,最上面一横为最大值,同理最下面一横为最小值 ,小菱形为离群点
sns.violinplot(x="total_bill",y="day",hue="time",data=tips)
sns.violinplot(y="total_bill",x="day",hue="sex",data=tips,split=True)
# split:True 图的左右两侧各表示一个属性,更直观
sns.violinplot(y="total_bill",x="day",data=tips,inner=None)
sns.swarmplot(x="day",y="total_bill",data=tips,color="w",alpha=.5)# alpha为透明度
可以用来显示值的集中趋势
sns.barplot(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=["-","--"])
sns.boxplot(data=iris,orient="h")
# orient="h":横着画
sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips)
# 指定kind可以画不同的图,如条形:kind="bar
# sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips,kind="bar)
还有一些参数如下图所示:(参考)
Facetgrid是seaborn中一个很重要的函数,当我们想把数据集中很多子集进行展示时,可以用它。
%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
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();# 说明smoker用什么颜色,不写这句,没有旁边的小图例
其他参数设置与之前都是类似的
Facetgrid有一个要求是,传入的数据基本上都是pandas的格式,传参数是,最好都指定成DataFrame的格式(默认支持的格式)用其他就不一定ok了。
# 指定先后顺序
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");
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");
# s为圆圈大小
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]);#指定x轴y轴的取值
g.fig.subplots_adjust(wspace=.02,hspace=.02)# 子图之间的间隔
iris=sns.load_dataset("iris")# 鸢尾花数据集
g = sns.PairGrid(iris,vars=['sepal_length','sepal_width'],hue="species")# 区分了不同物种颜色
# vars指定选取4个特征中两个特征
g.map_diag(plt.hist)# 对角线画条形图
g.map_offdiag(plt.scatter)#非对角线画散点图
g.add_legend();
# palette调色板,根据size(6个)渐变颜色
g = sns.PairGrid(tips,hue="size",palette='GnBu_d')# 区分了不同物种颜色
g.map(plt.scatter,s=50,edgecolor="white")
g.add_legend();
import seaborn as sns
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
sns.set()
uniform_data = np.random.rand(3,3)
# 随机生成一个3*3的矩阵
print(uniform_data)
heatmap=sns.heatmap(uniform_data)
# 另外还可以在heatmap中指定调色板的上下线,参数例:vmin=0.2,vmax=0,9
[[0.5488135 0.71518937 0.60276338] [0.54488318 0.4236548 0.64589411] [0.43758721 0.891773 0.96366276]]
normal_data=np.random.randn(3,3)
print(normal_data)
ax = sns.heatmap(normal_data,center=0)# 指定以0为分界线
import seaborn as sns
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
sns.set()
# 航班数据
flights = sns.load_dataset("flights")
# flights.head()
flights = flights.pivot("month","year","passengers")
print(flights)
ax = sns.heatmap(flights)
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 month Jan 112 115 145 171 196 204 242 284 315 340 360 417 Feb 118 126 150 180 196 188 233 277 301 318 342 391 Mar 132 141 178 193 236 235 267 317 356 362 406 419 Apr 129 135 163 181 235 227 269 313 348 348 396 461 May 121 125 172 183 229 234 270 318 355 363 420 472 Jun 135 149 178 218 243 264 315 374 422 435 472 535 Jul 148 170 199 230 264 302 364 413 465 491 548 622 Aug 148 170 199 242 272 293 347 405 467 505 559 606 Sep 136 158 184 209 237 259 312 355 404 404 463 508 Oct 119 133 162 191 211 229 274 306 347 359 407 461 Nov 104 114 146 172 180 203 237 271 305 310 362 390 Dec 118 140 166 194 201 229 278 306 336 337 405 432
把值填在对应位置
ax = sns.heatmap(flights,annot=True,linewidths=.5,fmt="d",cmap="YlGnBu")
# d:字体格式(默认显示不清晰)
# 参数:linewidths=.5 :表示每个小格子之间的距离
# cmap:指定调色板
# cbar=False :将颜色的范围显示隐藏(最好不隐藏)