Seaborn中文教程(六):让图形更美观

让图形充满魅力是非常重要的。当我们探索一个数据集并且要进行可视化,那么,把图画得令人愉悦终究是不错的。可视化,是与听众交流大量信息时的核心方法,在这种情况下,让图形变得能瞬间抓住听众的注意非常有必要。

matplotlib支持高度的自定义,但是我们很难弄清楚应该如何调整才能让图片更具吸引力。Seaborn提供了一系列定制好的主题和一个更高级的接口,用于调整基于matplotlib的图形的外观。

import numpy as np
import seaborn as sns
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 * .5) * (7 - i) * flip)

我们先看一下matplotlib默认的风格:

sinplot()
image

我们可以使用set()函数来切换到seaborn的默认风格。值得注意的是,在0.8版本以前,当我们import seaborn的时候,seaborn.set()就已经被调用了,在之后的版本,我们则必须显示地调用它。

sns.set()
sinplot()
image

Seabornmatplotlib参数分成独立的两组。第一组用于设置图形的设计风格,第二组用于调整各种各样的图形元素,这样我们的图形就能很容易地并入不同的背景。

调整这些参数的接口是两对函数。我们可以用axes_style()或者set_style()来控制设计风格;至于控制图形元素的大小缩放,则需要使用plotting_context()set_context()函数。两种情况下,axes_*函数都会返回一个参数字典,set_*函数则会设置matplotlib的默认参数。

一、Seaborn设计风格

seaborn中有5种预设主题:darkgridwhitegriddarkwhiteticks。它们各自针对不同的应用和个人偏好。默认的主题是darkgrid。网格可以对定量信息提供参考(对照),而浅灰色则避免网格线与我们绘制的线条冲突。whitegrid主题与那些拥有很多数据元素的图很像,但是它与这种图契合得更好。

sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data);
image

很多情况下网格是没有必要存在的,尤其是在类似演讲的场合中,我们只想要通过图形展示某种模式的时候(这时数值参考并不重要)。

sns.set_style("dark")
sinplot()
image
sns.set_style("white")
sinplot()
image

有时我们可能想要给图形增加些额外的结构,比如增加刻度尺:

sns.set_style("ticks")
sinplot()
image

二、去除图形边线

whiteticks主题中,我们并不需要上边和右边的边界。我们可以使用despine()来干掉他们:

sinplot()
sns.despine()
image

在有些图中,我们需要调整边界与图形之间的距离,这一点我们也可以通过despine()来实现。当刻度尺不会覆盖整个坐标轴的范围时,trim参数会帮助我们限制边界的显示范围:

f, ax = plt.subplots()
sns.violinplot(data=data)
sns.despine(offset=10, trim=True);
image

我们也可以通过额外的参数来决定去除哪些边界:

sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True);
image

三、临时修改设计风格

虽然我们可以很容易地改来改去,但有些情况下,我们使用with语句搭配axes_style()函数会更好。使用这种方法,我们可以在一张图的不同坐标轴中使用不同的设计:

f = plt.figure()
with sns.axes_style("darkgrid"):
    ax = f.add_subplot(1, 2, 1)
    sinplot()
ax = f.add_subplot(1, 2, 2)
sinplot(-1)
image

四、重载seaborn的设计元素

如果我们想定制seaborn的设计风格,我们还可以给axes_style()或者set_style()rc参数传递一个字典,这个字典由各种各样的设置项组成。需要注意的是,我们只能重载那些已经被定义好的选项。(不过更高级的set()函数可以接受任何matplotlib参数组成的字典)。

如果我们想看它们支持哪些选项,我们可以不加任何参数地调用它们,这样它们就会返回当前的配置:

sns.axes_style()
{'axes.facecolor': 'white',
 'axes.edgecolor': '.8',
 'axes.grid': True,
 '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': False,
 'xtick.top': False,
 'ytick.left': False,
 'ytick.right': False,
 'axes.spines.left': True,
 'axes.spines.bottom': True,
 'axes.spines.right': True,
 'axes.spines.top': True}

然后我们就可以进行修改和重载了:

sns.set_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
image

五、缩放图形元素

有一系列单独的参数可以用于控制图形元素的缩放,这样我们就可以使用同样的代码来使得我们的图片可以适应不同的应用场景(有时可能需要更大的图片,但有时却刚好相反)。

首先我们先重置所有的设置:

sns.set()

我们有四种预设的背景,按照相对大小来排序,分别是papernotebooktalkposter。上文的那些图片中使用的都是默认的notebook风格。

sns.set_context("paper")
sinplot()
image
sns.set_context("talk")
sinplot()
image
sns.set_context("poster")
sinplot()
image

前边我们了解的那些关于设计风格的函数的知识,大多数也适用于背景函数。

我们可以使用set_context()搭配一个背景风格的名称,也可以直接重载一个由设置选项构成的字典。

当修改了背景之后,我们也可以单独缩放字体元素(这个选项也可以通过顶级的APIset()函数来实现)。

sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
image

与设计风格相似,我们可以使用with语句临时调整图形的缩放。

不管是设计风格还是背景风格(缩放),我们都可以使用set()函数快速完成设置。这个函数还可以设置默认的调色板,不过接下来我们会更加详细地探讨关于调色板的知识。

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

推荐阅读更多精彩内容