Colormap如何在Matplotlib中使用

发布时间:2021-01-05 15:07:01 作者:Leah
来源:亿速云 阅读:207

Colormap如何在Matplotlib中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

该数据集测量了 150 个样本的 4 个特征,分别是:

以上四个特征的单位都是厘米(cm)。

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

iris_df = pd.read_csv('iris.csv',index_col='index_col')

#用花萼长度作为 x 值, 花萼宽度作为 y 值绘制散点图
x = iris_df['PetalLength'].values
y = iris_df['SepalLength'].values

fig = plt.figure()
ax= plt.axes()

# 直接指定颜色
# 点的颜色都一样,颜色不反映更多的信息
plt.scatter(x, y,c='g')

plt.show()

Colormap如何在Matplotlib中使用

如果我们分析这个数据,图中的点聚集成 3 个组,如下图所示:

Colormap如何在Matplotlib中使用

我们希望用点的颜色反映这种分组聚集的信息,可以这样做:

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

iris_df = pd.read_csv('../Topics/iris.csv',index_col='index_col')

x = iris_df['PetalLength'].values
y = iris_df['SepalLength'].values

fig = plt.figure()
ax= plt.axes()

#创建一个ListedColormap实例
#定义了[0, 1]区间的浮点数到颜色的映射规则
cmp = mpl.colors.ListedColormap(['r','g','b'])

