文章原创,最近更新:2018-05-10
1.Seaborn的介绍
2.整体布局风格设置
3.风格细节设置
课程来源: python数据分析与机器学习实战-唐宇迪
学习参考链接:
1、Seaborn(sns)官方文档学习笔记(第一章 艺术化的图表控制)
2、Seaborn官方0.8.1版本
1.Seaborn的介绍
1.1Seaborn的基本了解
Seaborn作为一个带着定制主题和高级界面控制的Matplotlib扩展包,能让绘图变得更轻松.
Matplotlib即便是非常简单的流程,都要好几行的代码,很多人都希望对于统计的图,在Matplotlib上进行封装,调用模版就可以传数据,就可以把图画出来.然而Seaborn就为了我们做这样的事.
Seaborn在Matplotlib进行了封装,底层还是Matplotlib,区分就是提供了非常丰富的模版,在绘图的时候,比如条形图/柱形图/折线图等都提供了模版,只需要提供很简单的1-2行代码就可以完成这样的任务.
1.2Seaborn的安装
在cmd输入:pip install seaborn
2.整体布局风格设置
本部分主要介绍seaborn是如何对matplotlib输出的外观进行控制的。
2.1传统的matplotlib和seaborn的不同
定义一个含偏移的正弦图像,来比较传统的matplotlib和seaborn的不同:
第一段代码涉及到的知识点:
1)numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)[source]
- start是采样的起始点
- stop是采样的终点
- num是采样的点个数
例如:a=np.linspace(-1,1,num=5)
输出如下:
[-1. -0.5 0. 0.5 1. ]
第二段代码涉及到的知识点:
2)sns.set()
要切换到seaborn默认值,只需调用该.set()函数即可。
传统的matplotlib,完整的代码如下:
import numpy as np
import matplotlib.pyplot as plt
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)
sinplot()
输出的结果如下:
seaborn完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set()
sinplot()
输出的结果如下:
传统的matplotlib和seaborn的区别:
seaborn默认的灰色网格底色灵感来源于matplotlib却更加柔和。大多数情况下,图应优于表。seaborn的默认灰色网格底色避免了刺目的干扰,对于多个方面的图形尤其有用,是一些更复杂的工具的核心。
2.2seaborn 5种主题风格
有5个seaborn的主题,适用于不同的应用和人群偏好:
- darkgrid 黑色网格(默认)
- whitegrid 白色网格
- dark 黑色背景
- white 白色背景
- ticks 应该是四周都有刻度线的白背景.
现在看一下这五种主题风格画完之后长什么样子的?
2.2.1whitegrid 白色网格
这里涉及到的知识点:
1)set_style()函数
- 为了控制样式,使用set_style()函数,参数就是5个seaborn的主题。
2)np.random.normal()函数
np.random.normal(mean,stdev,size)
参数的意义为:
- mean:float,概率分布的均值,对应着整个分布的中心center
- stdev:float,概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高
-
size:int or tuple of ints,输出的shape,默认为None,只输出一个值
我们更经常会用到np.random.randn(size)所谓标准正太分布(μ=0, σ=1),对应于np.random.normal(mean=0, stdev=1, size)
完整的代码如下
import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data)
输出的结果如下:
从输出的结果来看,背景是白色的,竖的刻度都有横条,可以知道绘制图像对应的刻度,这就是whitegrid风格,比较常用的一种风格.
2.2.2 dark 黑色背景
对于许多场景,(特别是对于像对话这样的设置,您主要想使用图形来提供数据模式的印象),网格就不那么必要了
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("dark")
sinplot()
输出的结果如下:
从输出的结果可以看出,背景是深色的,刻度没有横线.
2.2.3 white 白色背景
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("white")
sinplot()
输出的结果如下:
从输出的结果可以看出,背景是白色的,刻度没有横线.
2.2.4 ticks
从white主题输出的结果可以看出,x,y轴对应的只有一条线,线上是没有刻度的,有时候为了使制图后看数据更加精确一下,需要加上刻度,这就是ticks风格.
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("ticks")
sinplot()
输出的结果如下:
从输出的结果可以看出,ticks风格是x,y轴线都有刻度.
2.2.5其他
当我们想用这些风格的时候,也可以指定一些其他的参数.
比如ticks风格的绘图中,去掉上方和右方的线,可以用以下代码表示:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("ticks")
sinplot()
sns.despine()
输出的结果如下:
从图片来看,上方和右方的线去掉了,我们可以根据风格主题,再定制主题.
这里涉及的知识点:
1)sns.despine()
seaborn中通过despine()函数轻松删除上方和右方的边框.
3.风格细节设置
3.1边框移位
当我们指定画风的时候,可以指定画图与轴线之间的位置关系.
可以设置sns.despine()中的参数offset,就可以指定画图与轴线之间的距离.
当设置画图与轴线之间的距离为10,完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set_style("ticks")
data=np.random.normal(size=(20,6))+np.arange(6)/2
f,ax=plt.subplots()
sns.violinplot(data)
sns.despine(offset=10)#offset =10,代表绘制的图分别离x,y轴的距离
输出的结果如下:
当设置画图与轴线之间的距离为100,完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set_style("ticks")
data=np.random.normal(size=(20,6))+np.arange(6)/2
f,ax=plt.subplots()
sns.violinplot(data)
sns.despine(offset=100)#offset =100,代表绘制的图分别离x,y轴的距离
输出的结果如下:
这里涉及的知识点:
1)sns.despine()
seaborn中通过despine()函数轻松删除上方和右方的边框,也可以移位,当边框没有覆盖整个数据轴的范围的时候,trim参数会限制留存的边框范围。
比如:sns.despine(offset=10, trim=True); # offset 两坐标轴离开距离.
3.2边框删除
这里用.despine()控制边框的删除
1)在默认的情况下,边框的位置是上方,下方,左右方均是有边框的.
完整的代码如下:
import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")
输出的结果如下:
2)去掉上方,右方的边框
完整的代码如下:
import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")
sns.despine()
输出的结果如下:
3)去掉上方,左方,右方的边框
完整的代码如下:
import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")
sns.despine(left=True)
输出的结果如下:
这里涉及的知识点:
1)sns.despine()
despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
从plot()函数中移除顶部或右边的边框
3.3临时设定图形样式
同一画布子图的时候,每个子图的风格不一样,那指定多个风格的时候,应该怎么操作?
虽然来回切换非常容易,但sns也允许用with语句中套用axes_style()达到临时设置参数的效果(仅对with块内的绘图函数起作用)。这也允许创建不同风格的坐标轴。
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
f, ax = plt.subplots()
with sns.axes_style("darkgrid"):
plt.subplot(2,1,1)
sinplot()
sns.set_style("whitegrid")
plt.subplot(2,1,2)
sinplot(-1)
输出的结果如下:
从输出的结果可以看出,两个绘图最终的结果不一样,上面的风格是"darkgrid",下面的风格是"whitegrid".
这里涉及的知识点:
为了控制样式,使用axes_style()和set_style()函数.axes_style()是临时控制样式.
3.5调整绘图元素
控制绘图元素的规模,即就是绘制图大小的风格,有四种预设,按相对尺寸的顺序(线条越来越粗),分别是paper,notebook, talk, and poster。notebook的样式是默认的,上面的绘图都是使用默认的notebook预设。
通过set_context() 调整绘图元素,具体如下:
- paper
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("darkgrid")
sns.set_context("paper")
plt.figure(figsize=(8,6))
sinplot()
输出的结果如下:
- notebook (default 默认设置)
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("darkgrid")
sns.set_context("notebook")
plt.figure(figsize=(8,6))
sinplot()
输出的结果如下:
- talk
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("darkgrid")
sns.set_context("talk")
plt.figure(figsize=(8,6))
sinplot()
输出的结果如下:
- poster
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("darkgrid")
sns.set_context("poster")
plt.figure(figsize=(8,6))
sinplot()
输出的结果如下:
- 其他
sns.set_context()中的参数,font_scale可以设置刻度标签的字体的大小,lines.linewidth可以设置折线的宽度
完整的代码如下:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
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)
sns.set_style("darkgrid")
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
plt.figure(figsize=(8,6))
sinplot()
涉及的相关知识点:
使用其中一个名称来调用set_context()来设置参数,您可以通过提供参数值的字典来覆盖参数。
通过更改context还可以独立地扩展字体元素的大小。(这个选项也可以通过顶级set()函数获得)。