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

相關文章
相關標籤/搜索