# 创建一个BoundaryNorm实例
# BoundaryNorm是数据分组中数据归一化比较好的方法
# 定义了变量值到 [0, 1]区间的映射规则,即数据归一化
norm = mpl.colors.BoundaryNorm([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()

Colormap如何在Matplotlib中使用

上图就比较直观地反映了数据的分组信息。

上面的示例使用了 colors 模块中的主要功能,下面就详细讨论该模块的架构。

maplotlib.colors 模块

matplotlib.colors模块的架构如下图所示:

Colormap如何在Matplotlib中使用

matplotlib.colors模块定义了11个类,定义了10个模块命名空间的方法。

matplotlib.colors模块的主要功能就是将数字或颜色参数转换为RGBRGBA

RGBRGBA分别是0-1范围内3个或4个浮点数的序列。参见上一篇 matplotlib 颜色定义格式规范中的相关内容。

此模块包括:

用于将数字归一化的类和方法,即将列表中的数据映射到 [0,1]区间的浮点数;

用于将归范化后的数字映射到一维数组中的颜色,称之为 colormap。

理解 matplotlib.colors 模块的工作

 matplotlib.Colormap类及其子类

matplotlib.colors模块的Colormap类是一个基类,提供了将[0, 1]的数据映射到颜色的一些属性和方法供其子类使用,很少直接使用该基类,主要使用它的两个子类:

这两个子类就是两种不同的映射方法。

colors.ListedColormap()子类

ListedColormap()类从颜色列表生成一个colormap

class matplotlib.colors.ListedColormap(colors, name='from_list', N=None)

**colors**参数有两种形式:

colors = ['r', 'g', 'b']为例:

就是将[0, 1]区间划分为三段,第一段映射为'r'色,第二段映射为'g'色,第三段映射为'b'色。

请看下面的示例:

#本示例演示对散点条分段着不同颜色

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors

x= np.linspace(1, 12, 24, endpoint=True)
y=x/x

fig = plt.figure()
ax= plt.axes()

# 将`[0, 1]`区间简单地分成四段,依次映射为列表`['r','g','b','y']`中列出的颜色
cmp = mpl.colors.ListedColormap(['r','g','b','y'])

#绘制散点图,用x值着色
#没有指定Norm,所以使用默认的`colors.Normalize`
#将x的值区间为 [1, 24]`映射(归一化)到`[0, 1]`区间
plt.scatter(x, y,s=120, marker='s', c=x, cmap=cmp)

plt.show()

Colormap如何在Matplotlib中使用

参数 Name

可选参数。

给自定义的Colormap命名,将这个Colormap注册到matplotlib,后面即可以通过名称来反复调用该colormap。

参数 N

可选参数。

从列表中的颜色输入到映射的颜色数量。默认为None,即列表中的每个颜色都作为一项输入到映射中。简单地说,就是选用列表中的颜色数量。如果

#本示例演示了参数 N 的用法

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors

x= np.linspace(1, 12, 24, endpoint=True)
y=x/x

fig = plt.figure()
ax= plt.axes()
ax.set_ylim(0.6, 1.5)

# 将`[0, 1]`区间简单地分成 N 段
# 由于N>len(colors),所以重复列表以扩展颜色列表
cmp = mpl.colors.ListedColormap(['C2','C5','C0','C8'],N=6)

# N<len(colors),所以截断颜色列表
cmp2 = mpl.colors.ListedColormap(['C2','C5','C0','C8'],N=2)

#绘制散点图,用x值着色
#没有指定Norm,所以使用默认的`colors.Normalize`
#将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()

Colormap如何在Matplotlib中使用

colors.LinearSegmentedColormap()子类

class matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)

基于线性分段的查找表,从线性映射段创建颜色映射 Colormap 对象。

线性分段查找表是使用对每个原色进行线性插值生成的。

segmentdata参数就是这个线性分段查找表。

segmentdata是一个带'red'、‘green'、'blue'元素项的字典,即这个字典有三个keys:‘red'、‘green'、‘blue'。

每个健的值是一个列表,值列表的元素是形如: (x, y0, y1) 的元组,每个元组是列表的一行。

注意: ‘red'、‘green'、'blue'元素项不能少。

该字典中每个键的值列表的形式如下:

Colormap如何在Matplotlib中使用

表中给定颜色的每一行都是形如 x, y0, y1 的元组,若干个元组构成列表。

在每个键的值序列中,x 必须从 0 到 1 单调增加。对于介于 x[i]x[i+1] 之间的任何输入值 z, 给定颜色的输出值将在 y1[i] 和 *y0[i+1]*之间线性插值。

理解线性分段查找表segmentdata

colors.LinearSegmentedColormap()子类在[0,1]区间上每个点的颜色是由该点的'red'、‘green'、'blue'三原色的值混合确定;

segmentdata 参数以一个字典形式提供每一段三原色值;

每个原色在[0, 1]区间上可以分段,分几段由键值对中值列表的行数决定,分段的点则由元组(x, y0, y1)中的x值决定,如:

'red':  [(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]区间段内,'red'的值从 0.0 线性增加到 1.0;
[0.4, 1.0]区间段内,'red'的值保持 1.0 不变。

#本示例演示 LinearSegmentedColormap 映射用法
#对数据分段,每一段的内部通过线性插值获得颜色值
#请注意比较与ListedColormap的不同

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

x= np.linspace(1, 12, 24, endpoint=True)
y=x/x

fig = plt.figure()
ax= plt.axes()
ax.set_ylim(0.5,1.1)

# 在0.4位置设置断点,分为两段
# 从0.0到0.4之间的 red 值是从 1.0 到 0.0 线性插值生成的(即渐变的),即从红色到黑色
# green, blue的值从开始点到结束点都是零
# 从 0.4 到 1.0,则始终是红色

cdict1 = {'red':  [(0.0, 0.0, 1.0),
          (0.4, 0.0, 1.0),
          (1.0, 1.0, 1.0)],

     'green': [(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)],

     'green': [(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)]}


cmp1 = mpl.colors.LinearSegmentedColormap('name',cdict1)

cmp2 = 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()

Colormap如何在Matplotlib中使用

# 再看一个示例

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

x= np.linspace(1, 12, 24, endpoint=True)
y=x/x

fig = plt.figure()
ax= plt.axes()

cdict = {'red':  [(0.0, 0.0, 0.2),
          (0.5, 1.0, 1.0),
          (1.0, 1.0, 1.0)],

     'green': [(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.colors.LinearSegmentedColormap('lsc',segmentdata=cdict)

#绘制散点图,用x值着色
plt.scatter(x, y,s=120,marker='s',c=x,cmap=cmp,edgecolor='black')

plt.show()

Colormap如何在Matplotlib中使用

matplotlib.cm 模块

matplotlib.colors模块:

有时我们还需要对上述实例进行一些处理,如将自定义的Colormap注册到matplotlib,后面通过其名称调用它;查询Colormap在某个数据归一化方法下各点的RGBA值。

matplotlib设计了cm模块,提供了:

cm模块设计了 1 个混合类,提供了17个函数方法。

其中有3个函数方法属于模块空间:

有14个函数方法属于ScalarMappable类空间:

class ScalarMappable

class matplotlib.cm.ScalarMappable(norm=None, cmap=None)

ScalarMappable混合类,用于支持标量数据到RGBA的映射。在从给定的colormap中返回RGBA颜色之前,ScalarMappable利用了数据归一化。

注: 使用了ScalarMappable实例的to_rgba()方法。

matplotlib.cm.ScalarMappable 类充分利用data->normalize->map-to-color处理链,以简化操作的步骤。

ScaplarMapable类以matplotlib.colors模块的 Normalize实例和Colormap实例为参数。

如果是norm = None, norm 默认为colors.Normalize对象。

Colormap 有三个来源:

如果为None,默认为rcParams.image.cmap中的设置。

matplotlib.colorsmatplotlib.cm 模块的关系如下图所示:

Colormap如何在Matplotlib中使用

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

x= np.linspace(1, 12, 24, endpoint=True)
y=x/x

fig = plt.figure()
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()

Colormap如何在Matplotlib中使用

#观察相同的cmap,不同的Norm,返回的RGBA值
norm1 = mpl.colors.LogNorm()
norm2 = mpl.colors.TwoSlopeNorm(0.4)

sm1 = mpl.cm.ScalarMappable(norm1, 'viridis')
sm2 = mpl.cm.ScalarMappable(norm2, 'viridis')

Colormap如何在Matplotlib中使用

Colormap如何在Matplotlib中使用

#观察相同的Norm, 不同的cmap,返回的RGBA值
norm = mpl.colors.LogNorm()

sm3 = mpl.cm.ScalarMappable(norm, 'viridis')
sm4 = mpl.cm.ScalarMappable(norm, 'magma')

Colormap如何在Matplotlib中使用

Colormap如何在Matplotlib中使用

再看一个实例

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

iris_df = pd.read_csv('iris.csv',index_col='index_col')
iris_df.head()

petal_l = iris_df['PetalLength'].values
sepal_l = iris_df['SepalLength'].values

x = petal_l
y = sepal_l

fig = plt.figure()
ax= plt.axes()

#调用cm.get_cmap()方法,
#获取内置的名为'ocean'的olormap实例
cmp = plt.get_cmap('ocean')

#创建一个Normalize实例
norm = plt.Normalize(vmin=np.min(x),vmax=np.max(x))

#绘制散点图,用x值着色,
#使用norm对进行归一化,
#使用内置的'ocean'映射
plt.scatter(x, y,c=x,cmap=cmp,norm=norm)

plt.show()

关于Colormap如何在Matplotlib中使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. 如如何使用journalctl命令?
  2. 如何在python中利用matplotlib实现饼状图

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

matplotlib colormap

上一篇:如何正确的使用spring cloud hystrix

下一篇:怎么在thinkphp5中实现一个路由功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》