matplotlib之imshow

imshow方法

matplotlib.pyplot.imshow(
    X, cmap=None, norm=None, aspect=None, 
    interpolation=None, alpha=None, vmin=None, vmax=None, 
    origin=None, extent=None, shape=None, filternorm=1, 
    filterrad=4.0, imlim=None, resample=None, 
    url=None, hold=None, data=None, **kwargs)

參數

X : 類數組, shape (n, m) or (n, m, 3) or (n, m, 4)html

在當前的座標系中顯示圖像X,X多是數組或者PIL圖像,若是是數組:api

MxN – values to be mapped (float or int) MxNx3 – RGB (float or uint8) MxNx4 – RGBA (float or uint8)數組

MxN的每一個數都會經過Normalize和Colormap映射到圖像app

若是是整數範圍在[0,255],若是是浮點數範圍在[0,1]dom

cmap : Colormap, 可選,默認使用rc image.cmap配置的,若是X是三維數組,忽略ui

aspect : [‘auto’ | ‘equal’ | scalar], 可選,默認 rc image.aspect配置值url

若是是‘auto’, changes the 圖像長寬比將和座標系匹配scala

若是是‘equal’, 而且extent爲None,座標系長寬比將匹配圖像,若是extent不爲None,座標系的長寬比將匹配extentrest

interpolation : string, 可選,差值方式,默認rc image.interpolation配置值code

能夠搜索一下"圖像差值"可能更加有助於理解這個參數

‘none’, ‘nearest’, ‘bilinear’, ‘bicubic’, ‘spline16’, ‘spline36’, ‘hanning’, ‘hamming’, ‘hermite’, ‘kaiser’, ‘quadric’, ‘catrom’, ‘gaussian’, ‘bessel’, ‘mitchell’, ‘sinc’, ‘lanczos’之一

norm : Normalize, 可選,顏色映射使用

vmin, vmax : scalar, 可選,若是設置Normalize,忽略

alpha : scalar, 可選,透明度[0,1],若是X使用的是RGBA,忽略

origin : [‘upper’ | ‘lower’], 可選,默認rc image.origin配置值

座標(0,0)在左下角仍是左上角

extent : scalars (left, right, bottom, top), 可選

數據座標,圖像範圍(左下角座標和右上角座標)

shape : scalars (columns, rows),可選,圖像原生緩衝區

filternorm : scalar, 可選, 默認: 1

給圖形大小調整過來使用的參數當filternorm = 1, 將過濾整數值和糾正取整(rounding)錯誤。不會過濾浮點數。

filterrad : scalar, 可選, 默認: 4.0

爲使用半徑參數的filter提供,例如:interpolation是‘sinc’, ‘lanczos’ or ‘blackman’中的一個。

返回值

image : AxesImage

實例說明

imshow可能很差理解,由於涉及到不少圖形處理相關的知識。咱們先從簡單的例子說一下,例如咱們使用MxN數據。爲何事2維的呢?由於平面是2維的。MxN中的每個數據都會經過Normalize和Colormap映射出來放到一個位置上,注意MxN不是座標數據而是像素數據,一個數據對應一個像素位置。

像素數據不能填充指定尺寸的圖形怎麼辦?interpolation就有做用了,選擇一個圖形插值方式,沒有數據的就是用指定的插值方式填充。

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np


# extent = (-3,1,-3,1)
fig = plt.figure(frameon=False)

data = np.add.outer(range(8), range(8)) % 2
print data
# plt.imshow(data, cmap=plt.cm.gray, interpolation='nearest',extent=extent)
# plt.imshow(data, cmap=plt.cm.gray, interpolation='bilinear',extent=extent)
# plt.imshow(data, cmap=plt.cm.gray, interpolation='bicubic',extent=extent)
# plt.imshow(data, cmap=plt.cm.gray, interpolation='nearest')
plt.imshow(data, cmap=plt.cm.gray, interpolation='nearest',origin="lower")


plt.savefig("gray.png")
plt.show()
[[0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]]

輸出大概是這個樣子滴:

gray

從圖像和數據的對比咱們能夠比較容易看出,一個數據對應着一個點。座標周圍沒有數據的就使用圖像插值的方式填充。

再來一個改進版的:

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np


dx, dy = 0.05, 0.05

x = np.arange(-3.0, 3.0, dx)
y = np.arange(-3.0, 3.0, dy)


extent = np.min(x), np.max(x), np.min(y), np.max(y)
# extent = (-3,1,-3,1)
fig = plt.figure(frameon=False)

dataBase = np.add.outer(range(8), range(8)) % 2
print dataBase
plt.imshow(dataBase, cmap=plt.cm.gray, interpolation='nearest',extent=extent)
# plt.imshow(dataBase, cmap=plt.cm.gray, interpolation='bilinear',extent=extent)
# plt.imshow(dataBase, cmap=plt.cm.gray, interpolation='bicubic',extent=extent)
# plt.imshow(dataBase, cmap=plt.cm.gray, interpolation='nearest')

dataForeign = np.random.rand(8,8)*3
print dataForeign
# plt.imshow(dataForeign, cmap=plt.cm.viridis, alpha=0.9, interpolation='bilinear',extent=extent)
plt.imshow(dataForeign, cmap=plt.cm.viridis, alpha=0.9, interpolation='bicubic',extent=extent)

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

viridis

再來一個例子看一看:

# -*- coding:utf-8 -*-
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, PathPatch
from matplotlib.path import Path
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)


r = np.random.rand(50)
t = np.random.rand(50) * np.pi * 2.0
x = r * np.cos(t)
y = r * np.sin(t)

fig, ax = plt.subplots(figsize=(6, 6))
# circle = Circle((0, 0), 1, facecolor='none',edgecolor=(0, 0.8, 0.8), linewidth=3, alpha=0.5)
circle = Circle((0, 0), 1, facecolor='none',edgecolor='b', linewidth=3)
ax.add_patch(circle)
ax.axis("off")
ax.axis([-2,2,-2,2])
interpolation = ['none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='spline36',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='lanczos',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='sinc',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='mitchell',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='bessel',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='gaussian',extent=([-1, 1, -1, 1]))
# im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap=cm.winter,interpolation='catrom',extent=([-1, 1, -1, 1]))
im = plt.imshow(np.random.random((100, 100)),origin='lower', cmap="CMRmap",interpolation='catrom',extent=([-1, 1, -1, 1]))
im.set_clip_path(circle)

plt.plot(x, y, 'o', color=(0.9, 0.9, 1.0), alpha=0.8)
plt.savefig("circle.png")
plt.show()

circle

從上面的例子咱們能夠看出imshow在畫一下背景和處理蒙版效果仍是很是好的,固然imshow還有其餘的功能,好比加載顯示圖像等。

參考

matplotlib.pyplot.imshow

Colormaps in Matplotlib

相關文章
相關標籤/搜索