PYTHON数据可视化(二)

Seaborn库 手册翻译(二)

第二部分颜色控制。

配色是图表设计中非常重要的一方面,恰当的着色可以有效的展现数据的特征。网络上有许多学习可视化配色的资源,我比较喜欢 Rob Simmon的series of bolg posts和more technical paper(科学上网)。matplotlib文档现在也有一个很好的教程,说明了如何在内置色彩映射中构建的一些感知特性。

Seaborn让选择和使用调色板变得简单,且适合你所遇到的数据类型以及你的可视化目标。

%matplotlib inline
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={"figure.figsize": (6, 6)})
np.random.seed(sum(map(ord, "palettes")))

建立配色方案

最重要的用于建立独立配色方案的函数是color_palette()这个函数提供了许多(not all)在seaborn中生成颜色的方式。它在任意拥有palette参数的函数内部被使用(在某些需要多种颜色的情况下也可以转入color参数)。

color_palette()可以接受任意的seaborn调色板和matplotlib colormap(除了jet,当然你也不该用这玩意~)。它也可以接收一系列在任意有效的matplotlib格式(RGB tuples, hex color codes, or HTML color names)下设置好的颜色。它的返回值通常是一个RGB元组的list。
最后,无参数调用color_palette()会返回默认的颜色集。
相对应地,set_palette函数可以接受同样的参数,可以为所有图片设置颜色。你依旧可以在with语句下调用color_palette()来暂时修改默认调色板。(见下文)

一般而言,离开数据的具体特征讲着色都是耍流氓。所以我们分三种不同类型的调色板:分类色板、连续变化(颜色渐变)色板和发散(极端值深,中间值浅)色板,来讲解color_palette()和其他Seaborn 调色板函数。

  1. Sequential,按顺序渐变的。 - Light colours for low data, dark for high data
  2. Diverging,彼此之间差异变化较大的。 - Light colours for mid-range data, low and high contrasting dark colours
  3. Qualitative,这个用于最大程度地显示不同类之间的差别。 - Colours designed to give maximum visual difference between classes

分类色板

分类(定类)色板是你在区分无特定顺序的离散数据时的最佳选择。

当你导入Seaborn库时,默认的颜色循环被改成一组六个颜色。这会让你想起matplotlib的颜色循环,当然咱这个漂亮多了。

current_palette = sns.color_palette()
sns.palplot(current_palette)

PYTHON数据可视化(二)_第1张图片
默认的颜色主题有6种不同的风格,
deep, muted, pastel, bright, dark和colorblind。

使用圆形颜色系统

当你有6种以上颜色需要区分的时候,最简单的方式是在一个圆形的颜色空间内划出均匀间隔的颜色。(这样的色调变化会保证亮度和饱和度不变)。这是seaborn函数中大多数的默认方式。

最为常见的方式是采用hls颜色空间,这是一个RGB值的简单转换。

sns.palplot(sns.color_palette("hls", 8))

233
在这里你也可以通过hls_palette函数控制颜色的亮度和饱和度。
233
因为咱们自个眼睛的问题,这种方法搞出来的颜色,总是看着有点不爽。

为了改善这种问题,Seaborn提供了husl系统的接口,这会让选择均匀接口的色彩变得更加容易,同时保持亮度和饱和度更加均匀。

sns.palplot(sns.color_palette("husl", 8))

233
类似的 husl_palette()提供了更为自由的接口。

使用分类Color Brewer 调色板

另一个非常漂亮的分类色板来源于Color Brewer(同样也具有连续色板和发散色板),它也同样存在于matplotlib colormaps中,但是并没有得到很好的处理。在Seaborn中,当你调用Color Brewer分类色板时,你总能得到离散的颜色,但是这意味着它们在某一点开始了循环。

非常棒的一点是,Color Brewer网站提供关于调色板的色盲安全指导。避开红绿吧。

sns.palplot(sns.color_palette("Paired"))

233

sns.palplot(sns.color_palette("Set2", 10))

233
为了帮助你从Color Brewer library中选择调色板,我设计了choose_colorbrewer_palette。这个函数只能在IPython notebook中调用,其犯规一个交互式小部件,允许你浏览不同的选项及修改参数。

当然,你可能希望采用某一组你偏爱的颜色,因为color_palette接受颜色列表,这种诉求很容易实现。

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))

233

使用xkcd颜色来命名颜色

??这是一个什么在线漫画网站。反正你可以通过xkcd_rgb字典来调用。

plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3);

PYTHON数据可视化(二)_第2张图片
除了通过字典的方式调用单个颜色,你可以通过向xkcd_palette()函数传入列表来获取成组的颜色。

colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))

233

连续色板

调色板中的第二大类被称为“连续(sequential)”色板。当数据从低值(不感兴趣)到高值(感兴趣)分布时采用这种色板非常合适。虽然有时你需要一个连续的离散颜色调色板(discrete colors in a sequential palette),这在使用kdplot()或corrplot函数时比较常见。

在这种情况下使用jet色彩映射(jet colormaps )或者彩虹调色板( rainbow palettes)最为常见,因为颜色的范围拥有提供数据额外信息的印象。但是过大的色调变化会带来数据本身不连续的错觉,并且视觉系统不能自然的通过“彩虹色”定量产生“高”、“低”之分。所以如此着色的可视化带来的更多是谜题,其隐藏了数据的特征而非揭露它们。实际上jet palette是非常糟糕的(particularly bad)因为黄色 青色这两种最明亮的颜色,被用于处于中间位置的数据。这过分强调了一些没有意义的中间数据而忽略了极值。

对于顺序数据最好应用那些在色调上只有细微变化,同时在饱和度和对比度上有很大变化的调色板。这种处理会吸引人们去关注数据中重要的部分。

