python matplotlib 圖像可視化

image.png

Python畫圖之總結(jié)待整理

https://morvanzhou.github.io/tutorials/data-manipulation/plt/
http://blog.sciencenet.cn/blog-1408284-850983.html
http://www.cnblogs.com/DHUtoBUAA/p/6619099.html
http://blog.csdn.net/wuguangbin1230/article/details/72858612
http://blog.sciencenet.cn/blog-251664-800766.html
http://blog.csdn.net/wuguangbin1230/article/details/72858612
http://www.reibang.com/p/0a81b57bbb8c
https://pythonprogramming.net/

http://blog.csdn.net/haoji007/article/details/52063168

Python Data Visualizations


Seaborn 庫:https://seaborn.pydata.org/

Python Seaborn 教程:http://elitedatascience.com/python-seaborn-tutorial


matplotlib: plotting with Python
matplotlib: plotting with Python-github

python-data-visualization-course
Interactive Web Plotting for Python
Interactive Web Plotting for Python-github


https://morvanzhou.github.io/tutorials/data-manipulation/plt/3-3-contours/
https://github.com/MorvanZhou/tutorials/tree/master/matplotlibTUT

https://github.com/jiandanjinxin/tf-dev-summit-tensorboard-tutorial
https://github.com/jiandanjinxin/tensorflow-mnist-tutorial


matplotlib標(biāo)準(zhǔn)模式

plt.figure(num=5, figsize=(8,5),)
#plt.figure(num='newimage', figsize=(8,5),)
plt.title('The image title', color='#0000FF')
plt.imshow(lena) # 顯示圖片
plt.axis('off') # 不顯示坐標(biāo)軸
plt.show()

CSDN-markdown編輯器語法——字體、字號與顏色


New function:Plotting with matplotlib

%matplotlib inline
%matplotlib notebook

%matplotlib inline
import matplotlib.pyplot as plt

X = np.random.normal(size=(12, 2))
plt.scatter(X[:, 0], X[:, 1])
plt.plot(X[:, 0])
# create a new figure
plt.figure()
plt.plot(X[:, 0])
2.png
%matplotlib notebook
import matplotlib.pyplot as plt

X = np.random.normal(size=(12, 2))
plt.scatter(X[:, 0], X[:, 1])
plt.plot(X[:, 0])

# create a new figure
plt.figure()
plt.plot(X[:, 0])

1.png

Plotting with matplotlib

Need to use either

% matplotlib inline

or

% matplotlib notebook

Only one in each notebook! using inline will just sent png images to browser, using notebook will provide interactivity and allow updating old figures. With notebook you need to make sure to create a new figure before plotting, otherwise the last one will be updated!


# 1映凳、顯示圖片
import matplotlib.pyplot as plt #plt 用于顯示圖片
import matplotlib.image as mpimg #mpimg 用于讀取圖片
import numpy as np
lena = mpimg.imread('lena.png') #讀取和代碼處于同一目錄下的lena.png
# 此時 lena 就已經(jīng)是一個 np.array 了作儿,可以對它進(jìn)行任意處理
lena.shape #(512, 512, 3)
plt.figure(num=1, figsize=(8,5),)
plt.title('The image title')
plt.imshow(lena) # 顯示圖片
plt.axis('off') # 不顯示坐標(biāo)軸
plt.show()
# 2霎槐、顯示圖片的第一個通道
lena_1 = lena[:,:,0]
plt.figure(num=2, figsize=(8,5),)
plt.imshow('lena_1')
plt.title('The image title')
plt.axis('off')
plt.show()

# 此時會發(fā)現(xiàn)顯示的是熱量圖咨堤,不是我們預(yù)想的灰度圖埂伦,可以添加 cmap 參數(shù)仔蝌,有如下幾種添加方法:
#方法一
plt.figure(num=1, figsize=(8,5),)
plt.imshow('lena_1', cmap='Greys_r')
plt.title('The image title')
plt.axis('off')
plt.show()

#方法二
plt.figure(num=2, figsize=(8,5),)
img = plt.imshow('lena_1')
img.set_cmap('gray') # 'hot' 是熱量圖
plt.title('The image title')
plt.axis('off')
plt.show()

#3泛领、將 RGB 轉(zhuǎn)為灰度圖
def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

gray = rgb2gray(lena)    
# 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.figure(num=3, figsize=(8,5),)
plt.imshow(gray, cmap='Greys_r')
plt.title('The image title')
plt.axis('off')
plt.show()
#4、對圖像進(jìn)行放縮
from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5) # 第二個參數(shù)如果是整數(shù)敛惊,則為百分比渊鞋,如果是tuple,則為輸出圖像的尺寸
plt.figure(num=4, figsize=(8,5),)
plt.imshow(lena_new_sz)
plt.title('The image title')
plt.axis('off')
plt.show()

