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有关)。html

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

# -*- 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数字化水平的参数。app

下面看一个简单的例子:测试

#-*-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()

大概的是这个样子滴:code

line

从上面的一个例子咱们也能够看出,Normalize和Colormap是用来处理颜色和数字映射的。同一个Colormap能够经过不一样的Normalize映射到不一样的数字区间(获取反过来讲更加准确)。具体的根据本身的实际状况调整。orm

参考

matplotlib.colors.Normalizehtm

color example codeip

Colormaps in Matplotlibutf-8

ScalarMappable文档

matplotlib.colors.LogNorm

matplotlib.colors.ListedColormap

常见的Norm

相关文章
相关标签/搜索