seaborn

关系绘图relplot

relplot函数可以绘制散点图和线形图,==默认散点图==,可以通过修改==kind==参数决定画图类型

  1. 散点图scatterplot:relplot(kind='scatter')
  2. 线形图lineplot:relplot(kind='line')

基本使用

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
tips = sns.load_dataset("tips",cache=True)
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
sns.relplot(x="total_bill",y="tip",data=tips)
plt.tight_layout()
plt.savefig('1.png')
plt.show()

上述代码中:

tips数据是seaborn库==自带==的数据集,可通过sns.load_dataset('tips',cache=True)加载

sns.relplot(x="total_bill",y="tip",data=tips)中的==x="total_bill",y="tip"==是将x轴命名为“total_bill”,y轴命名为"tip"

效果图如下:![1](D:\PYTHON LOVE\seaborn\1.png)

添加hue参数

hue参数是用来控制第三个变量的颜色显示的。比如我们在以上图的基础之上体现出星期几的参数,那么可以通过以下代码来实现:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
tips = sns.load_dataset("tips",cache=True)
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
sns.relplot(x="total_bill",y="tip",hue="day",data=tips)
plt.tight_layout()
plt.savefig('2.png')
plt.show()

效果图如下:![2](D:\PYTHON LOVE\seaborn\2.png) 从上图可以看出,hue参数的作用是,在x,y两个变量不变的情况下,==将数据散点根据heu参数进行分类,并用不同颜色显示散点==

添加col和row参数

colrow,可以将图根据某个属性的值的个数分割成多列或者多行。比如在以上图的基础之上我们想要把Lunch(午餐)Dinner(晚餐)分割成两个图来显示,那么可以通过以下代码来实现:

sns.relplot(x="total_bill",y="tip",hue="day",col="time",data=tips)
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
tips = sns.load_dataset("tips",cache=True)
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
sns.relplot(x="total_bill",y="tip",hue="day",col='time',data=tips)
plt.tight_layout()
plt.savefig('3.png')
plt.show()

效果图如下:

![3](D:\PYTHON LOVE\seaborn\3.png)

也可以再在row上添加一个新的变量,比如把性别按照行显示出来,代码如下:

sns.relplot(x="total_bill",y="tip",hue="day",col="time",row="sex",data=tips)
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
tips = sns.load_dataset("tips",cache=True)
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
sns.relplot(x="total_bill",y="tip",hue="day",col='time',row='sex',data=tips)
plt.tight_layout()
plt.savefig('4.png')
plt.show()

效果图如下: ![4](D:\PYTHON LOVE\seaborn\4.png)

指定图像具体显示为几列

有时候我们的图有很多,默认情况下会在一行中全部展示出来,那么我们可以通过col_wrap来指定具体多少列。示例代码如下:

sns.relplot(x="total_bill",y="tip",col="day",col_wrap=2,data=tips)
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
tips = sns.load_dataset("tips",cache=True)
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
fig,axes=plt.subplots(1,2)  #将整个画布fig分为一行两列两个axes子图

sns.relplot(x="total_bill",y="tip",col="day",data=tips,ax=axes[0])#第一个子图
plt.savefig('5.png')
sns.relplot(x="total_bill",y="tip",col="day",col_wrap=2,data=tips,ax=axes[1])#第二个子图
plt.tight_layout()
plt.savefig('6.png')
plt.show()

不使用col_wrap与使用col_wrap的效果图对比:

绘制折线图

relplot通过设置kind="line"可以绘制折线图。并且功能比plt.plot更加强大。plot只能指定具体的xy轴的数据(比如x轴是N个数,y轴也必须为N个数)。而relplot则可以在自动在两组数据中进行计算绘图。示例代码如下:

fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint",y="signal",kind="line",data=fmri)
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
fmri = sns.load_dataset("fmri")
print(fmri.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子
sns.relplot(x="timepoint",y="signal",kind="line",data=fmri)
plt.tight_layout()
plt.savefig('7.png')
plt.show()

效果图如下: ![7](D:\PYTHON LOVE\seaborn\7.png)

同理,折线图也可以设置hue、col、style等参数

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
fmri = sns.load_dataset("fmri")
print(fmri.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子

# 设置hue为event,就会根据event来绘制不同的颜色
# 设置col为region,就会根据region值的个数来绘制指定个数的图
# 设置style为event,就会根据event来设置线条的样式

sns.relplot(x="timepoint",y="signal",kind="line",hue="event",col="region",style="event",data=fmri)

plt.tight_layout()
plt.savefig('8.png')
plt.show()

效果图如下:![8](D:\PYTHON LOVE\seaborn\8.png)

style参数是用来设置线条样式的

上述代码中style='event',将stim以蓝色实线绘出,cue以黄色虚线绘出

分类绘图catplot

分类图的绘制,采用的是sns.catplot来实现的。catcategory的简写。默认绘制的是分类散点图,如果想要绘制其他类型的图,同样也是通过kind参数来指定。

catplot不能使用sizestyle参数

分类绘图包括:

  • 分类散点图
  • 分类分布图
  • 分类统计图

分类散点图

适合数据量不是很多的情况,用catplot来实现,但是也有以下两个特别的方法:

  1. stripplot()catplot(kind="strip"),默认。
  2. swarmplot()catplot(kind="swarm")
stripplot
sns.catplot(x="day",y="total_bill",data=tips,hue="sex")
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset("tips")
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子

sns.catplot(x="day",y="total_bill",data=tips,hue="sex")

plt.tight_layout()
plt.savefig('9.png')
plt.show()

效果图如下:![9](D:\PYTHON LOVE\seaborn\9.png)

swarmplot

上图展示的是按照星期几的分类散点图,看起来这些点有点重合,如果想要散开来,那么可以使用catplot(kind="swarm")。示例代码如下:

sns.catplot(x="day",y="total_bill",kind="swarm",data=tips,hue="sex")
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset("tips")
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子

sns.catplot(x="day",y="total_bill",kind="swarm",data=tips,hue="sex")

plt.tight_layout()
plt.savefig('10.png')
plt.show()

效果图如下:![10](D:\PYTHON LOVE\seaborn\10.png)

横向分类散点图(和横着的条形图一样的布局)

要将垂直的分类散点图变成横向的,只需要把xy对应的值进行互换即可。

sns.catplot(y="day",x="total_bill",kind="swarm",data=tips,hue="sex")
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset("tips")
print(tips.sample(10)) #从tips数据集里随机抽10行,看看这些数据长什么样子

sns.catplot(y="day",x="total_bill",kind="swarm",data=tips,hue="sex")

plt.tight_layout()
plt.savefig('11.png')
plt.show()

效果图如下:

分类分布图

分类分布图,主要是根据分类,看每个分类下数据的分布情况。也是通过catplot来实现,以下两个方法分别是不同的kind参数:

  1. 箱线图boxplot()catplot(kind="box")
  2. 小提琴图violinplot()catplot(kind="violin")
箱线图
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
athletes = pd.read_csv("athlete_events.csv")
countries = {
    'CHN':'中国',
    'JPN':"日本",
    'KOR':'韩国',
    'USA':"美国",
    'CAN':"加拿大",
    'BRA':"巴西",
    'GBR':"英国",
    'FRA':"法国",
    'ITA':"意大利",
    'ETH':"埃塞俄比亚",
    'KEN':"肯尼亚",
    'NIG':"尼日利亚",
}
plt.rcParams['font.sans-serif'] = ['FangSong']
# print(plt.rcParams.keys())
need_athletes = athletes[athletes['NOC'].isin(list(countries.keys()))] #Pandas isin()方法用于过滤数据帧。isin() 方法有助于选择在特定列中具有特定(或多个)值的行
g = sns.catplot(x="NOC",y="Height",data=need_athletes,kind="box",hue="Sex")
g.fig.set_size_inches(20,5)
g.set_xticklabels(list(countries.values()))


plt.tight_layout()
plt.savefig('12.png')
plt.show()

athletes[athletes['NOC'].isin(list(countries.keys()))]:遍历'NOC'这列的数据,判断国籍是否在列表中(此列表是由字典countries的键组成的)

因此这句代码返回的是国籍NOC在列表中的运动员的数据

效果图如下:

小提琴图

小提琴图实际上就是两个对称的核密度曲线合并起来,然后中间是一个箱线图(也可以为其他图)组成的。通过小提琴图可以看出数据的分布情况。

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset('tips',cache=True)

sns.catplot(x="day",y="total_bill",data=tips,kind="violin",hue="sex",split=True)
plt.tight_layout()
plt.savefig('13.png')
plt.show()

效果图如下:![13](D:\PYTHON LOVE\seaborn\13.png)

小提琴的中间默认绘制的是箱线图,也可以修改为其他类型的。可以通过inner参数修改,这个参数有以下几个选项:

  1. box:默认的,箱线图
  2. quartile:四分位数。上下四分位数加中位数
  3. point:散点
  4. stick:线条

==四种小提琴图对比:==

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset('tips',cache=True)
fig,axes=plt.subplots(2,2)

axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='box',hue="sex",split=True,ax=axes[0][0])
axe.set_title('中间为箱线图的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='quartile',hue="sex",split=True,ax=axes[0][1])
axe.set_title('中间为四分位数的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='point',hue="sex",split=True,ax=axes[1][0])
axe.set_title('中间为散点的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='stick',hue="sex",split=True,ax=axes[1][1])
axe.set_title('中间为线条的小提琴图')

plt.suptitle("中间图形不同的4种小提琴图")
plt.tight_layout()
plt.savefig('14.png')
plt.show()

效果图如下:

![14](D:\PYTHON LOVE\seaborn\14.png)

分类统计图

根据分类,==统计每个分类下的数据的个数或者比例==。有以下几种方式:

  1. barplot()条形图catplot(kind="bar")
  2. pointplot()点线图catplot(kind="point")
  3. countplot()柱状图catplot(kind="count")
条形图

seaborn中的条形图具有统计功能,可以统计出==比例,平均数==,也可以按照你想要的==统计函数==来统计

统计平均数
# 统计星期三到星期天的消费总额的平均数
sns.catplot(x="day",y="total_bill",data=tips,kind="bar")
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset('tips',cache=True)
# 统计星期三到星期天的消费总额的平均数
sns.catplot(x="day",y="total_bill",data=tips,kind="bar")

plt.tight_layout()
plt.savefig('15.png')
plt.show()

结果如下:![15](D:\PYTHON LOVE\seaborn\15.png)

统计比例
 # 统计男女中获救的比例
 sns.catplot(data=titanic,kind="bar",x="sex",y="survived")
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
titanic = sns.load_dataset('titanic',cache=True)

# 统计男女中获救的比例
sns.catplot(data=titanic,kind="bar",x="sex",y="survived")

plt.tight_layout()
plt.savefig('16.png')
plt.show()

结果如下:![16](D:\PYTHON LOVE\seaborn\16.png)

自定义统计函数
 # 自定义统计函数,统计出每个性别下获救的人数
 sns.barplot(x="sex",y="survived",data=titanic,estimator=lambda values:sum(values))
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
titanic = sns.load_dataset('titanic',cache=True)

# 自定义统计函数,统计出每个性别下获救的人数
sns.barplot(x="sex",y="survived",data=titanic,estimator=lambda values:sum(values))

plt.tight_layout()
plt.savefig('17.png')
plt.show()

==lambda函数==见Python Lambda (w3school.com.cn)

结果如下:![17](D:\PYTHON LOVE\seaborn\17.png)

柱状图

柱状图是专门用来统计某个单一变量出现数量的图形。示例代码如下:

sns.catplot(x="sex",data=titanic,kind="count")

![18](D:\PYTHON LOVE\seaborn\18.png)

也可以通过使用hue参数来指定分组:

sns.catplot(x="day",kind="count",data=tips,hue="sex")

![19](D:\PYTHON LOVE\seaborn\19.png)

点线图

点线图可以非常方便的看到变量之间的趋势变化。示例代码如下:

sns.catplot(x="sex",y="survived",data=titanic,kind="point",hue="class")

![20](D:\PYTHON LOVE\seaborn\20.png)

分布绘图

分布绘图分为

  • 单一变量分布
  • 多变量分布
  • 成对绘图

单变量分布

单一变量主要就是通过直方图来绘制。在seaborn中直方图的绘制采用的是distplot,其中distdistribution的简写

示例代码如下:

sns.set(color_codes=True)
titanic = sns.load_dataset("titanic")
titanic = titanic[~np.isnan(titanic['age'])]
sns.distplot(titanic['age'])
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
sns.set(color_codes=True) #调色板颜色调整
titanic = sns.load_dataset('titanic',cache=True)
#titanic.to_csv('titanic.csv',index=False)
titanic = titanic[~np.isnan(titanic['age'])]  #只保留age列是数字的数据,波浪号代表否定
sns.distplot(titanic['age'])

plt.tight_layout()
plt.savefig('21.png')
plt.show()

结果如下:![21](D:\PYTHON LOVE\seaborn\21.png)

distplot()有以下参数:

  1. kde(核密度曲线):这个代表是否要显示kde曲线,==默认显示==,如果显示kde曲线,那么y轴表示的就是==概率==;不显示kde曲线则y轴表示==数量==。也可以设置为False关掉。

    sns.distplot(titanic['age'],kde=False)

  2. bins:代表这个直方图显示的柱形的数量。也可以通过自己设置

    sns.distplot(titanic['age'],bins=30)

  3. rug:代表是否需要显示底部的胡须下线,下面的==胡须线越密集==的地方,说明==数据量越多==

    sns.distplot(titanic['age'],rug=True)

二变量分布

多变量分布图可以看出两个变量之间的分布关系。一般都是采用多个图进行表示。

多变量分布图采用的函数是jointplot

散点图

sns.jointplot(x="total_bill", y="tip", data=tips)

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset("tips")
sns.jointplot(x="total_bill", y="tip", data=tips)
plt.savefig('24.png')
sns.jointplot(x="total_bill", y="tip", data=tips,kind="reg")

plt.tight_layout()
plt.savefig('25.png')
plt.show()

通过设置kind='reg'可以设置==回归绘图==和==核密度曲线==

六边形图

对于一些==数据量特别大==的数据,用散点图不太利于观察,散点将会汇聚成一片

针对这种数据量比较大的情况,可以采用六边形图来绘制,也就是将之前的散点变成六边形,六边形有一个区间大小,==点落在这个六边形中越多颜色越深==

sns.jointplot(x="Height",y="Weight",data=china_athletes,kind="hex",gridsize=20)

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
athletes = pd.read_csv('athlete_events.csv')
china_athletes = athletes[athletes['NOC']=='CHN'] #只保留国籍NOC是CHN的数据

sns.jointplot(x="Height",y="Weight",data=china_athletes,kind="hex",gridsize=20)


plt.tight_layout()
plt.savefig('26.png')
plt.show()

==jointplot其他常用参数:==

  • x,y,data:绘制图的数据。
  • kind:scatter、reg、resid、kde、hex。
  • color:绘制元素的颜色。
  • height:图的大小,图会是一个正方形。
  • ratio:主图和副图的比例,只能为一个整形。
  • space:主图和副图的间距。
  • dropna:是否需要删除x或者y值中出现了NAN的值。
  • marginal_kws:副图的一些属性,比如设置bins、rug等。

成对绘图pairplot

pairplot可以把某个数据集中某几个字段之间的关系图一次性绘制出来。比如iris鸢尾花数据,我们想要看到petal_widthpetal_heightsepal_width以及sepal_height之间的关系,那么我们就可以通过pairplot来绘制

sns.pairplot(iris,vars=['sepal_length',"sepal_width",'petal_length','petal_width'])
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
iris = pd.read_csv('Iris.csv')

sns.pairplot(iris,vars=['sepal_length',"sepal_width",'petal_length','petal_width'])#成对绘图
plt.savefig('27.png')

sns.pairplot(iris,vars=['sepal_length',"sepal_width",'petal_length','petal_width'],diag_kind="kde",kind="reg")#修改对角线上的图为核密度曲线图,其余图为回归绘图

plt.tight_layout()
plt.savefig('28.png')
plt.show()

线性回归绘图

线性回归图可以帮助我们看到数据的关系趋势。在seaborn中可以通过regplotlmplot两个函数来实现。regplotxy可以为Numpy数组Series等变量。而lmplotxy则必须为字符串,并且data的值不能为空:

  1. regplot(x,y,data=None)
  2. lmplot(x,y,data)

regplot

sns.regplot(x=tips["total_bill"],y=tips["tip"])

lmplot

sns.lmplot(x="total_bill",y="tip",data=tips)

两种方法对比


regplot线性回归绘图

lmplot线性回归绘图

FacetGrid结构图

relplotcatplotlmplot等,这些函数可以通过colrow等在一个Figure中绘制多个图。这些函数之所以有这些功能,是因为他们的底层使用了FacetGrid来组装这些图形

普通的Axes绘图

seaborn的绘图函数中也有大量的直接使用Axes进行绘图的,凡是==函数名中已经明确显示了这个图的类型==(比如sns.scatterplot、sns.lineplot、sns.barplot),这种图都是使用Axes绘图的,Axes绘图可以直接使用之前matplotlib的一些方式设置图的元素

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset('tips')
fig,[ax1,ax2] = plt.subplots(2,1,figsize=(10,10))
sns.scatterplot(x="total_bill",y="tip",data=tips,ax=ax1)
sns.barplot(x="day",y="total_bill",data=tips,ax=ax2)

plt.tight_layout()
plt.savefig('31.png')
plt.show()

此图包含两个子图:

FacetGrid基本使用

先创建一个FacetGrid对象,然后再调用这个对象的map方法。其中map方法的==第一个参数是一个函数,后续map将调用这个函数来绘制图形。后面的参数就是传给这个函数的参数==

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips)
g.map(plt.scatter,"total_bill","tip")

其中==第一个参数==是可以绘制Axes图,并且可以接收color参数的函数。可取的值如下:

参数描述对应使用了FacetGrid函数
plt.plot/sns.lineplot绘制折线图sns.relplot(kind="line")
plt.hexbin绘制六边形图形sns.jointplot(kind="hex")
plt.hist绘制直方图sns.distplot
plt.scatter/sns.scatterplot绘制散点图sns.relplot(kind="scatter")
sns.stripplot绘制分类散点图sns.catplot(kind="strip")
sns.swarmplot绘制散开来的分类散点图sns.catplot(kind="swarm")
sns.boxplot绘制箱线图sns.catplot(kind="box")
sns.violinplot绘制小提琴图sns.catplot(kind="violin")
sns.pointplot绘制点线图sns.catplot(kind="point")
sns.barplot绘制条形图sns.catplot(kind="bar")
sns.countplot绘制数量柱状图sns.catplot(kind="count")
sns.regplot绘制带有回归线的散点图sns.lmplot

绘制多个图形

FacetGrid可以通过colrow参数,来在一个Figure上绘制多个图形,其中colrow都是数据集中的某个列的名字。只要指定这个名字,那么就会自动的按照指定列的值的个数绘制指定个数的图形

g = sns.FacetGrid(tips,col="day",col_wrap=2)
g.map(sns.regplot,"total_bill","tip")

添加颜色观察字段

通过添加hue参数来控制每个图中元素的颜色来观察其他的字段

g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")

可以通过hue_kws参数来添加hue散点的属性,比如设置散点的样式等

设置每个图形的尺寸

使用FacetGrid绘制出图形后,有时候我们想设置每个图形的尺寸或者是宽高比,那么我们可以通过在FacetGrid中设置heightaspect来实现,其中height表示的是每个图形的尺寸(默认是宽高一致),aspect表示的是宽度/高度的比例

g = sns.FacetGrid(tips,col="day",row="time",height=10,aspect=1.5)
g.map(sns.regplot,"total_bill","tip")

设置图例

默认情况下,不会添加图例,我们可以通过g.add_legend()来添加图例

g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")
g.add_legend()

![36](D:\PYTHON LOVE\seaborn\36.png)

另外还可以:

  1. 通过title来控制图例的标题。
  2. 通过label_order来控制图例元素的顺序
sns.set(rc={"font.sans-serif":"simhei"})
g3 = sns.FacetGrid(tips,col="day",hue="time")
g3.map(plt.scatter,"total_bill","tip")
new_labels = ['午餐','晚餐']
g3.add_legend(title="时间")
for t,l in zip(g3._legend.texts,new_labels):
    t.set_text(l)

设置标题

设置标题可以通过g.set_titles(template=None,row_template=None,col_template=None)来实现,这三个参数分别代表的意义如下:

  • template:给图设置标题,其中有{row_var}:绘制每行图像的名称{row_name}:绘制每行图像的值{col_var}:绘制每列图像的名称{col_name}:绘制每列图像的值这几个参数可以使用
  • col_template:给图像设置列的标题。其中有{col_var}以及{col_name}可以使用。
  • row_template:给图像设置行的标题。其中有{row_var}以及{row_name}可以使用。
g = sns.FacetGrid(tips,col="day",row="time")
g.map(sns.regplot,"total_bill","tip")
g.set_titles(template="时间{row_name}/星期{col_name}")

设置坐标轴

  • g.set_axis_labels(x_var,y_var):一次性设置xy的坐标的标题
  • g.set_xlabels(label):设置x轴的标题。
  • g.set_ylabels(label):设置y轴的标题。
  • g.set(xticks,yticks):设置xy轴的刻度。
  • g.set_xticklabels(labels):设置x轴的刻度文字。
  • g.set_yticklabels(labels):设置y轴的刻度文字。
g.set(xticks=range(0,60,10),xticklabels=['$0','$10','$20','$30','$40','$50'])

g.set

g.set方法可以对FacetGrid下的每个子图Axes设置属性。其中可以设置的参数完全是根据Axes的属性来的。比如可以设置每个Axesfacecolor

样式风格设置

seaborn绘图,比直接使用matplotlib绘图更加的美观。原因就是因为seaborn中已经将一些属性的样式进行了调整。我们可以直接使用,也可以修改他的样式

自带的样式

seaborn中自带了5种样式。分别是:

  1. white:纯白色的

     sns.set_style("white")
     axes = sns.scatterplot(x="total_bill",y="tip",data=tips)
    
    a449a14e14914728961d6b388e540ced.png
  2. whitegrid:带有网格的白色的

     sns.set_style("whitegrid")
     axes = sns.scatterplot(x="total_bill",y="tip",data=tips)
    
    f5ace29ac2e14180860634c423695ba8.png
  3. dark:灰色的

     sns.set_style("dark")
     axes = sns.scatterplot(x="total_bill",y="tip",data=tips)
    
    b5379a0fc4b94c38877d5254648a0f25.png
  4. darkgrid:带有网格的灰色的(网格线是白色的)

     sns.set_style("darkgrid")
     axes = sns.scatterplot(x="total_bill",y="tip",data=tips)
    
    31450e451b9145bfa1c3d235e93c536f.png
  5. ticks:白色的,并且在轴上带有刻度条的

     sns.set_style("ticks")
     axes = sns.scatterplot(x="total_bill",y="tip",data=tips)
    
    1a2bdced4c794faca3db8201a56f7d7f.png

风格设置函数

seaborn中,可以通过三个函数来设置样式。分别是sns.set_stylesns.axes_style以及sns.set方法

sns.axes_style

只能通过with语句调用

with sns.axes_style("dark",{"ytick.left":True}):
    sns.scatterplot(x="total_bill",y="tip",data=tips)

sns.set

除了style以外,还可以设置调色板,字体,字体大小,颜色等,也可以设置其他的matplotlib.rcParams可以接收的参数

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

sns.set(rc={"lines.linewidth":4})
fmri = sns.load_dataset("fmri")
sns.lineplot(x="timepoint",y="signal",data=fmri)

实例

附:seaborn绘制子图的方法

import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  #字体改为黑体,为了正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
tips = sns.load_dataset('tips',cache=True)
fig,axes=plt.subplots(2,2)

axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='box',hue="sex",split=True,ax=axes[0][0])
axe.set_title('中间为箱线图的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='quartile',hue="sex",split=True,ax=axes[0][1])
axe.set_title('中间为四分位数的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='point',hue="sex",split=True,ax=axes[1][0])
axe.set_title('中间为散点的小提琴图')
axe=sns.violinplot(x="day",y="total_bill",data=tips,inner='stick',hue="sex",split=True,ax=axes[1][1])
axe.set_title('中间为线条的小提琴图')

plt.suptitle("中间图形不同的4种小提琴图")
plt.tight_layout()
plt.savefig('14.png')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值