[关闭]
@TangWill 2020-02-28T19:21:47.000000Z 字数 3354 阅读 920

python数据可视化之Seaborn —— 绘图风格

python


Seaborn其实就是在matplotlib的基础上进行的高级封装,调用一些封装好了的图形设置。但其设计的灵活性不如matplotlib,因此Seaborn可以说是能够锦上添花的有利工具。


1、绘图风格

为了对绘图的美观程度进行改善,我们可以进行一些通用性设置,首先我们引入一个例子来看一看,matplotlib绘图与seaborn绘图的区别。这里使用matplotlib里ListedColormap()函数进行调色,具体调色名称可见最后参考文献中。我们定义了一组同心圆,下面我们来看看不用的绘图风格下,图形是什么样子的。

  1. #载入包
  2. import numpy as np
  3. import matplotlib as mpl
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. from matplotlib.colors import ListedColormap
  7. np.random.seed(42)
  8. #导入数据函数
  9. def explot():
  10. color = ['Sienna','Coral','Crimson','GoldEnrod','ForestGreen']
  11. x = y = np.arange(-3, 3, 0.1)
  12. x, y = np.meshgrid(x,y)
  13. for i in range(1,5):
  14. cmap = ListedColormap(color[i])
  15. plt.contour(x, y, x**2 + y**2, [i], cmap=cmap)#x**2 + y**2 = i的圆形
  16. plt.axis('scaled')
  17. plt.show()

matplotlib默认参数下绘制的结果如下:

  1. explot()

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

  1. sns.set()
  2. explot()

Seaborn包含两组独立的参数组合,分别是风格控制和图形缩放两种方法:


2、Seaborn风格控制

在seaborn中有五种风格可以进行切换,分别是:tickswhitedarkwhitegriddarkgrid,其中darkgrid是默认参数。下面来做几张图看看其中的模样。

写一个 函数并用Matplotlib表示出来

  1. def sinplot(flip = 1):
  2. x = np.linspace(0, 14, 100)
  3. for i in range(1, 7):
  4. plt.plot(x, np.sin(x + i * 0.5) * (7 - i) * flip)

darkgrid

  1. #darkgrid
  2. sns.set_style('darkgrid')
  3. sinplot()
  4. plt.show()

whitegrid

  1. #whitegrid
  2. sns.set_style('whitegrid')
  3. sinplot()
  4. plt.show()

dark

  1. #dark
  2. sns.set_style('dark')
  3. sinplot()
  4. plt.show()

white

  1. #white
  2. sns.set_style('white')
  3. sinplot()
  4. plt.show()

ticks

  1. #ticks(有刻度)
  2. sns.set_style('ticks')
  3. sinplot()
  4. plt.show()

3、对轴进行修改

在matplotlib的参数中无法移除图像顶部和右边不必要的轴,于是可以通过Seaborn的despine()方法进行移除。

  1. plt.figure(figsize=(20, 5))
  2. x = np.linspace(0, 14, 100)
  3. plt.subplot(121)
  4. for i in range(1, 7):
  5. plt.plot(x, np.sin(x + i * .5) * (7 - i) * 1)
  6. sns.despine()
  7. plt.subplot(122)
  8. for i in range(1, 7):
  9. plt.plot(x, np.sin(x + i * .5) * (7 - i) * 1)
  10. plt.show()

左边是移除了轴脊柱的图像、右边是原matplotlib的图像。也可以使用despine()方法中的trim参数来限制轴的范围,也可以通过调整控制哪个脊柱被移除。

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

4、临时切换风格

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

5、更改seaborn风格参数

当然还可以根据自己喜好来修改axes_style()和set_style()的参数,这里需要传递的是一个字典参数,我们可以看看axes_style()里有哪些字典参数,

  1. print(sns.axes_style())
  1. {'axes.facecolor': 'white',
  2. 'axes.edgecolor': '.15',
  3. 'axes.grid': False,
  4. 'axes.axisbelow': True,
  5. 'axes.labelcolor': '.15',
  6. 'figure.facecolor': 'white',
  7. 'grid.color': '.8',
  8. 'grid.linestyle': '-',
  9. 'text.color': '.15',
  10. 'xtick.color': '.15',
  11. 'ytick.color': '.15',
  12. 'xtick.direction': 'out',
  13. 'ytick.direction': 'out',
  14. 'lines.solid_capstyle': 'round',
  15. 'patch.edgecolor': 'w',
  16. 'image.cmap': 'rocket',
  17. 'font.family': ['sans-serif'],
  18. 'font.sans-serif': ['Arial',
  19. 'DejaVu Sans',
  20. 'Liberation Sans',
  21. 'Bitstream Vera Sans',
  22. 'sans-serif'],
  23. 'patch.force_edgecolor': True,
  24. 'xtick.bottom': True,
  25. 'xtick.top': False,
  26. 'ytick.left': True,
  27. 'ytick.right': False,
  28. 'axes.spines.left': True,
  29. 'axes.spines.bottom': True,
  30. 'axes.spines.right': True,
  31. 'axes.spines.top': True}

于是就可以设置自己想要的参数

  1. sns.set_style('white', {"axes.facecolor": ".7"})
  2. x = np.linspace(0, 1, 100)
  3. for i in range(1, 7):
  4. plt.plot(x, np.cos(x + i * .5) * (7 - i) * 0.1 + np.random.random(1))
  5. plt.show()

6、图形缩放

在四个预置环境中,papernotebooktalkposter按大小从小到大依次排列,其中,notebook是默认的。

  1. sns.set()
  2. list = ['paper', 'notebook', 'talk', 'poster']
  3. plt.figure(figsize=(15, 15))
  4. x = np.linspace(0, 1, 100)
  5. for k in range(0, 4):
  6. s = '22' + str(k + 1)
  7. plt.subplot(int(s))
  8. tmp = list[k]
  9. with sns.plotting_context(tmp):
  10. for i in range(1, 7):
  11. plt.plot(x, np.cos(x + i * .5) * (7 - i) * 0.1)
  12. plt.xlabel(list[k])
  13. plt.show()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注