摘要:本文主要介绍Matplotlib配色的Colormap的详细说明,通过实例代码进行了详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面跟边肖学习。
概述上一篇文章详细介绍了matplotlib直接使用‘格式化颜色定义’给图表元素上色。例如,直接指定axes.plot绘制的Line2D的颜色fmt=r
有时,我们希望图表元素的颜色与数据集中某个变量的值相关联,颜色会随着变量的值而变化,从而反映数据趋势、数据聚合、分析师对数据的理解等信息。这时候我们会用到matplotlib的颜色映射功能,也就是把数据映射到颜色上。
要实现数据到颜色的映射,需要做两件事:
变量值变化很大。matplotlib使用[0,1]区间内的浮点数来表示颜色RGB值。首先,需要将不同的变量值映射到[0,1]区间。
将映射[0,1]区间的变量值映射到颜色。
matplotlib.colors模块是实现colormap配色功能的核心模块。
模块的Normalize()类及其子类完成第一项任务;
模块的colormap类及其子类完成第二个任务。
上述两个类的实例,即:
定义变量数据映射到[0,1]区间的规则;
和[0,1]被映射到颜色。
作为传递给绘图函数的参数,颜色可以反映变量数据的属性。请参见下面的介绍性示例。
入门示例我们来看一个例子,简单直观的理解matplotlib.colors模块的工作原理。
利用著名的Iris数据集(Iris Data Set)中的数据来演示图表的绘制和配置,更加贴近实际应用。可以从QQ群:457079928下载这个数据集iris.csv。
Iris数据集最早出现在1936年英国著名统计学家和生物学家罗纳德费雪的论文《The use of multiple measurements in taxonomic problems》中,被用来引入线性判别分析。
在这个数据集中,包括三个不同的鸢尾物种:鸢尾,鸢尾和海滨鸢尾。每个类收集50个样本,所以这个数据集总共包含150个样本。
该数据集测量150个样本的四个特征,即:
萼片长度(花萼长度)
萼片宽度(花萼宽度)
花瓣长度(花瓣长度)
花瓣宽度(花瓣宽度)
以上四个特征的单位都是厘米(cm)。
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为mpl导入
将matplotlib.pyplot作为plt导入
iris_df=pd.read_csv(iris.csv ,index_col=index_col )
#以花萼长度为X值,花萼宽度为Y值绘制散点图
x=iris_df[PetalLength]。价值观念
y=iris_df[SepalLength]。价值观念
图=plt.figure()
ax=plt.axes()
#直接指定颜色
#点的颜色都一样,颜色并不能反映更多的信息。
plt.scatter(x,y,c=g )
plt.show()
如果我们分析这些数据,图中的点被分为三组,如下图所示:
我们想用点的颜色来反映分组收集的信息。我们可以这样做:
将三种颜色的列表定义为colormap
定义一个数据归一化的例子,将所需颜色的数据映射到[0,1]区间;
Cmap和norm用于实现图表元素的分组和配色。
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为mpl导入
将matplotlib.pyplot作为plt导入
iris_df=pd.read_csv(./Topics/iris.csv ,index_col=index_col )
x=iris_df[PetalLength]。价值观念
y=iris_df[SepalLength]。价值观念
图=plt.figure()
ax=plt.axes()
#创建一个ListedColormap实例
#定义浮点数到区间[0,1]中颜色的映射规则
CMP=mpl . colors . listed colormap([ r , g , b])
#创建BoundaryNorm的实例
# BoundaryNorm是数据分组中数据规范化的较好方法。
#定义变量值到[0,1]区间的映射规则,即数据规范化。
norm=mpl . colors . boundary norm([0,2,6.4,7),cmp。n)
#画一个散点图并用x值着色,
#使用norm标准化变量值,
#使用自定义的ListedColormap颜色映射实例
#norm归一化变量x的值
#cmap将标准化数据映射到颜色。
plt.scatter(x,y,c=x,cmap=cmp,norm=norm,alpha=0.7)
plt.show()
上图直观的反映了数据的分组信息。
上面的例子使用了colors模块的主要函数,下面将详细讨论这个模块的体系结构。
maplotlib.colors 模块matplotlib.colors模块的架构如下图所示:
Matplotlib.colors模块定义了10个模块命名空间的11个类和方法。
matplotlib.colors模块的主要功能是将数字或颜色参数转换成RGB或RGBA。
RGB和RGBA分别是0-1范围内的3或4个浮点数的序列。参见前面的matplotlib颜色定义格式规范。
该模块包括:
规格化数字的类和方法,即将列表中的数据映射到[0,1]区间内的浮点数;
用于将标准化数字映射到一维数组的颜色称为colormap。
理解 matplotlib.colors 模块的工作用256个点构造一个[0,1]或[0,255]区间;想象一下,把这256个点从左到右排成一条长条形。
通过Normalize类(或其子类,使用不同的映射方法)将数据映射到这个区间。例如,在上面的示例中,如果 PetalLength 数据区间为[1.0,6.9],则将区间[1.0,6.9]映射到[0,1];上面的例子中定义了BoundaryNorm的一个实例;
构建colormap的一个实例(通常是它的子类),这个实例是用浮点数组表示的颜色名称或者RGB值的列表;
这个颜色列表依次排列在[0,1]区间的256个点上,但是每个颜色(colormap中列出的颜色)所占的位置和区间是由Normalize指定的;上例定义了一个CMP=mpl . colors . listed color map([ r , g , b]),列出了三种颜色;
如果没有定义colormap,默认使用rc image.cmap中的设置;
如果不指定Normalize,颜色。默认情况下使用Normalize。
matplotlib.Colormap类及其子类matplotlib.colors模块的Colormap类是一个基类,它为其子类提供了一些将[0,1]的数据映射到颜色的属性和方法。基类很少被直接使用,但是它的两个子类被主要使用:
ListedColrmap()
LinearSegmentedColormap()
这两个子类是两种不同的映射方法。
colors.ListedColormap()子类ListedColormap()类从颜色列表中生成一个颜色图。
matplotlib . colors . listed colormap类(colors,name=from_list ,N=None)
**颜色* *参数有两种形式:
Plotlib接受的规格颜色列表,例如[r , g , b],或[C0 , C3 , C7]等。可以在基础章节中找到。
用区间[0,1]中的浮点数表示的RGB (N3)或RGBA (N4)的数组,如:array ((0.9,0.1,0.1),(0.1,0.9,0.1),(0.1,0.1,0.9))
以colors=[r , g , b]为例:
即[0,1]的区间分为三段,第一段映射到‘R’色,第二段映射到‘G’色,第三段映射到‘B’色。
请看下面的例子:
#此示例演示如何用不同的颜色分割散点图。
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为mpl导入
将matplotlib.pyplot作为plt导入
导入matplotlib.colors
x=np.linspace(1,12,24,endpoint=True)
y=x/x
图=plt.figure()
ax=plt.axes()
#只需将区间`[0,1 ]分成四段,依次映射到列表`[R , G , B , Y ]中列出的颜色。
CMP=mpl . colors . listed colormap([ r , g , b , y])
#画一个散点图,并用X值着色
# Norm没有指定,所以默认颜色。使用正常化。
#将x的值区间从[1,24]映射(规格化)到区间`[0,1 ]。
plt.scatter(x,y,s=120,marker=s ,c=x,cmap=cmp)
plt.show()
参数 Name
可选参数。
给自定义色彩映射表命名,用matplotlib注册,然后就可以通过名字反复调用色彩映射表了。
参数 N
可选参数。
输入从列表到地图的颜色数量。默认为无,即列表中的每种颜色都作为一个项目输入到地图中。简单来说,选择列表中的颜色数量。如果
Len (colors),列表被截断,即选择列表中的前N种颜色,最后一种被丢弃。
N len(colors),通过重复列表来扩展列表。
#此示例演示了参数n的用法
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为mpl导入
将matplotlib.pyplot作为plt导入
导入matplotlib.colors
x=np.linspace(1,12,24,endpoint=True)
y=x/x
图=plt.figure()
ax=plt.axes()
ax.set_ylim(0.6,1.5)
#简单地将“[0,1 ]”区间分成N段
#因为Nlen(颜色),重复列表扩展颜色列表。
CMP=mpl . colors . listed colormap([ C2 , C5 , C0 , C8],N=6)
# Nlen(colors),所以截断颜色列表。
CMP 2=mpl . colors . listed colormap([ C2 , C5 , C0 , C8],N=2)
#画一个散点图,并用X值着色
# Norm没有指定,所以默认颜色。使用正常化。
#将x的值区间从[1,24]映射(规格化)到区间`[0,1 ]。
plt.scatter(x,x/x*1.1,s=120,marker=s ,c=x,cmap=cmp)
plt.scatter(x,x/x*0.9,s=120,marker=s ,c=x,cmap=cmp2)
plt.show()
colors.LinearSegmentedColormap()子类matplotlib . colors . linearsegmentedcolormap类(name,segmentdata,N=256,gamma=1.0)
基于线性段的查找表,从线性映射段创建颜色映射色图对象。
分段查找表是通过线性内插每个原色而生成的。
segmentdata参数是线性线段查找表。
Segmentdata是一个包含 red 、 green 和 blue 元素的字典,也就是说,这个字典有三个键: red 、 green 和 blue 。
每个键的值是一个列表,值列表的元素是像(x,y0,y1)这样的元组,每个元组就是列表的一行。
注意:
“红色”、“绿色”和“蓝色”元素项目不能少。该字典中每个键的值列表如下:
表格中给定颜色的每一行都是x,y0,y1形式的元组,几个元组形成一个列表。
在每个键的值序列中,x必须从0到1单调递增。对于x[i]和x[i 1]之间的任何输入值Z,给定颜色的输出值将在y1[i]和*y0[i 1]*之间线性插值。
理解线性分段查找表segmentdata颜色。LinearSegmentedColormap()子类的[0,1]区间中每个点的颜色是通过混合该点的“红”、“绿”、“蓝”三原色的值来确定的;
segmentdata参数以字典的形式提供每个段的三原色值;
每个原色都可以在[0,1]区间内分段,分段的个数由键值对的值列表中的行数决定,分段的点由tuple (x,y0,y1)中x的值决定,比如:
红色:[(0.0,0.0,0.0),
(0.4, 1.0, 1.0),
(1.0, 1.0, 1.0)]
表示
:将[0,1]区间分为两段,以0.4的位置为断点;
在[0,0.4]的区间内,‘红色’的值从0.0线性增加到1.0;
在[0.4,1.0]的区间内,“红色”的值保持在1.0不变。
绿色,蓝色值等等;
每个点的颜色是三原色的混合。
#此示例演示了LinearSegmentedColormap映射的使用。
#对于数据分段,通过线性插值获得每个分段内部的颜色值。
#请注意comparison和ListedColormap之间的区别。
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为mpl导入
将matplotlib.pyplot作为plt导入
x=np.linspace(1,12,24,endpoint=True)
y=x/x
图=plt.figure()
ax=plt.axes()
ax.set_ylim(0.5,1.1)
#将断点设置为0.4,分为两段。
#从0.0到0.4的红色值是通过从1.0到0.0的线性插值生成的(即逐渐变化),即从红色到黑色。
#绿色,蓝色从起点到终点蓝色值为零。
#从0.4到1.0,一直是红色。
cdict1={red: [(0.0,0.0,1.0),
(0.4, 0.0, 1.0),
(1.0, 1.0, 1.0)],
绿色:[(0.0,0.0,0.0),
(1.0, 0.0, 0.0)],
blue: [(0.0,0.0,0.0),
(1.0, 0.0, 0.0)]}
#将断点设置在0.8的位置
cdict2={red: [(0.0,0.0,1.0),
(0.8, 0.0, 1.0),
(1.0, 1.0, 1.0)],
绿色:[(0.0,0.0,0.0),
(1.0, 0.0, 0.0)],
blue: [(0.0,0.0,0.0),
(1.0, 0.0, 0.0)]}
cm P1=mpl . colors . linearsegmentedcolormap( name ,cdict1)
CMP 2=mpl . colors . linearsegmentedcolormap( name ,cdict2)
#画一个散点图,并用X值着色
plt.scatter(x,x/x*0.9,s=120,marker=s ,c=x,cmap=cmp1,edgecolor=black )
plt.scatter(x,x/x*0.7,s=120,marker=s ,c=x,cmap=cmp2,edgecolor=black )
plt.show()
#看另一个例子
%matplotlib内联
将numpy作为np导入
进口熊猫作为pd
将matplotlib作为数学编程语言(Mathematical Programming Language)导入
将matplotlib.pyplot作为plt导入
x=np.linspace(1,12,24,endpoint=True)
y=x/x
图=plt .图()
ax=plt.axes()
cdict={red: [(0.0,0.0,0.2),
(0.5, 1.0, 1.0),
(1.0, 1.0, 1.0)],
绿色:[(0.0,0.0,0.5),
(0.75, 1.0, 1.0),
(1.0, 1.0, 1.0)],
blue: [(0.0,0.0,0.3),
(0.25,0.0, 0.0 ),
(0.5, 0.0, 0.0),
(1.0, 1.0, 1.0)]}
CMP=mpl。颜色。linearsegmentedcolormap( LSC ,segmentdata=cdict)
#绘制散点图,用x值着色
plt.scatter(x,y,s=120,marker=s ,c=x,cmap=cmp,edgecolor=black )
plt.show()
matplotlib.cm 模块matplotlib.colors模块:
用于构建一个[0, 1]的标量数据到颜色的映射,色彩映射表实例;
将实际数据归一化到[0, 1]区间,正常化及其子类的实例。
有时我们还需要对上述实例进行一些处理,如将自定义的彩色地图注册到matplotlib,后面通过其名称调用它;查询彩色地图在某个数据归一化方法下各点的RGBA值。
matplotlib设计了厘米模块,提供了:
内置的颜色映射色彩映射表,将颜色名称映射到标准的颜色定义;
彩色地图处理工具;
如注册一个色彩映射表,通过名称获取一个色彩图;
可缩放混合类,这个混合类用以支持将标量数据映射到RGBA颜色可缩放在从给定的彩色地图返回RGBA颜色之前使用数据归一化化。
厘米模块设计了一个混合类,提供了17个函数方法。
其中有3个函数方法属于模块空间:
matplotlib。厘米。get _ cmap(name=无,lut=无)
matplotlib。厘米。register _ cmap(name=None,cmap=None,data=None,lut=None)
matplotlib.cm.revcmap(数据)
有14个函数方法属于可缩放类空间:
添加检查者(自己,检查者)
自动缩放(自身)
自动缩放_无(自身)
已更改(自我)
检查_更新(自己,检查者)
get_alpha(自身)
get_array(自身)
get_clim(self)
get_cmap(self)
set_array(self,A)
set_clim(self,vmin=None,vmax=None)
set_cmap(self,cmap)
set_norm(自我,规范)
to_rgba(self,x,alpha=无,字节=假,定额=真)
类别可缩放
matplotlib。厘米。标量映射表类(norm=无,cmap=无)
可缩放混合类,用于支持标量数据到RGBA的映射。在从给定的彩色地图中返回RGBA颜色之前,可缩放利用了数据归一化。
注:
使用了可缩放实例的to_rgba()方法。matplotlib。厘米。标量映射表类充分利用数据规格化贴图到颜色处理链,以简化操作的步骤。
可绘制地图的类以matplotlib.colors模块的使标准化实例和彩色地图实例为参数。
如果是规范=无,规范默认为颜色。使标准化对象。
彩色地图有三个来源:
内置的;
第三方的彩色地图库;
自定义的。
如果为没有,默认为rcParams.image.cmap中的设置。
matplotlib.colors和matplotlib.cm模块的关系如下图所示:
%matplotlib内联
将numpy作为铭牌导入
进口熊猫作为螺纹中径
将matplotlib作为数学编程语言(Mathematical Programming Language)导入
将matplotlib.pyplot作为plt导入
x=np.linspace(1,12,24,endpoint=True)
y=x/x
图=plt .图()
ax=plt.axes()
ax.set_ylim(0.8,1.2)
#传递不同的cmap
#绘制散点图,用x值着色
plt.scatter(x,y*1.05,s=120,marker=s ,c=x,cmap=viridis )
plt.scatter(x,y*0.95,s=120,marker=s ,c=x,cmap=magma )
plt.show()
#观察相同的cmap,不同的规范,返回的RGBA值
norm1=mpl.colors.LogNorm()
范数2=mpl。颜色。二次抛物线形(0.4)
sm1=mpl。厘米。标量可映射表(nor m1,“viridis”)
sm2=mpl。厘米。标量映射表(范数2,“维里迪斯”)
#观察相同的规范,不同的cmap,返回的RGBA值
norm=mpl.colors.LogNorm()
sm3=mpl。厘米。标量可映射表(norm,“viridis”)
sm4=mpl。厘米。标量映射表(标准,“magma”)
再看一个实例
%matplotlib内联
将numpy作为铭牌导入
进口熊猫作为螺纹中径
将matplotlib作为数学编程语言(Mathematical Programming Language)导入
将matplotlib.pyplot作为plt导入
iris_df=pd.read_csv(iris.csv ,index_col=index_col )
iris_df.head()
petal_l=iris_df[PetalLength].价值观念
sepal_l=iris_df[SepalLength].价值观念
x=花瓣_l
y=萼片_l
图=plt .图()
ax=plt.axes()
#调用cm.get_cmap()方法,
#获取名为“ocean”的内置olormap实例
cmp=plt.get_cmap(ocean )
#创建一个规范化实例
norm=plt。规格化(vmin=np.min(x),vmax=np.max(x))
#画一个散点图并用x值着色,
#用norm标准化该对,
#使用内置的“海洋”贴图
plt.scatter(x,y,c=x,cmap=cmp,norm=norm)
plt.show()
关于Matplotlib配色的详细讲解,本文到此为止。有关matplotlib配色的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!