附上imresize的用法
功能:改變圖像的大小瞧挤。
用法:
B = imresize(A,m)
B = imresize(A,m,method)
B = imresize(A,[mrows ncols],method)
B = imresize(...,method,n)
B = imresize(...,method,h)

imrersize函數(shù)使用由參數(shù)method指定的插值運算來改變圖像的大小锡宋。
method的幾種可選值:
'nearest'(默認(rèn)值)最近鄰插值
'bilinear'雙線性插值
'bicubic'雙三次插值
B = imresize(A,m)表示把圖像A放大m倍
B = imresize(...,method,h)中的h可以是任意一個FIR濾波器(h通常由函數(shù)ftrans2、fwind1特恬、fwind2执俩、或fsamp2等生成的二維FIR濾波器)。
#5癌刽、保存 matplotlib 畫出的圖像
plt.savefig('lena_new_sz.png')

#5役首、將 array 保存為圖像
from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)

#5尝丐、直接保存 array
#讀取之后還是可以按照前面顯示數(shù)組的方法對圖像進(jìn)行顯示,這種方法完全不會對圖像質(zhì)量造成損失
np.save('lena_new_sz', lena_new_sz) # 會在保存的名字后面自動加上.npy
img = np.load('lena_new_sz.npy') # 讀取前面保存的數(shù)組

matplotlib畫圖清空圖片

fig = plt.figure(0) # 新圖 0
plt.savefig() # 保存
plt. close(0) # 關(guān)閉圖 0

還有簡便的 plt.close('all') 關(guān)閉所有圖,不用管 fig 號碼

fig = plt.figure() # 新圖 0
plt.savefig() # 保存
plt.close('all') # 關(guān)閉圖 0

matplotlib-數(shù)據(jù)可視化

Some plots from these tutorials:


Annotation

Scatter

Bars

Contours

Image

3D plot

Subplot

plot in plot


單個圖像繪制

import matplotlib.pyplot as plt
import numpy as np
#使用np.linspace定義x:范圍是(-1,1);個數(shù)是50. 仿真一維數(shù)據(jù)組(x ,y)表示曲線1
x = np.linspace(-1,1,50)
y = 2*x +1
#使用plt.figure定義一個圖像窗口. 使用plt.plot畫(x ,y)曲線. 使用plt.show顯示圖像
plt.figure(num=1, figsize=(8,5),)
plt.plot(x,y)
plt.show()
figure 圖像80

多個圖像繪制和同一個figure多個圖片

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x
y2 = x**2

plt.figure(num=2, figsize=(8,5),)
plt.plot(x, y1)
plt.show()

plt.figure(num=3, figsize=(8,5),)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--)
plt.plot(x,y2)
plt.show()
figure 圖像81

設(shè)置坐標(biāo)軸1

調(diào)整名字和間隔

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
#使用plt.figure定義一個圖像窗口. 使用plt.plot畫(x ,y2)曲線. 使用plt.plot畫(x ,y1)曲線衡奥,曲線的顏色屬性(color)為紅色;曲線的寬度(linewidth)為1.0爹袁;曲線的類型(linestyle)為虛線.
plt.figure()
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')

#使用plt.xlim設(shè)置x坐標(biāo)軸范圍:(-1, 2); 使用plt.ylim設(shè)置y坐標(biāo)軸范圍:(-2, 3)矮固; 使用plt.xlabel設(shè)置x坐標(biāo)軸名稱:’I am x’失息; 使用plt.ylabel設(shè)置y坐標(biāo)軸名稱:’I am y’;
plt.xlim((-1, 2))
plt.ylim((-2, 3))
plt.xlabel('I am x')
plt.ylabel('I am y')
plt.show()

設(shè)置坐標(biāo)軸184
#使用np.linspace定義范圍以及個數(shù):范圍是(-1,2);個數(shù)是5. 使用print打印出新定義的范圍. 使用plt.xticks設(shè)置x軸刻度:范圍是(-1,2);個數(shù)是5.
new_ticks = np.linspace(-1, 2, 5)
print(new_ticks)
plt.xticks(new_ticks)
使用plt.yticks設(shè)置y軸刻度以及名稱:刻度為[-2, -1.8, -1, 1.22, 3]乏屯;對應(yīng)刻度的名稱為[‘really bad’,’bad’,’normal’,’good’, ‘really good’]. 使用plt.show顯示圖像
plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad\ \alphas$', r'$normal$', r'$good$', r'$really\ good$'])
plt.show()
#r 正則表達(dá)根时,改變字體加$.  \alphas,轉(zhuǎn)字符\辰晕。
設(shè)置坐標(biāo)軸185

