第一章:控制图表样式
本系列笔记是基于seaborn0.8.1版本说明文档进行的翻译。Matplotlib具有高度的可定制性,但很难知道需要调整哪些参数才能实现我们所希望看到的效果。 Seaborn带有一些定制的主题和一个控制matplotlib数字外观的高级界面。
%matplotlib inline
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(sum(map(ord, "aesthetics")))
让我们定义一个简单函数来绘制一些偏移正弦波,这将帮助我们看到我们可以调整的不同风格参数。
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)
这是matplotlib默认情况下的图形效果:
sinplot()
要切换到seaborn默认值,只需调用set()函数。
sns.set()
sinplot()
(请注意,在0.8后的seaborn版本中,set()必须被显式调用)
Seaborn将matplotlib参数分成两个独立的组。第一组设定图形的艺术风格,第二组设置图形的各种参数,以便它可以很容易地组合成不同风格的图形。
操作这些参数的接口是两对函数。 要控制样式,请使用axes_style()和set_style()函数。 要扩展绘图,请使用plotting_context()和set_context()函数。 在这两种情况下,第一个函数返回一个参数字典,第二个函数设置matplotlib默认值。
Seaborn图形样式
darkgrid
,
whitegrid
,
dark
,
white
, and
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()

有时候你可能想要给这些图像增加一些额外的结构,这就是ticks派上用场的地方:
sns.set_style("ticks")
sinplot()

移除轴样式
white和ticks风格都可以从移除顶部和右边坐标轴中受益,通过matplotlib参数来做到这一点是不可能的,但是你可以调用seaborn函数despine()去除它们:
sinplot()
sns.despine()
一些图的边框可以通过数据移位,当然调用despine()也能做同样的事。当边框没有覆盖整个数据轴的范围的时候,trim参数会限制留存的边框范围。
f, ax = plt.subplots()
sns.violinplot(data=data)
sns.despine(offset=10, trim=True);# offset 两坐标轴离开距离;
你也可以通过往despine()中添加参数去控制边框
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True)
despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
从plot()函数中移除顶部或右边的边框
临时设定图形样式
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)

重写seaborn风格的元素
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() 调整绘图元素
首先,可以通过sns.set()重置参数。
sns.set()
四种预设,按相对尺寸的顺序(线条越来越粗),分别是paper,notebook, talk, and poster。notebook的样式是默认的,上面的绘图都是使用默认的notebook预设。
sns.set_context("paper")
sinplot()

sns.set_context("talk")
sinplot()

sns.set_context("poster")
sinplot()

大多数你现在知道的样式函数应该转换到context函数。
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()

类似地(尽管它可能用处不大),也可以使用with嵌套语句进行临时的设置。
样式和上下文都可以用set()函数快速地进行配置。这个函数还设置了默认的颜色选项,在下一节将详细介绍这一功能。