在使用可视化技术探索数据集特征时,最好有令人愉悦的绘图。 可视化对于向观众传达定量见解也至关重要,在这种情况下,更需要有能够吸引注意力并吸引观众的数字。
Matplotlib 是高度可定制的,但很难知道要调整哪些设置才能获得有吸引力的绘图。
Seaborn 带有许多自定义主题和一个高级界面,用于控制 matplotlib 图形的外观。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.__version__
'0.13.2'
让我们定义一个简单的函数来绘制一些偏移正弦波,这将有助于我们看到可以调整的不同风格参数。
def sinplot(n=10, flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, n + 1):
plt.plot(x, np.sin(x + i * .5) * (n + 2 - i) * flip)
这是 matplotlib 默认值的绘图:
sinplot()
要切换到 seaborn 默认值,只需调用set_theme()函数即可。
sns.set_theme()
sinplot()
注意 , 在seaborn 0.8之前的版本中,set_theme() 在导入时被调用。
在以后的版本中,必须显式调用它。
Seaborn 将 matplotlib 参数分成两个独立的组。第一组设定情节的美学风格,
第二组衡量人物的各种元素,使其容易融入不同的语境。
操作这些参数的接口是两对函数。要控制样式,请使用 axes_style() 和 set_style() 函数。
要缩放绘图,请使用 plotting_context() 和 set_context() 函数。
在这两种情况下,第一个函数返回一个参数字典,第二个函数设置 matplotlib 默认值。
Seaborn 风格主题
Seaborn 有五个预设的主题: darkgrid , whitegrid , dark , white , 和 ticks 。
它们都适合不同的应用和个人偏好。默认的主题是 darkgrid 。
网格可以对定量信息提供参考(对照),而浅灰色则避免网格线与绘制的线条冲突。
whitegrid 主题与那些拥有很多数据元素的图很像,但是它与这种图契合得更好。
sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data);
对于许多绘图(尤其是对于谈话等设置,主要希望使用数字来提供数据中模式的印象), 网格就不太必要了。
sns.set_style("dark")
sinplot()
sns.set_style("white")
sinplot()
有时可能想为绘图提供一些额外的结构,这就是 tick 派上用场的地方:
sns.set_style("ticks")
sinplot()
sinplot()
sns.despine()
当刻度没有覆盖整个轴的范围时, trim 参数将限制剩余刻度的范围。
f, ax = plt.subplots()
sns.violinplot(data=data)
sns.despine(offset=10, trim=True);
还可以通过对 despine() 的附加参数来控制哪些 spine 被移除:
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True)
f = plt.figure(figsize=(6, 6))
gs = f.add_gridspec(2, 2)
with sns.axes_style("darkgrid"):
ax = f.add_subplot(gs[0, 0])
sinplot(6)
with sns.axes_style("white"):
ax = f.add_subplot(gs[0, 1])
sinplot(6)
with sns.axes_style("ticks"):
ax = f.add_subplot(gs[1, 0])
sinplot(6)
with sns.axes_style("whitegrid"):
ax = f.add_subplot(gs[1, 1])
sinplot(6)
f.tight_layout()
如果想查看包含哪些参数,可以只调用不带参数的函数,这将返回当前设置:
sns.axes_style()
{'axes.facecolor': 'white',
'axes.edgecolor': '.8',
'axes.grid': True,
'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': <CapStyle.round: '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': False,
'xtick.top': False,
'ytick.left': False,
'ytick.right': False,
'axes.spines.left': True,
'axes.spines.bottom': True,
'axes.spines.right': True,
'axes.spines.top': True}
然后,可以设置这些参数的不同版本:
sns.set_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
sns.set_theme()
四种预设的背景,按相对大小排序,
分别是paper, notebook,talk, poster。在上面的图中使用的 notebook样式是默认的。
sns.set_context("paper")
sinplot()
sns.set_context("talk")
sinplot()
sns.set_context("poster")
sinplot()
现在所知道的关于样式函数的大部分知识应该转移到上下文函数中。
可以使用其中一个名称调用set_context()来设置参数,
并且可以通过提供一个参数值字典来覆盖这些参数。
还可以在更改上下文时独立缩放字体元素的大小。
(此选项也可通过顶级set()函数获得)。
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
类似地,可以临时控制嵌套在with语句下的图形的大小。
样式和上下文都可以用set()函数快速配置。
此函数还设置默认调色板,但这将在本教程的下一节中更详细地介绍。