設(shè)置坐標(biāo)軸2

設(shè)置不同名字和位置

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

plt.figure()
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.xlim((-1, 2))
plt.ylim((-2, 3))

new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
plt.yticks([-2, -1.8, -1, 1.22, 3],['$really\ bad$', '$bad$', '$normal$', '$good$', '$really\ good$'])

#使用plt.gca獲取當(dāng)前坐標(biāo)軸信息get current axis. 使用.spines設(shè)置邊框:右側(cè)邊框蛤迎;使用.set_color設(shè)置邊框顏色:默認(rèn)白色; 使用.spines設(shè)置邊框:上邊框;使用.set_color設(shè)置邊框顏色:默認(rèn)白色斯够;
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()
#spines脊梁雌隅,實際上是四個邊框。

設(shè)置坐標(biāo)軸288

調(diào)整坐標(biāo)軸

#使用.xaxis.set_ticks_position設(shè)置x坐標(biāo)刻度數(shù)字或名稱的位置:bottom.(所有位置:top辆童,bottom,both惠赫,default把鉴,none)
ax.xaxis.set_ticks_position('bottom')
#使用.spines設(shè)置邊框:x軸;使用.set_position設(shè)置邊框位置:y=0的位置儿咱;(位置所有屬性:outward庭砍,axes,data)
ax.spines['bottom'].set_position(('data', 0))
plt.show()

設(shè)置坐標(biāo)軸289
#使用.yaxis.set_ticks_position設(shè)置y坐標(biāo)刻度數(shù)字或名稱的位置:left.(所有位置:left混埠,right怠缸,both,default钳宪,none)
ax.yaxis.set_ticks_position('left')

#使用.spines設(shè)置邊框:y軸揭北;使用.set_position設(shè)置邊框位置:x=0的位置;(位置所有屬性:outward吏颖,axes搔体,data) 使用plt.show顯示圖像.

ax.spines['left'].set_position(('data',0))
plt.show()

設(shè)置坐標(biāo)軸290

Legend 圖例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

plt.figure()
# set x limits
plt.xlim((-1, 2))
plt.ylim((-2, 3))

# set new sticks
new_sticks = np.linspace(-1, 2, 5)
plt.xticks(new_sticks)
# set tick labels
plt.yticks([-2, -1.8, -1, 1.22, 3],
           [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
#本節(jié)中我們將對圖中的兩條線繪制圖例,首先我們設(shè)置兩條線的類型等信息(藍(lán)色實線與紅色虛線).
l1, = plt.plot(x, y2, label='linear line')
l2, = plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--', label='square line')
#egend將要顯示的信息來自于上面代碼中的 label. 所以我們只需要簡單寫下一下代碼, plt 就能自動的為我們添加圖例.
plt.legend(loc='upper right')

參數(shù)loc='upper right'
表示圖例將添加在圖中的右上角.


Legend 圖例93

調(diào)整位置和名稱

#如果我們想單獨修改之前的 label 信息, 給不同類型的線條設(shè)置圖例信息. 我們可以在 plt.legend 輸入更多參數(shù). 如果以下面這種形式添加 legend, 我們需要確保, 在上面的代碼 plt.plot(x, y2, label='linear line') 和 plt.plot(x, y1, label='square line') 中有用變量 l1 和 l2 分別存儲起來. 而且需要注意的是 l1, l2,要以逗號結(jié)尾, 因為plt.plot() 返回的是一個列表.

plt.legend(handles=[l1, l2], labels=['up', 'down'],  loc='best')
# the "," is very important in here l1, = plt... and l2, = plt... for this step
"""legend( handles=(line1, line2, line3),
           labels=('label1', 'label2', 'label3'),
           'upper right')
    The *loc* location codes are::
          'best' : 0,          (currently not supported for figure legends)
          'upper right'  : 1,
          'upper left'   : 2,
          'lower left'   : 3,
          'lower right'  : 4,
          'right'        : 5,
          'center left'  : 6,
          'center right' : 7,
          'lower center' : 8,
          'upper center' : 9,
          'center'       : 10,"""

plt.show()

最后我們得到帶有圖例信息的圖片.


Legend 圖例94

Annotation 標(biāo)注

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 2*x + 1

plt.figure(num=1, figsize=(8, 5),)
plt.plot(x, y,)

Annotation 標(biāo)注97

移動坐標(biāo)

然后我們挪動坐標(biāo)軸的位置.

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
Annotation 標(biāo)注98

然后標(biāo)注出點(x0, y0)的位置信息. 用plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
畫出一條垂直于x軸的虛線.

x0 = 1
y0 = 2*x0 + 1
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)#虛線侦高, k代表黑色 -- 虛線
plt.scatter([x0, ], [y0, ], s=50, color='b')# 散點圖
Annotation 標(biāo)注99

添加注釋 annotate
接下來我們就對(x0, y0)這個點進(jìn)行標(biāo)注.

# method 1:
#####################
plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30),
             textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))

