什么是Seaborn
Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。
seaborn API
Seaborn 要求原始数据的输入类型为 pandas 的 Dataframe 或 Numpy 数组,画图函数有以下几种形式:
sns.图名(x=‘X轴 列名’, y=‘Y轴 列名’, data=原始数据df对象)
sns.图名(x=‘X轴 列名’, y=‘Y轴 列名’, hue=‘分组绘图参数’, data=原始数据df对象)
sns.图名(x=np.array, y=np.array[, …])
整体风格设置
对图表整体颜色、比例等进行风格设置,包括颜色色板等
调用系统风格进行数据可视化
set() / set_style() / axes_style() / set_context()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set() 设置样式参数
seaborn.set(context =‘notebook’,style =‘darkgrid’,palette =‘deep’,font =‘sans-serif’,font_scale = 1,color_codes = True,rc = None)
# 创建正弦函数及图表
def sinplot(flip=1):
x = np.linspace(0,14,100)
for i in range(1,7):
plt.plot(x, np.sin(x+i*0.5)*(7-i)*flip)
sinplot()
sns.set() # 暗格显示
sinplot()
plt.grid(linestyle = '--')
set_style() 设置图标风格
seaborn.set_style(style = None,rc = None )
# set_style()
# 切换seaborn图表风格
# 风格选择包括:"white", "dark", "whitegrid", "darkgrid", "ticks"
# rc:dict,可选,参数映射以覆盖预设的seaborn样式字典中的值
fig = plt.figure(figsize=(6,6))
ax1 = fig.add_subplot(2,1,1)
sns.set_style("whitegrid")
data = np.random.normal(size=(20,6)) + np.arange(6)/2
sns.boxplot(data=data)
plt.title('style - whitegrid')
ax2 = fig.add_subplot(2,1,2)
#sns.set_style("dark")
sinplot() # 子图显示
sns.despine() 设置坐标轴
'''
despine()
设置图表坐标轴
seaborn.despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
'''
# 设置风格
sns.set_style("ticks")
# 创建图表
fig= plt.figure(figsize=(6,9))
plt.subplots_adjust(hspace=0.3) # 调整子图间距
ax1= fig.add_subplot(3,1,1)
sinplot()
sns.despine() # 默认删除上、右坐标轴
ax2 = fig.add_subplot(3,1,2)
sns.violinplot(data=data)
#sns.despine(offset=10,trim=True) # offset: 与坐标轴之间的偏移,trim: 为True时,将坐标轴限制在数据最大最小值
ax3 = fig.add_subplot(3,1,3)
sns.boxplot(data=data, palette="deep")
# sns.despine(left=True, right=False) # top, right, left, bottom: 布尔型,为True时不显示
sns.axes_style() 设置子图风格
# axes_style()
# 设置局部图表风格,可学习和with配合的用法
# 设置局部图表风格,用with做代码块区分
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
# 外部表格风格
sns.set_style("whitegrid")
plt.subplot(212)
sinplot()
设置显示比例尺度 set_context()
# set_context()
# 设置显示比例尺度
# 选择包括: "paper", "notebook", "talk", "poster"
#默认为notebook
sns.set_context("talk")
sinplot()
图标颜色设置 color_palette()
sns.color_palette(palette=None, n_colors=None, desat=None)
我们选择颜色常常依据数据特征来选择,所以下面就从
分类:彼此间差异较大
连续:颜色按照顺序渐变
发散:中间颜色浅,两端颜色深
三个调色板来讲解color_palette()函数
分类调色板
当你不用区分离散数据的顺序时,建议使用分类调色板
# 默认6种颜色:deep, muted, pastel, bright, dark, colorblind
# n_colors:int,调色板中的颜色数量
# dasat:float,去饱和度0-1之间
current_palette = sns.color_palette()
sns.palplot(current_palette)
# 当不带参数的调用将返回当前默认颜色循环中的所有颜色
# 可以传入任何matplotlib支持的颜色
圆形调色系统
当需要6种以上的颜色时,可以在圆形颜色空间中按均匀间隔画出颜色。
最常见的是使用hls颜色空间。
sns.palplot(sns.color_palette('hls',8))
# 颜色色块个数为8个
data = np.random.normal(size=(10, 8)) + np.arange(8) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls", 8))
plt.show()
HLS色调空间:hls_palette([n_colors, h, l, s])
HUSL色调空间:husl_palette([n_colors, h, l, s])
# 设置亮度,饱和度
# h - 第一个色调
# l - 亮度
# s - 饱和度
sns.palplot(sns.husl_palette(8, l=.6, s=.7))
# 这个看上去更舒服,更易区分
使用分类Color Brewer调色板
另一个分类色板来源于Color Brewer(同样也具有连续色板和发散色板),它也同样存在于matplotlib colormaps中,但是并没有得到很好的处理。在Seaborn中,当你调用Color Brewer分类色板时,你总能得到离散的颜色,但是这意味着它们在某一点开始了循环。
# Color Brewer颜色设置
sns.palplot(sns.color_palette("Paired",8))
sns.palplot(sns.color_palette("Set1",10))
使用xkcd颜色测量中的命名颜色
xkcd包含了一系列命名RGB颜色。共954种颜色,您现在可以使用xkcd_rgb字典在seaborn中引用它们:
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)
顺序调色板
当数据范围从相对较低或不感兴趣的值到相对较高或有趣的值时,可以使用连续(顺序)调色板,在kdeplot()和heatmap()函数中常常会用到。
具有大色调偏移的色彩图往往会引入数据中不存在的不连续性,并且我们的视觉系统无法自然地将彩虹映射到诸如“高”或“低”的定量区别。结果是这些可视化最终更像是一个谜题,它们模糊了数据中的模式而不是揭示它们
所以对于顺序数据,最好使用色调最多相对微妙偏移的调色板,伴随着亮度和饱和度的大幅度变化。这种方法自然会吸引人们关注数据的相对重要部分
sns.palplot(sns.color_palette("Blues"))
sns.palplot(sns.color_palette("Blues_r"))
# 与matplotlib中一样,如果您希望反转亮度渐变,则可以为_r调色板名称添加后缀
# 不是所有颜色都可以反转!!!
顺序 cubehelix 调色板
cubehelix调色板系统既能亮度线性变化同时也能色调变化的线性色板。这意味着当转换为黑白(用于打印)或由色盲个人查看时,色彩映射中的信息将被保留。
seaborn.cubehelix_palette(n_colors = 6,start = 0,rot = 0.4,gamma = 1.0,hue = 0.8,light = 0.85,dark = 0.15,reverse = False,as_cmap = False )
# 按照线性增长计算,设置颜色
sns.palplot(sns.color_palette("cubehelix", 8))
sns.palplot(sns.cubehelix_palette(8, gamma=2))
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))
# n_colors → 颜色个数
# start → 值区间在[0,3],开始颜色
# rot → float,颜色旋转角度,可能是(-1,1)之间
# gamma → 颜色伽马值,>1 较亮,<1 较暗
# dark,light → 值区间0-1,颜色深浅
# reverse → 布尔值,默认为False,由浅到深
自定义顺序调色板
对于自定义顺序调色板的简单界面,您可以使用light_palette()或使用dark_palette(),都是由单一的颜色并生成从浅色或深色去饱和值到该颜色的渐变调色板。这些函数还伴随着启动交互式小部件以创建这些调色板的功能
seaborn.light_palette(color,n_colors = 6,reverse = False,as_cmap = False,input =‘rgb’ )
# color: 十六进制代码,html颜色名称或input空间中的元组
# input: {'rgb','hls','husl',xkcd'}
# 用于解释输入颜色的颜色空间。前三个选项适用于元组输入,后者适用于字符串输入
sns.palplot(sns.light_palette("green"))# 按照green做浅色调色盘
sns.palplot(sns.dark_palette('green', reverse=True))# 按照green做深色调色盘
sns.palplot(sns.light_palette((260, 75, 60), input="husl"))
sns.palplot(sns.dark_palette("muted purple", input="xkcd"))
发散的调色板
第三类调色板称为“发散”。这些用于大低值和高值都很有趣的数据。数据中通常还有明确定义的中点。例如,如果要绘制某个基线时间点的温度变化,最好使用偏差色图来显示相对减少的区域和相对增加的区域。
同样重要的是要强调使用红色和绿色应该避免,因为大量潜在的观众将无法区分它们
seaborn.diverging_palette(h_neg, h_pos, s=75, l=50, sep=10, n=6, center=‘light’, as_cmap=False)
# 创建分散颜色
# h_neg, h_pos → 起始/终止颜色值
# s → 值区间0-100,饱和度
# l → 值区间0-100,亮度
# n → 颜色个数
# center → 中心颜色为浅色还是深色“light”,“dark”,默认为light
# Color Brewer库带有一组精心挑选的发散色图
sns.palplot(sns.color_palette("BrBG", 7))
# 当然可以自己定制
sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))
plt.figure(figsize = (8,6))
x = np.arange(16).reshape(4, 4)
cmap = sns.diverging_palette(200, 20, sep=16, as_cmap=True)
sns.heatmap(x, cmap=cmap)
选择调色板 choose_colorbrewer_palette()
您可以使用该choose_colorbrewer_palette()函数来播放各种颜色选项,如果希望返回值是可以传递给seaborn或matplotlib函数的colormap对象,则可以将as_cmap参数设置为True
seaborn.choose_colorbrewer_palette(data_type, as_cmap=False)
sns.choose_colorbrewer_palette('q')
# sequential:顺序,可以用 s 来代替
# diverging:发散, 可以用 d 来代替
# qualitative:分类, 可以用 q 来代替
# Color Brewer的颜色图:
# Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu,
# BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys,
#Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r,
# Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn,
#PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples,
# Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r,
# Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3,
# Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr,
# YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r,
# autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cool, cool_r,
# coolwarm, coolwarm_r, copper, copper_r, cubehelix,
# cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat,
# gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow,
# gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2,
# gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv,
# hsv_r, icefire, icefire_r, inferno, inferno_r, jet, jet_r, magma, magma_r, mako,
# mako_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r,
# pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, rocket, rocket_r,
# seismic, seismic_r, spectral, spectral_r, spring,
# spring_r, summer, summer_r, terrain, terrain_r, viridis, viridis_r, vlag, vlag_r, winter, winter_r
设置默认的调色板
类似于color_palette()。set_palette()接受相同的参数,但它会更改默认的matplotlib参数,以便将调色板应用于所有绘图。
# 设置调色板后,绘图创建图表
sns.set_style("whitegrid")
fig = plt.figure(figsize=(8,6))
# 设置风格
with sns.color_palette("PuBuGn_d"):
plt.subplot(211)
sinplot()
sns.set_palette("husl")
plt.subplot(212)
sinplot()
# 绘制系列颜色