(十四)Seaborn知识学习1-python数据分析与机器学习实战(学习笔记)

文章原创,最近更新: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()函数获得)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容