其中參數(shù)xycoords='data'
是說基于數(shù)據(jù)的值來選位置,xytext=(+30, -30)
和textcoords='offset points'
對于標(biāo)注位置的描述 和 xy 偏差值,arrowprops
是對圖中箭頭類型的一些設(shè)置.


Annotation 標(biāo)注100

添加注釋 text

# method 2:
########################
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={'size': 16, 'color': 'r'})

plt.show()

其中-3.7, 3,
是選取text的位置, 空格需要用到轉(zhuǎn)字符
,fontdict
設(shè)置文本字體.

Annotation 標(biāo)注101

tick 能見度

生成圖形
當(dāng)圖片中的內(nèi)容較多嫉柴,相互遮蓋時,我們可以通過設(shè)置相關(guān)內(nèi)容的透明度來使圖片更易于觀察奉呛,也即是通過本節(jié)中的bbox
參數(shù)設(shè)置來調(diào)節(jié)圖像信息.
首先參考之前的例子, 我們先繪制圖像基本信息:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 0.1*x

plt.figure()
plt.plot(x, y, linewidth=10)
plt.ylim(-2, 2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))


tick 能見度104

調(diào)整坐標(biāo)

然后對被遮擋的圖像調(diào)節(jié)相關(guān)透明度计螺,本例中設(shè)置 x軸 和 y軸 的刻度數(shù)字進(jìn)行透明度設(shè)置

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.7))
plt.show()

其中l(wèi)abel.set_fontsize(12)重新調(diào)節(jié)字體大小夯尽,bbox設(shè)置目的內(nèi)容的透明度相關(guān)參,facecolor調(diào)節(jié) box 前景色登馒,edgecolor 設(shè)置邊框匙握, 本處設(shè)置邊框為無,alpha設(shè)置透明度. 最終結(jié)果如下:

tick 能見度105

Scatter 散點圖

散點圖
首先陈轿,先引入matplotlib.pyplot簡寫作plt,再引入模塊numpy用來產(chǎn)生一些隨機數(shù)據(jù)圈纺。生成1024個呈標(biāo)準(zhǔn)正態(tài)分布的二維數(shù)據(jù)組 (平均數(shù)是0,方差為1) 作為一個數(shù)據(jù)集麦射,并圖像化這個數(shù)據(jù)集蛾娶。每一個點的顏色值用T來表示:

import matplotlib.pyplot as plt
import numpy as np

n = 1024    # data size
X = np.random.normal(0, 1, n) # 每一個點的X值
Y = np.random.normal(0, 1, n) # 每一個點的Y值
T = np.arctan2(Y,X) # for color value

數(shù)據(jù)集生成完畢,現(xiàn)在來用scatterplot這個點集潜秋,鼠標(biāo)點上去蛔琅,可以看到這個函數(shù)的各個parameter的描述,如下圖:
輸入X和Y作為location峻呛,size=75罗售,顏色為T,color map用默認(rèn)值钩述,透明度alpha 為 50%寨躁。 x軸顯示范圍定位(-1.5,1.5)牙勘,并用xtick()函數(shù)來隱藏x坐標(biāo)軸职恳,y軸同理:

plt.scatter(X, Y, s=75, c=T, alpha=.5)

plt.xlim(-1.5, 1.5)
plt.xticks(())  # ignore xticks
plt.ylim(-1.5, 1.5)
plt.yticks(())  # ignore yticks

plt.show()

Bar 柱狀圖

今天的柱狀圖分成上下兩部分,每一個柱體上都有相應(yīng)的數(shù)值標(biāo)注方面,并且取消坐標(biāo)軸的顯示话肖。
生成基本圖形
向上向下分別生成12個數(shù)據(jù),X為 0 到 11 的整數(shù) 葡幸,Y是相應(yīng)的均勻分布的隨機數(shù)據(jù)。使用的函數(shù)是plt.bar
贺氓,參數(shù)為X和Y:

