各位同学好,今天和大家分享一下如何使用 seaborn 库进行数据可视化。在 matplotlib 的基础上进一步美化绘图。主要内容有:默认风格 sns.set(), 主题风格 sns.set_style(), 边框控制 sns.despine(), 局部图表风格 axes_style(), 绘图样式设置 sns.set_context()
1. 默认风格设置 sns.set()
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# matplot绘制正弦函数
x = np.linspace(0, 14, 100) # 在0-14之间取出100个点
# 绘制5条正弦线
plt.figure()
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 设置绘图画风组合,调用seaborn的模板库
plt.figure()
sns.set() # 使用seaborn默认的绘图风格
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
左图为原始曲线,右图为设置画风后的曲线
2. 主题风格 sns.set_style()
seaborn 库提供了五种绘图风格,分别是:darkgrid(灰色网格),whitegrid(白色网格),dark(深色),white(白色),ticks(刻度线段)
在绘图之前,先指定图像的主题风格,sns.set_style( 'darkgrid' ),如下。
plt.figure() # 新建画图板
sns.set_style('darkgrid') # 设置风格
data = np.random.normal(size=(20,6)) + np.arange(6)/2 # 自定义数据
sns.boxplot(data=data) # 绘制盒图
plt.title('darkgrid') # 设置标题
接下来绘制其他四种主题风格
fig = plt.figure(figsize=(10,8)) # 创建新画板
styleList = ['whitegrid', 'dark', 'white', 'ticks'] # 设置其他几种风格
# 循环绘制其他几种风格
for i, style in enumerate(styleList):
sns.set_style(style) # 先设置风格
plt.subplot(2,2,i+1) # 再指定当前图的位置
data = np.random.normal(size=(20,6)) + np.arange(6)/2 # 自定义数据
sns.boxplot(data=data) # 绘制盒图
plt.title(style) # 设置标题
fig.tight_layout() #自动调节布局重叠问题
3. 函数 despine() 控制边框
3.1 删除上侧和右侧边框 sns.despine()
设置绘图的主题风格为 ticks,即每个坐标轴都有刻度线段,如上图中的右下图。通过 sns.despine() 删除图像上的上侧和右侧的坐标轴线。
#(3)去除绘图框上边缘和右边缘的刻度线
plt.figure(figsize=(10,5)) # 新建画板
x = np.linspace(0, 14, 100) # 设置x轴,0-14之间取100个数
sns.set_style('ticks') # 设置绘图风格
# 绘制五条正弦曲线
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 删除上侧和右侧边缘线
sns.despine()
# 设置标题
plt.title('despine')
3.2 边框位移 sns.despine(offset, trim)
使用 sns.despine(offset, trim) 函数完成边框位移,其中参数: offset 代表x和y坐标轴偏移量; trim=False 代表坐标轴没有限制; trim=True 将坐标轴限制在数据最大最小值之间
如下,通过设置 sns.despine(offset=50, trim=True) ,使图像距离x轴和y轴的距离都是50,而x轴的坐标轴刻度范围是从0到14,y轴的坐标轴刻度范围是从-6到6
# 设置x轴刻度
x = np.linspace(0, 14, 100) # 在0-14之间取出100个点
fig = plt.figure() # 新建画图板
plt.subplot(2,1,1) # 绘图位置
# 移动坐标后的曲线
for i in range(5):
plt.plot(x, np.cos(x+i*0.5)*(7-i))
# 移动轴线
sns.despine(offset=50, trim=True) # 图像与x轴和y轴之间的距离
# 设置标题
plt.title('trim=True')
plt.subplot(2,1,2) # 绘图位置
# 移动坐标后的曲线
for i in range(5):
plt.plot(x, np.cos(x+i*0.5)*(7-i))
# 移动轴线
sns.despine(offset=50) # 图像与x轴和y轴之间的距离
# 设置标题
plt.title('trim=False')
fig.tight_layout() #轻量化布局
3.3 自定义隐藏边框 sns.despine(right, left, top, bottom)
使用 sns.despine() 默认参数可以隐藏图像的上侧和右侧的边缘框,如果想自定义隐藏边界框,可以设置参数,sns.despine(right=True, left=False, top=True, bottom=False) 同样能实现隐藏上侧和右侧边界框。
sns.set_style('ticks') # 设置风格
data = np.random.normal(size=(20,6)) + np.arange(6)/2 # 自定义数据
plt.figure() # 绘制原始图
sns.boxplot(data=data) # 绘制盒图
plt.title('origin') # 设置标题
plt.figure() # 绘制原始图
sns.boxplot(data=data) # 绘制盒图
sns.despine(right=True, left=True, top=False, bottom=False) # 隐藏上边缘和左边缘的刻度线
plt.title('despined') # 设置标题
第一张为风格为ticks的原图,第二张为隐藏左侧和右侧边框后的图
4. 局部图表风格 axes_style()
axes_style() 设置局部图表风格,和 with 函数配合的用法,在当前 with 域中使用指定的图像的风格,在 with 域外可以使用其他风格。
如下,以 with 域作为分隔,with域内的绘图使用 'darkgrid' 风格,而 with 域外的绘图使用 'whitegrid' 的风格。
fig = plt.figure() # 新建画板
x = np.linspace(0, 14, 100) # 设置x轴刻度
# 使用with打开一种风格,在with里面执行的都是该风格
with sns.axes_style('darkgrid'): # 指定风格
plt.subplot(2,1,1) # 绘图位置
# 绘制正弦曲线
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 设置标题
plt.title('darkgrid')
# with域外部绘图就是另外一种风格
sns.axes_style('whitegrid')
plt.subplot(2,1,2) # 绘图位置
# 绘制正弦曲线
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 设置标题
plt.title('darkgrid')
fig.tight_layout() #轻量化布局
5. 绘图样式设置 sns.set_context()
如果想要定制 seanborn 的样式,可以将参数字典传递给 axes_style() 和 set_style() 的 rc 参数。通过 sns.axes_style() 查看当前绘图的格式参数设置。
sns.axes_style()
# 返回结果
'''
{'axes.facecolor': 'white',
'axes.edgecolor': '.15',
'axes.grid': False,
'axes.axisbelow': True,
'axes.labelcolor': '.15',
'figure.facecolor': 'white',
'grid.color': '.8',
'grid.linestyle': '-',
'text.color': '.15',
'xtick.color': '.15',
'ytick.color': '.15',
'xtick.direction': 'out',
'ytick.direction': 'out',
'lines.solid_capstyle': 'round',
'patch.edgecolor': 'w',
'patch.force_edgecolor': True,
'image.cmap': 'rocket',
'font.family': ['sans-serif'],
'font.sans-serif': ['Arial',
'DejaVu Sans',
'Liberation Sans',
'Bitstream Vera Sans',
'sans-serif'],
'xtick.bottom': True,
'xtick.top': False,
'ytick.left': True,
'ytick.right': False,
'axes.spines.left': True,
'axes.spines.bottom': True,
'axes.spines.right': True,
'axes.spines.top': True}
'''
接下来就可以根据自己的需要来修改这些绘图样式参数。
sns.set_context(context, font_scale=1, rc=None)
其中,context 代表图像大小,选项有 [ 'paper', 'talk', 'poster', 'notebook' ];font_scale 代表字体大小; rc 代表绘图样式参数。
plt.figure() # 创建画板
x = np.linspace(0, 14, 100) # 在0-14之间取出100个点
# 设置布局格式, 字体大小, 线条粗细
sns.set_context('paper')
# 绘制正弦曲线
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 设置标题
plt.title('original paper style')
# 在paper风格基础上编辑
plt.figure() # 创建画板
# 设置布局格式, 字体大小, 线条粗细
sns.set_context('paper', font_scale=3, rc={'lines.linewidth':3})
# 绘制正弦曲线
for i in range(5):
plt.plot(x, np.sin(x+i*0.5)*(7-i))
# 设置标题
plt.title('changed paper style')
左图为原图正弦曲线,右图为更改样式后的曲线