Seaborn
是一种基于matplotlib
的图形可视化python库。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。Seaborn
其实是在matplotlib
的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用Seaborn
就能做出很具有吸引力的图,而使用matplotlib
就能制作具有更多特色的图。应该把Seaborn
视为matplotlib
的补充,而不是替代物。同时它能高度兼容numpy
与pandas
数据结构以及scipy
与statsmodels
等统计模式。掌握Seaborn
能很大程度帮助我们更高效的观察数据与图表,并且更加深入了解它们。
其有如下特点:
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
def sinplot(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)
sinplot() #采用matplotlib绘制
sns.set() #采用seaborn默认设置
sinplot()
sns.set_style("darkgrid")
sinplot()
sns.set_style("whitegrid")
sinplot()
sns.set_style("dark")
sinplot()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agcVbXkK-1589899017301)(http://image.yigouai.cn/pandas_output_13_0.png)]
sns.set_style("white")
sinplot()
sns.set_style("ticks")
sinplot()
样式white
和ticks
都可以通过去除上方和右方不必要的轴线来得到改善. 而这些是不可能在matplotlib
里设置参数做到的,但是你可以调用seaborn的函数despine()
来去除轴线:
sns.set_style("ticks")
sinplot()
sns.despine() # 去除上面与右面轴线
有些布局也可以通过调整轴线距数据的偏移来改善,这也能在despine()里完成.当ticks不能覆盖轴线的整个范围时,trim参数可以限制显示的轴线的范围.
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2 # (20, 6) 二维数据
f, ax = plt.subplots()
sns.violinplot(data) # 琴形图
sns.despine(offset=10,trim=True)
你也可能通过设置另外的参数来控制移除哪条轴线:
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep") #箱型图
sns.despine(left=True) #去除左边的轴线
尽管来回切换样式是很简单的,但是你也可以在with
语句里用axes_style()
函数来临时设置控制布局的参数.这也允许你用不同的风格来制作图表,这是一种常见的编程模式,使得控制样式和风格能够多变。
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
如果你想要自定义seaborn
的样式,你可以用词典(dictionary
)将一系列控制参数赋值给axes_style()
函数和set_style()
函数的rc
参数里. 注意你只能通过这种方式重载样式定义的部分.(但是,更高级的set()
函数可以处理包含任意matplotlib
参数的词典)
如果你想要知道都包含了哪些参数,你可以调用没有参数的函数,它会返回当前设置:
sns.axes_style()
{'axes.axisbelow': True,
'axes.edgecolor': '.8',
'axes.facecolor': 'white',
'axes.grid': True,
'axes.labelcolor': '.15',
'axes.linewidth': 1.0,
'figure.facecolor': 'white',
'font.family': ['sans-serif'],
'font.sans-serif': ['Arial',
'DejaVu Sans',
'Liberation Sans',
'Bitstream Vera Sans',
'sans-serif'],
'grid.color': '.8',
'grid.linestyle': '-',
'image.cmap': 'rocket',
'legend.frameon': False,
'legend.numpoints': 1,
'legend.scatterpoints': 1,
'lines.solid_capstyle': 'round',
'text.color': '.15',
'xtick.color': '.15',
'xtick.direction': 'out',
'xtick.major.size': 0.0,
'xtick.minor.size': 0.0,
'ytick.color': '.15',
'ytick.direction': 'out',
'ytick.major.size': 0.0,
'ytick.minor.size': 0.0}
然后你可以设置这些参数的不同版本:
sns.set_style("darkgrid", {
"axes.facecolor": ".9"})
sinplot()
plotting_context()
和set_context()
设置布局元素的规模布局元素的规模被独立的参数集合控制,这能让你使用相同的代码得到不同大小的规模合适的布局
首先让我们重新调用set()
函数得到缺省设置:
sns.set()
有4种预设好的上下文(context),按相对大小排序分别是:paper
, notebook
, talk
,和poster
.缺省的规模是notebook
,上述的所有图表都是它.
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()
大部分你现在所稽首的样式函数都应该被转换成上下文函数.
你可以调用set_context()
,将上下文的名字当作一个参数传入,然后你就可以通过提供一个写有各项设置值的词典重载上下文的参数。
在修改上下文时,你也可以单独修改字体大小。(更高级的set()
里也可以这么做)
sns.set_context("notebook", font_scale=1.5, rc={
"lines.linewidth": 2.5})
sinplot()
配色是图表设计里最重要的方面之一,因为如果配色方案好,它可以清晰展现数据的模式和规律,否则就会把这些规律和模式隐藏起来。
Seaborn
让选择和使用配色方案变得简单且适用于你工作的数据种类和你想要达到的可视化目标。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(rc={
"figure.figsize": (6, 6)})
current_palette = sns.color_palette()
sns.palplot(current_palette)
6个默认的颜色循环主题: deep
, muted
, pastel
, bright
, dark
, colorblind
.
当你有六个以上的分类要区分时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会保持亮度和饱和度不变)。这是大多数的当他们需要使用比当前默认颜色循环中设置的颜色更多时的默认方案。
最常用的方法是使用hls
的颜色空间,这是RGB
值的一个简单转换。
sns.palplot(sns.color_palette("hls", 8))
#应用调色板
data = np.random.normal(size=(20, 8)) + np.arange(8) / 2 #生成数据
sns.boxplot(data=data,palette=sns.color_palette("hls", 8))#按照生成的颜色对应不同的分类
hls_palette()
函数来控制颜色的亮度和饱和
sns.palplot(sns.hls_palette(8, l=.7, s=.9))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNOmDHMZ-1589899017365)(http://image.yigouai.cn/pandas_output_47_0.png)]
sns.palplot(sns.color_palette("Paired",8))
xkcd
包含了一套众包努力的针对随机RGB
色的命名。产生了954个可以随时通过xdcd_rgb
字典中调用的命名颜色。
可以通过sns.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=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
[]
colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))
色彩随数据变换,比如数据越来越重要则颜色越来越深
sns.palplot(sns.color_palette("Blues"))
如果想要翻转渐变,可以在面板名称中添加一个_r后缀
sns.palplot(sns.color_palette("BuGn_r"))
cubehelix_palette()
调色板色调线性变换
sns.palplot(sns.color_palette("cubehelix", 8))
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
sns.palplot(sns.cubehelix_palette(8, start=1.75, rot=-.150))
light_palette()
和dark_palette()
调用定制连续调色板sns.palplot(sns.light_palette("green"))
sns.palplot(sns.dark_palette("purple"))
sns.palplot(sns.light_palette("navy", reverse=True)) #渐变翻转
#应用调色板
data = np.random.normal(size=(20, 8)) + np.arange(8) / 2 #生成数据
sns.boxplot(data=data,palette=sns.cubehelix_palette(8, start=.5, rot=-.75))#按照生成的颜色对应不同的分类
%matplotlib inline
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
sns.distplot()
函数画直方图x = np.random.normal(size=100)
sns.distplot(x,kde=False) #distplot()函数会根据输入数据自动绘制直方图
你也可以通过bins自己划分直方图的切分粒度
sns.distplot(x, bins=20, kde=False)
通过fit
查看数据分布的情况
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)
jointplot()
函数绘制散点图观测两个变量之间的分布关系最好用散点图
#生成数据
mean, cov = [0, 1], [(1, .5), (.5, 1)] #自定义均值与协方差
data = np.random.multivariate_normal(mean, cov, 200) #生成200个数据
df = pd.DataFrame(data, columns=["x", "y"]) #通过pandas读入数据
print(df.head())
x y
0 0.585042 1.162682
1 0.722117 2.141580
2 0.120990 0.498821
3 -0.795773 2.085261
4 -0.614260 2.215906
sns.jointplot(x="x", y="y", data=df)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CiJthrnE-1589899017442)(http://image.yigouai.cn/pandas_output_75_1.png)]
通过kind="hex"
使散点图具备透视性,更加容易查看数据的散点分布密度情况
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
sns.jointplot(x=x, y=y, kind="hex", color="k")
pairplot()
函数绘制关系图两不同变量比较绘制散点图,变量自身比较绘制直方图
iris = sns.load_dataset("iris") #载入鸢尾花数据集
sns.pairplot(iris) #绘制
%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") # 导入tips数据集
tips.head() #查看数据集
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
regplot()
绘制回归关系图#采用regplot绘制拟合的数据线
sns.regplot(x="total_bill", y="tip", data=tips) #x轴代表花的钱的数据,y轴对应给小费的数据
lmplot()
绘制回归关系图lmplot
是一种集合基础绘图与基于数据建立回归模型的绘图方法。旨在创建一个方便拟合数据集回归模型的绘图方法,利用hue
、col
、row
参数来控制绘图变量。
seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, col_wrap=None, size=5, aspect=1, markers='o', sharex=True, sharey=True, hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None)
参数说明:
#研究小费tips与总消费金额total_bill在吸烟与不吸烟人之间的关系
g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,palette="Set1")
#研究在不同星期下,消费总额与消费的回归关系
# col|hue控制子图不同的变量day,col_wrap控制每行子图数量,size控制子图高度
g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips, col_wrap=2, size=3)
pokemon=pd.read_csv('../dataset/Pokemon.csv') #载入宠物小精灵战斗力数据集
pokemon.head()
# | Name | Type 1 | Type 2 | Total | HP | Attack | Defense | Sp. Atk | Sp. Def | Speed | Generation | Legendary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Bulbasaur | Grass | Poison | 318 | 45 | 49 | 49 | 65 | 65 | 45 | 1 | False |
1 | 2 | Ivysaur | Grass | Poison | 405 | 60 | 62 | 63 | 80 | 80 | 60 | 1 | False |
2 | 3 | Venusaur | Grass | Poison | 525 | 80 | 82 | 83 | 100 | 100 | 80 | 1 | False |
3 | 3 | VenusaurMega Venusaur | Grass | Poison | 625 | 80 | 100 | 123 | 122 | 120 | 80 | 1 | False |
4 | 4 | Charmander | Fire | NaN | 309 | 39 | 52 | 43 | 60 | 50 | 65 | 1 | False |
#观察每一代攻击与防御的分布,利用二次多项式逼近
sns.lmplot(x="Defense", y="Attack",data=pokemon,col="Generation", hue="Generation",col_wrap=3, size=3,order=2)
#继续在同一图中观察不同代的sp.Atk,Sp.Def线性关系
sns.lmplot(x="Sp. Atk", y="Sp. Def", data=pokemon, hue='Generation', size=5,order=1)
%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(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
抖动抖动是平时可视化中的常用的观察“密度”的方法,除了使用参数抖动,特定的抖动需求也可以用numpy在数据上处理实现
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) # jitter抖动
swarmplot()
函数sns.swarmplot(x="day", y="total_bill", data=tips)
sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips) #hue 参数控制分组绘图
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。
如上图所示,标示了图中每条线表示的含义,其中应用到了分位值(数)的概念。
主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,还有一个异常值。
sns.boxplot(x="day", y="total_bill", hue="time", data=tips)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EoGJB6ZG-1589899017501)(http://image.yigouai.cn/pandas_output_108_1.png)]
seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100, width=0.8, inner='box', split=False, orient=None, linewidth=None, color=None, palette=None, saturation=0.75, ax=None, **kwargs)
sns.violinplot(x="total_bill", y="day", hue="time", data=tips)
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True) #split: bool, optional #琴形图是否从中间分开两部分
显示值的集中趋势可以用条形图
sns.barplot(x="sex", y="survived", hue="class", data=titanic)
点图可以更好的描述变化差异
sns.pointplot(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.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5)
factorplot()
函数是对各种图形的一个更高级别的API封装,在Seaborn中非常常用。
seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)
参数说明:
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips) #默认是点图
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar") #绘制条形图
sns.factorplot(x="day", y="total_bill", hue="smoker",
col="time", data=tips, kind="swarm") #绘制分散点图
sns.factorplot(x="time", y="total_bill", hue="smoker",
col="day", data=tips, kind="box", size=4, aspect=.5) #绘制箱型图
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np;
np.random.seed(0)
import seaborn as sns;
sns.set()
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annotkws=None, linewidths=0, linecolor='white', cbar=True, cbarkws=None, cbar_ax=None, square=False, ax=None, xticklabels=True, yticklabels=True, mask=None, **kwargs)
uniform_data = np.random.rand(3, 3) #生成数据
print (uniform_data)
heatmap = sns.heatmap(uniform_data) # 生成热力图
[[ 0.64272796 0.0229858 0.21897478]
[ 0.41076627 0.28860677 0.94805105]
[ 0.96513582 0.57781451 0.96400349]]
# 改变颜色映射的值范围
ax = sns.heatmap(uniform_data, vmin=0.2, vmax=1)
#为以0为中心的数据绘制一张热图
ax = sns.heatmap(uniform_data, center=0)
flights = sns.load_dataset("flights") #加载航班数据集
flights.head() #显示部分数据
year | month | passengers | |
---|---|---|---|
0 | 1949 | January | 112 |
1 | 1949 | February | 118 |
2 | 1949 | March | 132 |
3 | 1949 | April | 129 |
4 | 1949 | May | 121 |
flights = flights.pivot("month", "year", "passengers") #修改数据排列
flights.head()
year | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
month | ||||||||||||
January | 112 | 115 | 145 | 171 | 196 | 204 | 242 | 284 | 315 | 340 | 360 | 417 |
February | 118 | 126 | 150 | 180 | 196 | 188 | 233 | 277 | 301 | 318 | 342 | 391 |
March | 132 | 141 | 178 | 193 | 236 | 235 | 267 | 317 | 356 | 362 | 406 | 419 |
April | 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 |
ax = sns.heatmap(flights) #绘制热图
ax = sns.heatmap(flights, annot=True,fmt="d") #在heatmap中每个方格写入数据,按照整数形式
ax = sns.heatmap(flights, linewidths=.5) #热力图矩阵之间的间隔大小
ax = sns.heatmap(flights, cmap="YlGnBu") #修改热图颜色
ax = sns.heatmap(flights, cbar=False) #不显示热图图例
Style functions
Color palettes
Distribution plots
Categorical plots
Regression plots
Axis grid objects
10分钟python图表绘制