import matplotlib.pyplot as plt
import numpy as np

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1)
plt.bar(X, -Y2)

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

plt.show()

這樣我們就生成了下圖所示的柱狀圖基本框架:

Bar 柱狀圖113

加顏色和數(shù)據(jù)
下面我們就顏色和數(shù)值進(jìn)行優(yōu)化蔚叨。用facecolor設(shè)置主體顏色,edgecolor設(shè)置邊框顏色為白色辙培,

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

現(xiàn)在的結(jié)果呈現(xiàn):


Bar 柱狀圖114

接下來我們用函數(shù)plt.text分別在柱體上方(下方)加上數(shù)值蔑水,用%.2f保留兩位小數(shù),橫向居中對齊ha='center'扬蕊,縱向底部(頂部)對齊va='bottom':

for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')

最終的結(jié)果就像開始一樣:


Bar 柱狀圖115

Contours 等高線圖

畫等高線
數(shù)據(jù)集即三維點 (x,y) 和對應(yīng)的高度值搀别,共有256個點。高度值使用一個 height function f(x,y) 生成尾抑。 x, y 分別是在區(qū)間 [-3,3] 中均勻分布的256個值歇父,并用meshgrid在二維平面中將每一個x和每一個y分別對應(yīng)起來蒂培,編織成柵格:

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    # the height function
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)

接下來進(jìn)行顏色填充。使用函數(shù)plt.contourf把顏色加進(jìn)去榜苫,fill, 位置參數(shù)分別為:X, Y, f(X,Y)护戳。透明度0.75,并將 f(X,Y) 的值對應(yīng)到color map的暖色組中尋找對應(yīng)顏色垂睬。8代表等高線的個數(shù)媳荒。

# use plt.contourf to filling contours
# X, Y and value for (X,Y) point
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
image.png

接下來進(jìn)行等高線繪制。使用plt.contour函數(shù)劃線驹饺。位置參數(shù)為:X, Y, f(X,Y)钳枕。顏色選黑色,線條寬度選0.5∩鸵迹現(xiàn)在的結(jié)果如下圖所示鱼炒,只有顏色和線條,還沒有數(shù)值Label:

# use plt.contour to add contour lines
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
image.png

添加高度數(shù)字
其中卡儒,8代表等高線的密集程度田柔,這里被分為10個部分。如果是0骨望,則圖像被一分為二硬爆。
最后加入Label,inline控制是否將Label畫在線里面擎鸠,字體大小為10缀磕。并將坐標(biāo)軸隱藏:

plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())
image.png
plt.clabel(C, inline=False, fontsize=10)
plt.xticks(())
plt.yticks(())
image.png

Image 圖片

隨機矩陣畫圖

這一節(jié)我們講解怎樣在matplotlib中打印出圖像。這里我們打印出的是純粹的數(shù)字劣光,而非自然圖像袜蚕。 我們今天用這樣 3x3 的 2D-array 來表示點的顏色,每一個點就是一個pixel绢涡。

import matplotlib.pyplot as plt
import numpy as np

a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)

plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')

image.png
plt.imshow(a, interpolation='nearest', cmap='bone', origin='upper')

image.png

colorbar
下面我們添加一個colorbar 牲剃,其中我們添加一個shrink參數(shù),使colorbar的長度變短為原來的92%:

plt.colorbar(shrink=.92)

plt.xticks(())
plt.yticks(())
plt.show()
image.png

3D 數(shù)據(jù)

3D
首先在進(jìn)行 3D Plot 時除了導(dǎo)入 matplotlib 雄可,還要額外添加一個模塊凿傅,即 Axes 3D 3D 坐標(biāo)軸顯示:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

之后要先定義一個圖像窗口,在窗口上添加3D坐標(biāo)軸数苫,顯示成下圖:

fig = plt.figure()
ax = Axes3D(fig)
image.png

接下來給進(jìn) X 和 Y 值聪舒,并將 X 和 Y 編織成柵格。每一個(X, Y)點對應(yīng)的高度值我們用下面這個函數(shù)來計算虐急。

# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)    # x-y 平面的網(wǎng)格
R = np.sqrt(X ** 2 + Y ** 2)
# height value
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))

其中箱残,rstride 和 cstride 分別代表 row 和 column 的跨度。
下面兩個圖分別是跨度為1 和 5 的效果:

image.png
image.png

投影

