@TangWill
2020-02-28T11:21:47.000000Z
字数 3354
阅读 1235
python
Seaborn其实就是在matplotlib的基础上进行的高级封装,调用一些封装好了的图形设置。但其设计的灵活性不如matplotlib,因此Seaborn可以说是能够锦上添花的有利工具。
为了对绘图的美观程度进行改善,我们可以进行一些通用性设置,首先我们引入一个例子来看一看,matplotlib绘图与seaborn绘图的区别。这里使用matplotlib里ListedColormap()函数进行调色,具体调色名称可见最后参考文献中。我们定义了一组同心圆,下面我们来看看不用的绘图风格下,图形是什么样子的。
#载入包import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snsfrom matplotlib.colors import ListedColormapnp.random.seed(42)#导入数据函数def explot():color = ['Sienna','Coral','Crimson','GoldEnrod','ForestGreen']x = y = np.arange(-3, 3, 0.1)x, y = np.meshgrid(x,y)for i in range(1,5):cmap = ListedColormap(color[i])plt.contour(x, y, x**2 + y**2, [i], cmap=cmap)#x**2 + y**2 = i的圆形plt.axis('scaled')plt.show()
matplotlib默认参数下绘制的结果如下:
explot()

而使用sns的方法是可以用sns.set()进行简单的设置,输出图片如下,
sns.set()explot()

Seaborn包含两组独立的参数组合,分别是风格控制和图形缩放两种方法:
在seaborn中有五种风格可以进行切换,分别是:ticks,white,dark,whitegrid,darkgrid,其中darkgrid是默认参数。下面来做几张图看看其中的模样。
写一个 函数并用Matplotlib表示出来
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)
darkgrid
#darkgridsns.set_style('darkgrid')sinplot()plt.show()

whitegrid
#whitegridsns.set_style('whitegrid')sinplot()plt.show()

dark
#darksns.set_style('dark')sinplot()plt.show()

white
#whitesns.set_style('white')sinplot()plt.show()

ticks
#ticks(有刻度)sns.set_style('ticks')sinplot()plt.show()

在matplotlib的参数中无法移除图像顶部和右边不必要的轴,于是可以通过Seaborn的despine()方法进行移除。
plt.figure(figsize=(20, 5))x = np.linspace(0, 14, 100)plt.subplot(121)for i in range(1, 7):plt.plot(x, np.sin(x + i * .5) * (7 - i) * 1)sns.despine()plt.subplot(122)for i in range(1, 7):plt.plot(x, np.sin(x + i * .5) * (7 - i) * 1)plt.show()

左边是移除了轴脊柱的图像、右边是原matplotlib的图像。也可以使用despine()方法中的trim参数来限制轴的范围,也可以通过调整控制哪个脊柱被移除。
sns.set_style("ticks")sinplot()sns.despine(offset=10, trim=True)plt.show()

sns.set_style("ticks")sinplot()sns.despine(offset=10, trim=True, left=True, bottom=True)plt.show()

plt.figure(figsize=(5, 5))with sns.axes_style("darkgrid"):explot()plt.figure(figsize=(5, 5))explot()


当然还可以根据自己喜好来修改axes_style()和set_style()的参数,这里需要传递的是一个字典参数,我们可以看看axes_style()里有哪些字典参数,
print(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','image.cmap': 'rocket','font.family': ['sans-serif'],'font.sans-serif': ['Arial','DejaVu Sans','Liberation Sans','Bitstream Vera Sans','sans-serif'],'patch.force_edgecolor': True,'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_style('white', {"axes.facecolor": ".7"})x = np.linspace(0, 1, 100)for i in range(1, 7):plt.plot(x, np.cos(x + i * .5) * (7 - i) * 0.1 + np.random.random(1))plt.show()

在四个预置环境中,paper、notebook、talk、poster按大小从小到大依次排列,其中,notebook是默认的。
sns.set()list = ['paper', 'notebook', 'talk', 'poster']plt.figure(figsize=(15, 15))x = np.linspace(0, 1, 100)for k in range(0, 4):s = '22' + str(k + 1)plt.subplot(int(s))tmp = list[k]with sns.plotting_context(tmp):for i in range(1, 7):plt.plot(x, np.cos(x + i * .5) * (7 - i) * 0.1)plt.xlabel(list[k])plt.show()