Color Brewer library 中有许多如此的调色板,他们以调色板中的主颜色命名。

sns.palplot(sns.color_palette("Blues"))

233
与在matplotlib中一样,如果你想改变渐变方向,你可以加入_r后缀。

sns.palplot(sns.color_palette("BuGn_r"))

233
在Seaborn中你可以对这些色板进行“暗处理”减少他们的亮度。如果你后续需要画线,这可以提供一些帮助。毕竟太过明亮可能导致线无法被看清。通过加入_d后缀达到

sns.palplot(sns.color_palette("GnBu_d"))

233
牢记,你可能想使用choose_colorbrewer_palette()函数取绘制各种不同的选项。如果你想返回一个变量当做颜色映射传入seaborn或matplotlib的函数中,可以设置as_cmap参数为True。

连续cubehelix调色板

cubehelix调色板系统中含有亮度线性变化同时色调变化的线性色板。这意味着在打印(黑白)时或被色盲使用时,你的着色仍然能产生一定的效果。

sns.palplot(sns.color_palette("cubehelix", 8))

233
seaborn为cubehelix系统添加一个接口使得其可以在各种变化中都保持良好的亮度线性梯度。
cubehelix_palette()函数返回的默认色板与matplotlib默认有很大区别。它不会在色轮周围辐射太远,也不会覆盖过大的范围。它也调整了颜色的顺序,使得更重要的数据颜色更深。

sns.palplot(sns.cubehelix_palette(8))

233
cubehelix_palette()函数的其他参数主要是是控制色板的具体颜色。有两个主要的参数startrot,还有rot的次数。

sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))

233
你也可以控制端点的明暗,甚至颠倒颜色顺序。

sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))

2333
在默认情况下,如同其他seaborn色板一样,你只会得到一个颜色列表。但是你可以运用as_cmap=True,将其传入matplotlib中。

x, y = np.random.multivariate_normal([0, 0], [[1, -.5], [-.5, 1]], size=300).T
cmap = sns.cubehelix_palette(light=1, as_cmap=True)
sns.kdeplot(x, y, cmap=cmap, shade=True);

PYTHON数据可视化(二)_第3张图片
类似的,也可以在notebook中使用choose_cubehelix_palette()函数启动一个互助程序来帮助选择更适合的调色板或颜色映射。如果想让函数返回一个类似hexbin的颜色映射而非一个列表则需要传入as_cmap=True

使用light_palette() 和dark_palette()调用定制连续调色板

这里还有一个更简单的连续调色板的使用方式,就是调用light_palette() 和dark_palette(),这与一个单一颜色和种子产生的从亮到暗的饱和度的调色板。这些函数还伴有choose_light_palette() and choose_dark_palette()函数,这些函数启动了交互式小部件来创建这些调色板。

sns.palplot(sns.light_palette("green"))

233

sns.palplot(sns.dark_palette("purple"))

233
当然渐变也可以反过来

sns.palplot(sns.light_palette("navy", reverse=True))

233

pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);

PYTHON数据可视化(二)_第4张图片

默认情况下,任何有效的matplotlib颜色可以传递给input参数。也可以在hls或husl空间中提供默认的rgb元组,您还可以使用任何有效的xkcd颜色的种子。

sns.palplot(sns.light_palette((210, 90, 60), input="husl"))

233

sns.palplot(sns.dark_palette("muted purple", input="xkcd"))

233

需要注意的是,为默认的input空间提供交互的组件是husl,这与函数自身默认的并不同,但这在背景下却是更有用的。

离散色板

调色板中的第三类被称为“离散”。当你关注极端值时,应该采用这种着色方式。例如,如果你正在绘制温度变化从基线值,最好使用不同色图显示相对降低和相对增加面积的地区。
选择离散色板的规则类似于顺序色板,除了你想满足一个强调的颜色中点以及用不同起始颜色的两个相对微妙的变化。同样重要的是,起始值的亮度和饱和度是相同的。

同样重要的是要强调,应该避免使用红色和绿色,因为大量的潜在观众将无法分辨它们。

你不应该感到惊讶的是,Color Brewer颜色字典里拥有一套精心挑选的离散颜色映射:

sns.palplot(sns.color_palette("BrBG", 7))

233

sns.palplot(sns.color_palette("RdBu_r", 7))

233
另一个在matplotlib中建立的明智的选择是coolwarm面板。请注意,这个颜色映射在中间值和极端之间并没有太大的对比.

sns.palplot(sns.color_palette("coolwarm", 7))

233

定制diverging palettes

你可以运用diverging_palette()去创建一个定制的diverging色板。(当然也有一个类似配套的互动工具:choose_diverging_palette())。该函数使用husl颜色系统的离散色板。你需随意传递两种颜色,并设定明度和饱和度的端点。函数将使用husl的端点值及由此产生的中间值进行均衡。

sns.palplot(sns.diverging_palette(220, 20, n=7))

233

sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))

233
sep参数控制面板中间区域的两个渐变的宽度。

sns.palplot(sns.diverging_palette(10, 220, sep=80, n=7))

233

也可以用中间的色调来选择调色,而不是用亮度

sns.palplot(sns.diverging_palette(255, 133, l=60, n=7, center="dark"))

233

设定默认色板

color_palette函数同样拥有set_palette()函数。两者之间的关系与之前相同。接受的参数也相同。但是set函数可以改变matplotlib的默认色板,作用于所有画图。

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)
sns.set_palette("husl")
sinplot()

PYTHON数据可视化(二)_第5张图片

color_palette函数同样可以应用于with语句中,暂时性改变色板。

with sns.color_palette("PuBuGn_d"):
    sinplot()

PYTHON数据可视化(二)_第6张图片

你可能感兴趣的:(PYTHON数据可视化(二))