下面添加 XY 平面的等高線:

ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))
ax.set_zlim(-2, 2)
image.png
image.png
ax.contourf(X, Y, Z, zdir='x', offset=-4, cmap=plt.get_cmap('rainbow'))
plt.show()

如果 zdir 選擇了x止吁,那么效果將會是對于 XZ 平面的投影被辑,效果如下

image.png

Subplot 多合一顯示

均勻圖中圖
matplotlib 是可以組合許多的小圖, 放在一張大圖里面顯示的. 使用到的方法叫作 subplot.
使用import導(dǎo)入matplotlib.pyplot模塊, 并簡寫成plt. 使用plt.figure創(chuàng)建一個圖像窗口.

import matplotlib.pyplot as plt
plt.figure()

使用plt.subplot來創(chuàng)建小圖. plt.subplot(2,2,1)表示將整個圖像窗口分為2行2列, 當(dāng)前位置為1. 使用plt.plot([0,1],[0,1])在第1個位置創(chuàng)建一個小圖.
plt.subplot(2,2,2)表示將整個圖像窗口分為2行2列, 當(dāng)前位置為2. 使用plt.plot([0,1],[0,2])在第2個位置創(chuàng)建一個小圖.
plt.subplot(2,2,3)表示將整個圖像窗口分為2行2列,當(dāng)前位置為3. plt.subplot(2,2,3)可以簡寫成plt.subplot(223), matplotlib同樣可以識別. 使用plt.plot([0,1],[0,3])在第3個位置創(chuàng)建一個小圖.
plt.subplot(224)表示將整個圖像窗口分為2行2列, 當(dāng)前位置為4. 使用plt.plot([0,1],[0,4])在第4個位置創(chuàng)建一個小圖.

plt.subplot(2,2,1)
plt.plot([0,1],[0,1])
plt.subplot(2,2,2)
plt.plot([0,1],[0,2])
plt.subplot(223)
plt.plot([0,1],[0,3])
plt.subplot(224)
plt.plot([0,1],[0,4])
plt.show()  # 展示

image.png

不均勻圖中圖
如果希望展示的小圖的大小不相同, 應(yīng)該怎么做呢? 以上面的4個小圖為例, 如果把第1個小圖放到第一行, 而剩下的3個小圖都放到第二行.
使用plt.subplot(2,1,1)將整個圖像窗口分為2行1列, 當(dāng)前位置為1. 使用plt.plot([0,1],[0,1])在第1個位置創(chuàng)建一個小圖.
使用plt.subplot(2,3,4)將整個圖像窗口分為2行3列, 當(dāng)前位置為4. 使用plt.plot([0,1],[0,2])在第4個位置創(chuàng)建一個小圖.
這里需要解釋一下為什么第4個位置放第2個小圖. 上一步中使用plt.subplot(2,1,1)將整個圖像窗口分為2行1列, 第1個小圖占用了第1個位置, 也就是整個第1行. 這一步中使用plt.subplot(2,3,4)將整個圖像窗口分為2行3列, 于是整個圖像窗口的第1行就變成了3列, 也就是成了3個位置, 于是第2行的第1個位置是整個圖像窗口的第4個位置.

使用plt.subplot(235)將整個圖像窗口分為2行3列,當(dāng)前位置為5. 使用plt.plot([0,1],[0,3])在第5個位置創(chuàng)建一個小圖. 同上, 再創(chuàng)建plt.subplot(236).

import matplotlib.pyplot as plt
plt.figure()
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])

plt.subplot(2,3,4)
plt.plot([0,1],[0,2])
plt.subplot(235)
plt.plot([0,1],[0,3])

plt.subplot(236)
plt.plot([0,1],[0,4])

plt.show()  # 展示
image.png

Subplot 分格顯示

subplot2grid
使用import導(dǎo)入matplotlib.pyplot模塊, 并簡寫成plt. 使用plt.figure()創(chuàng)建一個圖像窗口

import matplotlib.pyplot as plt
plt.figure()

使用plt.subplot2grid來創(chuàng)建第1個小圖, (3,3)表示將整個圖像窗口分成3行3列, (0,0)表示從第0行第0列開始作圖燎悍,colspan=3表示列的跨度為3, rowspan=1表示行的跨度為1. colspan和rowspan缺省, 默認(rèn)跨度為1.

ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.plot([1, 2], [1, 2])    # 畫小圖
ax1.set_title('ax1_title')  # 設(shè)置小圖的標(biāo)題

