matplotlib之normlize与colormap

Normalize类

class matplotlib.colors.Normalize(vmin=None, vmax=None, clip=False)

Normlize是用来把数据标准化(归一化)到[0,1]这个期间内,vmin是设置最小值, vmax是设置最大值,小于最小值就取最小值,大于最大值就取最大值。clip=True看文档的意思是如果超出了范围就设置为0或者1,离哪一个值近就设置为哪一个值。写了测试没有发现clip=False和clip=True有什么区别(这个可能还和colormap中的set_uper和set_under有关)。

如果没有设置vmin, vmax就是第一次出来数据集中的最大值和最小值。 下面和matplotlib.cm.ScalarMappable结合看一下不同的设置对数据标准化的影响。

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.cm import ScalarMappable
import matplotlib
fig, ax = plt.subplots()

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# norm = mpl.colors.Normalize()
# norm = mpl.colors.Normalize(-5,5,clip=False)
# norm = mpl.colors.Normalize(1,5,clip=False)
# norm = mpl.colors.Normalize(0,5,clip=False)
norm = mpl.colors.Normalize(2,5,clip=True)
# norm = mpl.colors.Normalize(2,5,clip=False)

# norm.autoscale(data)
print norm.scaled()

sm = ScalarMappable(norm=norm)
print sm.get_clim()

print sm.get_array()

print sm.to_rgba(data)

print norm.scaled()

print sm.get_clim()

# print matplotlib.__version__
sm.set_array(data)

print sm.get_array()

Colormap类

class matplotlib.colors.Colormap(name, N=256)

Colormap实例是用来把[0,1]之间的数转换为rgba颜色的。name是生成的Colormap的名字,N是设置rgb数字化水平的参数。

下面看一个简单的例子:

#-*-coding:utf-8-*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm

# 4个线段集合(不一定是直线)
segments = [[[0,0],[5,5]],[[0,0],[2,4],[10,10]],[[0,0],[4,2],[10,10]],[[5,5],[10,10]]]

fig, axes = plt.subplots(4, 1, sharex=True, sharey=True)

axes[0].axis([0,10,0,10])
cmap = ListedColormap(['r', 'g', 'b'])
# BoundaryNorm 会根据cmap把不同的区间映射到对应的颜色
norm = BoundaryNorm([0, 2, 4,10], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
# 设置线段集合的颜色,一个segment一个颜色
lc.set_array(np.array([0,2,4,10]))
lc.set_linewidth(2)
line = axes[0].add_collection(lc)
fig.colorbar(line, ax=axes[0])

axes[1].axis([0,10,0,10])
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([0,2,4,6,8,10], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(np.array([0,4,8,10]))
lc.set_linewidth(2)
line = axes[1].add_collection(lc)
fig.colorbar(line, ax=axes[1])

axes[2].axis([0,10,0,10])
norm = plt.Normalize(1, 10)
lc = LineCollection(segments, cmap='viridis', norm=norm)
lc.set_array(np.array([0,4,8,10]))
lc.set_linewidth(2)
line = axes[2].add_collection(lc)
fig.colorbar(line, ax=axes[2])

axes[3].axis([0,10,0,10])
norm = plt.Normalize(1, 1000)
lc = LineCollection(segments, cmap='viridis', norm=norm)
lc.set_array(np.array([0,4,8,800]))
lc.set_linewidth(2)
line = axes[3].add_collection(lc)
fig.colorbar(line, ax=axes[3])

plt.savefig("line.png")
plt.show()

大概的是这个样子滴:

line

从上面的一个例子我们也可以看出,Normalize和Colormap是用来处理颜色和数字映射的。同一个Colormap可以通过不同的Normalize映射到不同的数字区间(获取反过来说更加准确)。具体的根据自己的实际情况调整。

参考

matplotlib.colors.Normalize

color example code

Colormaps in Matplotlib

ScalarMappable

matplotlib.colors.LogNorm

matplotlib.colors.ListedColormap

常见的Norm

猜你喜欢

转载自my.oschina.net/u/2474629/blog/1798213