写在开头:在该系列第一篇文章介绍了一下整体seaborn对于画图整体风格与比例的调控,今天开始分享一下seaborn对于颜色的设计。该文章参考文献主要为学习路远老师的seaborn教程,会在结尾放上链接。
上节回顾:上一节分享了Seaborn绘图的整体颜色与风格比例调控,可点击链接查看。python数据可视化之Seaborn(一)
Seaborn可视化内容安排
在Seaborn的学习中安排如下,
一、画风设置:会简单介绍一下绘图风格(一)与颜色风格(二)的设置;
二、绘图技巧:这里会介绍数据集(三)、相关数据(四)、分类数据(五)、线性关系(六)可视化的相关内容;
三、结构网络:本节主要介绍数据识别结构网络的绘图(七)。
一、Seaborn画风设置
颜色风格
在我经常绘图的时候总感觉画图出来的颜色,和自己设计的颜色有一种不协调的感觉。今天的颜色风格设置会讲述部分seaborn颜色调试的方法。
首先需要加载本次需要使用的包,
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(rc={"figure.figsize":(10, 10)})
np.random.seed(42)
对于画布大小的设置,也可以使用plt.figure(figsize=(10, 10))的方法进行设置。
调色板设置
本节将对连续数据、类型数据、离散数据友好的颜色设置,分别进行调色板的介绍。
1.连续数据类型
调色板的风格分为连续、分类和离散,我们就先从连续数据来讲一讲离散数据适合的颜色。连续类型数据适合的就是能够将连续数据使用不连续的颜色来表示数据的程度。可以理解为一种渐近的感觉,通常可以在画核密度函数图、相关图、热点图或者一些其他的分布图中使用,用来描述连续数据的程度。
Color Brewer颜色库(连续型)
连续数据在色调上的使用最好是颜色属于一个色系,但颜色的亮度或者曝光度有一定的差异。在连续型上可以使用Color Brewer库中已有的颜色,在这里我们可以通过R语言来调取Color Brewer连续型数据的所有颜色展示,
display.brewer.all(type='seq')
有了Color Brewer的颜色字典,我们就可以直接通过color_palette()(这个函数返回是一组数组)函数进行调色,然后选择我们喜欢的颜色进行上色。在颜色后加_r和_d分别表示颜色顺序导致和颜色加深。
sns.palplot(sns.color_palette("RdPu"))
sns.palplot(sns.color_palette("OrRd_r"))
sns.palplot(sns.color_palette("BuGn_d"))
下面展示利用上述color_palette()调色板颜色画出的联合分布图,
sns.set_style("white")
sns.set_palette(sns.color_palette("BuGn_d"))
# 产生两个正态随机数据
rs = np.random.RandomState(42)
mean = [0, 0]
cov = [(1, .5), (.5, 1)]
x1, x2 = rs.multivariate_normal(mean, cov, 500).T
x1 = pd.Series(x1)
x2 = pd.Series(x2)
sns.jointplot(x1, x2, kind="kde", height=7, space=0)
cubenhelix连续调色板
除勒直接调用Color Brewer的连续型颜色库以外,我们还可以利用cubehelix调色板组建一组有规律性的颜色色彩。在matplotlib中有cuhehelix的内置参数,也有sns对于cuhehelix_palette()的接口,可以通过调整start,rot参数,来设置色彩轮盘上颜色的选取,围绕调色板范围内的色相控制盘旋转。
sns.palplot(sns.color_palette("cubehelix", 7))
sns.palplot(sns.cubehelix_palette(7))
sns.palplot(sns.cubehelix_palette(8, start=1.5, rot=-0.75))
sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=0.9, reverse=True))
下面展示一下cubehelix_palette()绘图的案例,这里需要在cubehelix_palette()函数中设置as_cmap=True,才能够将颜色对象映射出去,然后再在绘图heatmap()函数里cmap=cmap,接受颜色对象。
from numpy import arange
x = arange(25).reshape(5, 5)
cmap = sns.cubehelix_palette(as_cmap=True,start=1.5, rot=-0.75)
ax = sns.heatmap(x, cmap=cmap)
更简单的连续调色版
在此处我们可以引入两个更简单的连续色板,可以使用light_palette()或者dark_palettte()函数。颜色都是单一的颜色,而且能产生亮暗或者饱和度的高低。
sns.palplot(sns.light_palette("orange", reverse=True))
sns.palplot(sns.dark_palette("green"))
下面展示一下这两个函数的使用,同样需要设置as_cmap=True,进行颜色对象的传递。选用sns自带鸢尾花数据进行绘制二维核密度函数图,
#数据的提取
sns.set(style="darkgrid")
iris = sns.load_dataset("iris")
setosa = iris.query("species == 'setosa'")
virginica = iris.query("species == 'virginica'")
#画布的建立
f, ax = plt.subplots(figsize=(5, 20))
ax.set_aspect("equal")
cmap1 = sns.light_palette("orange", reverse=True, as_cmap=True)
cmap2 = sns.dark_palette("green", as_cmap=True)
#绘图
ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length,
cmap=cmap1, shade=True, shade_lowest=False)
ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length,
cmap=cmap2, shade=True, shade_lowest=False)
2.类型数据类型
内置类型数据调色板
类型数据就是指的无顺序不连续的数据,于是在seaborn上有一个默认的色环,能够非常友好的帮助分类数据进行上色,也就是color_palette(),这个函数在前文中可以利用Color Brewer库进行连续型上色,在此处其可以进行类型数据的上色,并且其还有6个主题deep,muted,pastel,birght,dark,colorblind。在此处我们展示默认、deep和dark三个调色板。
sns.palplot(sns.color_palette())
themes = ['deep','dark']
for theme in themes:
current_palette = sns.color_palette(theme)
sns.palplot(current_palette)
hls色圈空间
为了获得更多的颜色,那仅仅是内置的6个主题是远远不够的,于是我们使用一种方法在色圈空间内使用均匀的颜色分布。最常用的就是hls,有内置的也有单独的接口hls_palette(),可以简单的对RGB值进行转换,同时还可以控制其亮度、饱和度。
sns.palplot(sns.color_palette("hls", 8))
sns.palplot(sns.hls_palette(8, l=.5, s=.2))
但这样的绘图存在一个问题就是,及时曝光度设置是一样的,但由于视觉效果暖色系就是要比冷色系看着更鲜艳,为了解决这个问题还可以用内置的husl方法进行调色,
sns.palplot(sns.color_palette("husl", 8))
Color Brewer颜色库(分类型)
Color Brewer颜色库针对于连续、分类、都有专门的颜色分类,下面我们依然用R语言查看一下该库,对于类型数据的颜色配置,
display.brewer.all(type='qual')
下面展示一下类型数据上的使用,绘制一个多组箱线图,
data = np.random.normal(size=(20, 7))+np.sqrt(np.arange(7))
sns.set_style("ticks")
current_palette = sns.color_palette("Paired")
sns.boxplot(data=data, palette=current_palette)
xkcd颜色选择
还可以使用xkcd颜色的名称,通过xkcd_rgb来调用颜色,具体颜色全体名称可以在本文最后参考链接查看,一共有954个颜色。
sns.set_style('white',{"axes.facecolor": ".7"})
x = np.linspace(0, 1, 100)
list = ['orange','maroon','mauve','dark pink','beige']
for i in range(0, 5):
plt.plot(x, np.cos(x+i*.5)*(7-i)*0.1 + np.random.random(1), sns.xkcd_rgb[list[i]])
3.离散数据类型
调色板中的第三大类就是所谓的离散数据,对于离散数据而言,通常需要的是将其有意义的数值进行表明,或者将数据进行区分,也就是用同类不同色,同色不同类的进行区分。
Color Brewer颜色库(离散型)
同样的,Colore Brewer颜色库给我们提供了离散数据的颜色搭配,我们来用R语言看一下,
display.brewer.all(type='div')
下面我们来做一个散点图,
current_palette = sns.color_palette("RdBu")
x = np.linspace(0, 10, 10)
for i in range(0, 2):
plt.scatter(x, np.cos(x + i * .5) * (7 - i) * 0.1,
color=sns.color_palette("RdBu")[i*3])
个性化离散色板
我们可以使用seaborn函数中的diverging_palette()来创建一个自定义的颜色映射。这个函数需要传递两种色调,并且可以设置亮度与饱和度,还可以设置选取颜色的间距。
sns.palplot(sns.diverging_palette(270,20, n=7))
#亮度饱和度的调节
sns.palplot(sns.diverging_palette(145, 280, s=50, l=19, n=7))
#颜色选取间隔的调节
sns.palplot(sns.diverging_palette(10, 220, sep=1, n=7))
#将中间设为dark进行两边均衡
sns.palplot(sns.diverging_palette(255,133,l=60,n=7,center="dark"))
x = arange(25).reshape(5, 5)
cmap = sns.diverging_palette(255,133,l=60,n=9,center="dark", as_cmap=True)
sns.heatmap(x, cmap=cmap)
因为有的Seaborn绘图函数能接受cmap颜色列表参数,有的只能接受现有调色盘palette参数,因此在绘制图形时可以查看文档是否接收相应的数据类型。
结语
在本节中我们讲述了Seaborn对于连续型、分类型、离散型数据绘图颜色的相关内容,下一节,我们会就具体实际遇到的数据类型进行绘图的分析。
谢谢阅读。
参考
路远Seaborn绘图
xkcd颜色库
seaborn使用文档