使用plt.subplot2grid來創(chuàng)建第2個小圖, (3,3)表示將整個圖像窗口分成3行3列, (1,0)表示從第1行第0列開始作圖,colspan=2表示列的跨度為2. 同上畫出 ax3, (1,2)表示從第1行第2列開始作圖敷待,rowspan=2表示行的跨度為2. 再畫一個 ax4 和 ax5, 使用默認(rèn) colspan, rowspan.

ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax5 = plt.subplot2grid((3, 3), (2, 1))
image.png

使用ax4.scatter創(chuàng)建一個散點圖, 使用ax4.set_xlabel和ax4.set_ylabel來對x軸和y軸命名.

ax4.scatter([1, 2], [2, 2])
ax4.set_xlabel('ax4_x')
ax4.set_ylabel('ax4_y')
image.png

gridspec
使用import導(dǎo)入matplotlib.pyplot模塊, 并簡寫成plt. 使用import導(dǎo)入matplotlib.gridspec, 并簡寫成gridspec

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

使用plt.figure()創(chuàng)建一個圖像窗口, 使用gridspec.GridSpec將整個圖像窗口分成3行3列.

plt.figure()
gs = gridspec.GridSpec(3, 3)

使用plt.subplot來作圖, gs[0, :]表示這個圖占第0行和所有列, gs[1, :2]表示這個圖占第1行和第2列前的所有列, gs[1:, 2]表示這個圖占第1行后的所有行和第2列, gs[-1, 0]表示這個圖占倒數(shù)第1行和第0列, gs[-1, -2]表示這個圖占倒數(shù)第1行和倒數(shù)第2列.

ax6 = plt.subplot(gs[0, :])
ax7 = plt.subplot(gs[1, :2])
ax8 = plt.subplot(gs[1:, 2])
ax9 = plt.subplot(gs[-1, 0])
ax10 = plt.subplot(gs[-1, -2])
image.png

subplots
使用plt.subplots建立一個2行2列的圖像窗口间涵,sharex=True表示共享x軸坐標(biāo), sharey=True表示共享y軸坐標(biāo). ((ax11, ax12), (ax13, ax14))表示第1行從左至右依次放ax11和ax12, 第2行從左至右依次放ax13和ax14.

f, ((ax11, ax12), (ax13, ax14)) = plt.subplots(2, 2, sharex=True, sharey=True)

使用ax11.scatter創(chuàng)建一個散點圖.

ax11.scatter([1,2], [1,2])

plt.tight_layout()表示緊湊顯示圖像, plt.show()表示顯示圖像.

plt.tight_layout()
plt.show()
image.png

圖中圖

數(shù)據(jù)

# 導(dǎo)入pyplot模塊
import matplotlib.pyplot as plt

# 初始化figure
fig = plt.figure()

# 創(chuàng)建數(shù)據(jù)
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]

大圖
接著,我們來繪制大圖榜揖。首先確定大圖左下角的位置以及寬高:

left, bottom, width, height = 0.1, 0.1, 0.8, 0.8

注意勾哩,4個值都是占整個figure坐標(biāo)系的百分比。在這里举哟,假設(shè)figure的大小是10x10思劳,那么大圖就被包含在由(1, 1)開始,寬8妨猩,高8的坐標(biāo)系內(nèi)潜叛。
將大圖坐標(biāo)系添加到figure中,顏色為r(red)壶硅,取名為title:

ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')

image.png

小圖
接著威兜,我們來繪制左上角的小圖,步驟和繪制大圖一樣庐椒,注意坐標(biāo)系位置和大小的改變:

eft, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(y, x, 'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')

image.png

最后椒舵,我們來繪制右下角的小圖。這里我們采用一種更簡單方法约谈,即直接往plt里添加新的坐標(biāo)系:

plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1], x, 'g') # 注意對y進(jìn)行了逆序處理
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')
plt.show()
image.png

次坐標(biāo)軸

第一個y坐標(biāo)
有時候我們會用到次坐標(biāo)軸笔宿,即在同個圖上有第2個y軸存在。同樣可以用matplotlib做到棱诱,而且很簡單泼橘。
首先,我們做一些準(zhǔn)備工作:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 * y1

可以看到迈勋,y2和y1是互相倒置的炬灭。接著,獲取figure默認(rèn)的坐標(biāo)系 ax1:

fig, ax1 = plt.subplots()

第二個y坐標(biāo)
對ax1調(diào)用twinx()方法靡菇,生成如同鏡面效果后的ax2:

ax2 = ax1.twinx()

接著進(jìn)行繪圖, 將 y1, y2 分別畫在 ax1, ax2 上:

ax1.plot(x, y1, 'g-')   # green, solid line
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.plot(x, y2, 'b-') # blue
ax2.set_ylabel('Y2 data', color='b')
plt.show()
image.png

Animation 動畫

定義方程
使用matplotlib做動畫也是可以的担败,我們使用其中一種方式,function animation來說說镰官,具體可參考matplotlib animation api。首先吗货,我們做一些準(zhǔn)備工作:

from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np
fig, ax = plt.subplots()

我們的數(shù)據(jù)是一個0~2π內(nèi)的正弦曲線:

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))
Animation 動畫99

接著泳唠,構(gòu)造自定義動畫函數(shù)animate,用來更新每一幀上各個x對應(yīng)的y坐標(biāo)值宙搬,參數(shù)表示第i幀

def animate(i):
    line.set_ydata(np.sin(x + i/10.0))
    return line,

然后笨腥,構(gòu)造開始幀函數(shù)init:

def init():
    line.set_ydata(np.sin(x))
    return line,

參數(shù)設(shè)置
接下來拓哺,我們調(diào)用FuncAnimation函數(shù)生成動畫。參數(shù)說明:

fig 進(jìn)行動畫繪制的figure
func 自定義動畫函數(shù)脖母,即傳入剛定義的函數(shù)animate
frames 動畫長度士鸥,一次循環(huán)包含的幀數(shù)
init_func 自定義開始幀,即傳入剛定義的函數(shù)init
interval 更新頻率谆级,以ms計
blit 選擇更新所有點烤礁,還是僅更新產(chǎn)生變化的點。應(yīng)選擇True肥照,但mac用戶請選擇False脚仔,否則無法顯示動畫
ani = animation.FuncAnimation(fig=fig,
                              func=animate,
                              frames=100,
                              init_func=init,
                              interval=20,
                              blit=False)
plt.show()

當(dāng)然,你也可以將動畫以mp4格式保存下來舆绎,但首先要保證你已經(jīng)安裝了ffmpeg
或者mencoder
鲤脏,更多信息參考matplotlib animation api:

anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吕朵,隨后出現(xiàn)的幾起案子猎醇,更是在濱河造成了極大的恐慌,老刑警劉巖努溃,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫嘶,死亡現(xiàn)場離奇詭異,居然都是意外死亡茅坛,警方通過查閱死者的電腦和手機音半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贡蓖,“玉大人曹鸠,你說我怎么就攤上這事〕馄蹋” “怎么了彻桃?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晾蜘。 經(jīng)常有香客問我邻眷,道長,這世上最難降的妖魔是什么剔交? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任肆饶,我火速辦了婚禮,結(jié)果婚禮上岖常,老公的妹妹穿的比我還像新娘驯镊。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布板惑。 她就那樣靜靜地躺著橄镜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冯乘。 梳的紋絲不亂的頭發(fā)上洽胶,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音裆馒,去河邊找鬼姊氓。 笑死,一個胖子當(dāng)著我的面吹牛领追,可吹牛的內(nèi)容都是我干的他膳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绒窑,長吁一口氣:“原來是場噩夢啊……” “哼棕孙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起些膨,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蟀俊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后订雾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肢预,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年洼哎,在試婚紗的時候發(fā)現(xiàn)自己被綠了烫映。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡噩峦,死狀恐怖锭沟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情识补,我是刑警寧澤族淮,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站凭涂,受9級特大地震影響祝辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜切油,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一蝙斜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澎胡,春花似錦孕荠、人聲如沸绢片。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巢株,卻和暖如春槐瑞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阁苞。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工困檩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人那槽。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓悼沿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骚灸。 傳聞我的和親對象是個殘疾皇子糟趾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Matplotlib安裝 MacOS Linux 基本用法 Module的導(dǎo)入: 畫出一條直線: 使用plt.fi...
    Sun_atom閱讀 909評論 0 0
  • Matplotlib 入門教程 來源:Introduction to Matplotlib and basic l...
    布客飛龍閱讀 31,766評論 5 162
  • 牛刀小試 導(dǎo)入類庫:import matplotlib.pyplot as plt 畫圖:plt.plot([1,...
    Manfestain閱讀 2,951評論 0 2
  • [鏈接] 01. matplotlib API入門 02. Pandas中的繪圖函數(shù) 03. 繪制地圖:圖形化顯示...
    進(jìn)步小小青年閱讀 2,909評論 0 2
  • №26 周密思考的工具 我們都希望能周全地進(jìn)行思考,但實際生活中很難做到滴水不漏甚牲,這是因為幾個心理機制的限制: 一...
    楊心武閱讀 893評論 0 0