Python matplotlib庫

1、Matplotlib簡介

matplotlib是基于python語言的開源項目,旨在為python提供一個數據繪圖包。我將在這篇文章中介紹matplotlib API的核心對象,并介紹如何使用這些對象來實現繪圖。實際上,matplotlib的對象體系嚴謹而有趣,為使用者提供了巨大的發揮空間。用戶在熟悉了核心對象之后,可以輕易的定制圖像。matplotlib的對象體系也是計算機圖形學的一個優秀范例。即使你不是python程序員,你也可以從文中了解一些通用的圖形繪制原則。matplotlib使用numpy進行數組運算,并調用一系列其他的python庫來實現硬件交互。matplotlib的核心是一套由對象構成的繪圖API。

你需要安裝python, numpy和matplotlib。(可以到python.org下載python編譯器。相關python包的安裝,請參看我的Python小技巧)

matplotlib的官網: http://matplotlib.org/? 官網有豐富的圖例和文檔說明。

github地址為:https://github.com/matplotlib

2、Matplotlib安裝

有時候利用python需要安裝matplotlib進行繪圖,可以輸入如下命令:

pip install matplotlib

3. Matplotlib導入

import matplotlib.pyplot as plt#為方便簡介為plt

import numpy as np#畫圖過程中會使用numpy

import pandas as pd#畫圖過程中會使用pandas

4、Matplotlib基本應用

x=np.linspace(-1,1,50)#定義x數據范圍

y1=2*x+1#定義y數據范圍

y2=x**2

plt.figure()#定義一個圖像窗口

plt.plot(x,y1)#plot()畫出曲線

plt.show()#顯示圖像

matplotlib的figure為單獨圖像窗口,小窗口內還可以有更多的小圖片。

x=np.linspace(-3,3,50)#50為生成的樣本數

y1=2*x+1

y2=x**2

plt.figure(num=1,figsize=(8,5))#定義編號為1 大小為(8,5)

plt.plot(x,y1,color='red',linewidth=2,linestyle='--')#顏色為紅色,線寬度為2,線風格為--

plt.plot(x,y2)#進行畫圖

plt.show()#顯示圖

設置坐標軸

x=np.linspace(-3,3,50)

y1=2*x+1

y2=x**2

plt.figure(num=2,figsize=(8,5))

plt.plot(x,y1,color='red',linewidth=2,linestyle='-')

plt.plot(x,y2)#進行畫圖

plt.xlim(-1,2)

plt.ylim(-2,3)

plt.xlabel("I'm x")

plt.ylabel("I'm y")

plt.show()

自定義坐標軸

x=np.linspace(-3,3,50)

y1=2*x+1

y2=x**2

plt.figure(num=2,figsize=(8,5))

plt.plot(x,y1,color='red',linewidth=2,linestyle='-')

plt.plot(x,y2)#進行畫圖

plt.xlim(-1,2)

plt.ylim(-2,3)

plt.xlabel("I'm x")

plt.ylabel("I'm y")

new_ticks=np.linspace(-1,2,5)#小標從-1到2分為5個單位

print(new_ticks)

#[-1.? -0.25? 0.5? 1.25? 2.? ]

plt.xticks(new_ticks)#進行替換新下標

plt.yticks([-2,-1,1,2,],

? ? ? ? ? [r'$really\ bad$','$bad$','$well$','$really\ well$'])

plt.show()

設置邊框屬性

x=np.linspace(-3,3,50)

y1=2*x+1

y2=x**2

plt.figure(num=2,figsize=(8,5))

plt.plot(x,y1,color='red',linewidth=2,linestyle='--')

plt.plot(x,y2)#進行畫圖

plt.xlim(-1,2)

plt.ylim(-2,3)

new_ticks=np.linspace(-1,2,5)#小標從-1到2分為5個單位

plt.xticks(new_ticks)#進行替換新下標

plt.yticks([-2,-1,1,2,],

? ? ? ? ? [r'$really\ bad$','$bad$','$well$','$really\ well$'])

ax=plt.gca()#gca=get current axis

ax.spines['right'].set_color('none')#邊框屬性設置為none 不顯示

ax.spines['top'].set_color('none')

plt.show()

調整移動坐標軸

x=np.linspace(-3,3,50)

y1=2*x+1

y2=x**2

plt.figure(num=2,figsize=(8,5))

plt.plot(x,y1,color='red',linewidth=2,linestyle='--')

plt.plot(x,y2)#進行畫圖

plt.xlim(-1,2)

plt.ylim(-2,3)

new_ticks=np.linspace(-1,2,5)#小標從-1到2分為5個單位

plt.xticks(new_ticks)#進行替換新下標

plt.yticks([-2,-1,1,2,],

? ? ? ? ? [r'$really\ bad$','$bad$','$well$','$really\ well$'])

ax=plt.gca()#gca=get current axis

ax.spines['right'].set_color('none')#邊框屬性設置為none 不顯示

ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')#使用xaxis.set_ticks_position設置x坐標刻度數字或名稱的位置 所有屬性為top、bottom、both、default、none

ax.spines['bottom'].set_position(('data', 0))#使用.spines設置邊框x軸;使用.set_position設置邊框位置,y=0位置 位置所有屬性有outward、axes、data

ax.yaxis.set_ticks_position('left')

ax.spines['left'].set_position(('data',0))#坐標中心點在(0,0)位置

plt.show()

matplotlib中legend圖例幫助我們展示數據對應的圖像名稱。

x=np.linspace(-3,3,50)

y1=2*x+1

y2=x**2

plt.figure(num=2,figsize=(8,5))

plt.xlim(-1,2)

plt.ylim(-2,3)

new_ticks=np.linspace(-1,2,5)#小標從-1到2分為5個單位

plt.xticks(new_ticks)#進行替換新下標

plt.yticks([-2,-1,1,2,],

? ? ? ? ? [r'$really\ bad$','$bad$','$well$','$really\ well$'])

l1,=plt.plot(x,y1,color='red',linewidth=2,linestyle='--',label='linear line')

l2,=plt.plot(x,y2,label='square line')#進行畫圖

plt.legend(loc='best')#顯示在最好的位置

plt.show()#顯示圖


5、畫圖種類

5.1、Scatter散點圖

n=1024

X=np.random.normal(0,1,n)#每一個點的X值

Y=np.random.normal(0,1,n)#每一個點的Y值

T=np.arctan2(Y,X)#arctan2返回給定的X和Y值的反正切值

#scatter畫散點圖 size=75 顏色為T 透明度為50% 利用xticks函數來隱藏x坐標軸

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

plt.xlim(-1.5,1.5)

plt.xticks(())#忽略xticks

plt.ylim(-1.5,1.5)

plt.yticks(())#忽略yticks

plt.show()

5.2、條形圖

#基本圖形

n=12

X=np.arange(n)

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

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

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

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

#標記值

for x,y in zip(X,Y1):#zip表示可以傳遞兩個值

? ? plt.text(x+0.4,y+0.05,'%.2f'%y,ha='center',va='bottom')#ha表示橫向對齊 bottom表示向下對齊

for x,y in zip(X,Y2):

? ? plt.text(x+0.4,-y-0.05,'%.2f'%y,ha='center',va='top')

plt.xlim(-0.5,n)

plt.xticks(())#忽略xticks

plt.ylim(-1.25,1.25)

plt.yticks(())#忽略yticks

plt.show()

5.3、等高線圖

n=256

x=np.linspace(-3,3,n)

y=np.linspace(-3,3,n)

X,Y=np.meshgrid(x,y)#meshgrid從坐標向量返回坐標矩陣

#f函數用來計算高度值 利用contour函數把顏色加進去 位置參數依次為x,y,f(x,y),透明度為0.75,并將f(x,y)的值對應到camp之中

def f(x,y):

? ? return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)#8表示等高線分成多少份 alpha表示透明度 cmap表示color map

#使用plt.contour函數進行等高線繪制 參數依次為x,y,f(x,y),顏色選擇黑色,線條寬度為0.5

C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=0.5)

#使用plt.clabel添加高度數值 inline控制是否將label畫在線里面,字體大小為10

plt.clabel(C,inline=True,fontsize=10)

plt.xticks(())#隱藏坐標軸

plt.yticks(())

plt.show()

5.4、Image圖片

利用matplotlib打印出圖像

a = np.array([0.313660827978, 0.365348418405, 0.423733120134,

? ? ? ? ? ? ? 0.365348418405, 0.439599930621, 0.525083754405,

? ? ? ? ? ? ? 0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)

#origin='lower'代表的就是選擇的原點位置

plt.imshow(a,interpolation='nearest',cmap='bone',origin='lower')#cmap為color map

plt.colorbar(shrink=.92)#右邊顏色說明 shrink參數是將圖片長度變為原來的92%

plt.xticks(())

plt.yticks(())

plt.show()? ? ? ? ? ? ?

出圖方式 此處采用內插法中的nearest-neighbor

5.5、3D圖像

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D#需另外導入模塊Axes 3D

fig=plt.figure()#定義圖像窗口

ax=Axes3D(fig)#在窗口上添加3D坐標軸

#將X和Y值編織成柵格

X=np.arange(-4,4,0.25)

Y=np.arange(-4,4,0.25)

X,Y=np.meshgrid(X,Y)

R=np.sqrt(X**2+Y**2)

Z=np.sin(R)#高度值

#將colormap rainbow填充顏色,之后將三維圖像投影到XY平面做等高線圖,其中ratride和cstride表示row和column的寬度

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))#rstride表示圖像中分割線的跨圖

#添加XY平面等高線 投影到z平面

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))#把圖像進行投影的圖形 offset表示比0坐標軸低兩個位置

ax.set_zlim(-2,2)

plt.show()

6、多圖合并顯示

6.1、Subplot多合一顯示

均勻圖中圖:MatPlotLib可以組合許多的小圖在大圖中顯示,使用的方法叫做subplot。

plt.figure()

plt.subplot(2,1,1)#表示整個圖像分割成2行2列,當前位置為1

plt.plot([0,1],[0,1])#橫坐標變化為[0,1] 豎坐標變化為[0,2]

plt.subplot(2,3,4)

plt.plot([0,1],[0,2])

plt.subplot(2,3,5)

plt.plot([0,1],[0,3])

plt.subplot(2,3,6)

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

plt.show()

不均勻圖中圖

plt.figure()

plt.subplot(2,1,1)#將整個窗口分割成2行1列,當前位置表示第一個圖

plt.plot([0,1],[0,1])#橫坐標變化為[0,1],豎坐標變化為[0,1]

plt.subplot(2,3,4)#將整個窗口分割成2行3列,當前位置為4

plt.plot([0,1],[0,2])

plt.subplot(2,3,5)

plt.plot([0,1],[0,3])

plt.subplot(2,3,6)

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

plt.show()

6.2、SubPlot分格顯示

方法一

import matplotlib.gridspec as gridspec#引入新模塊

plt.figure()

'''

使用plt.subplot2grid創建第一個小圖,(3,3)表示將整個圖像分割成3行3列,(0,0)表示從第0行0列開始作圖,colspan=3表示列的跨度為3。colspan和rowspan缺省時默認跨度為1

'''

ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)? # stands for axes

ax1.plot([1, 2], [1, 2])

ax1.set_title('ax1_title')#設置圖的標題

#將圖像分割成3行3列,從第1行0列開始做圖,列的跨度為2

ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)

#將圖像分割成3行3列,從第1行2列開始做圖,行的跨度為2

ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)

#將圖像分割成3行3列,從第2行0列開始做圖,行與列的跨度默認為1

ax4 = plt.subplot2grid((3, 3), (2, 0))

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

ax4.set_xlabel('ax4_x')

ax4.set_ylabel('ax4_y')

ax5 = plt.subplot2grid((3, 3), (2, 1))

方法二

plt.figure()

gs = gridspec.GridSpec(3, 3)#將圖像分割成3行3列

ax6 = plt.subplot(gs[0, :])#gs[0:1]表示圖占第0行和所有列

ax7 = plt.subplot(gs[1, :2])#gs[1,:2]表示圖占第1行和第二列前的所有列

ax8 = plt.subplot(gs[1:, 2])

ax9 = plt.subplot(gs[-1, 0])

ax10 = plt.subplot(gs[-1, -2])#gs[-1.-2]表示這個圖占倒數第1行和倒數第2行

plt.show()

方法三

'''

建立一個2行2列的圖像窗口,sharex=True表示共享x軸坐標,sharey=True表示共享y軸坐標,((ax11,ax12),(ax13,1x14))表示從到至右一次存放ax11,ax12,ax13,ax114

'''

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

ax11.scatter([1,2], [1,2])ax11.scatter 坐標范圍x為[1,2],y為[1,2]

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

plt.show()

6.3、圖中圖

fig=plt.figure()

#創建數據

x=[1,2,3,4,5,6,7]

y=[1,3,4,2,5,8,6]

#繪制大圖:假設大圖的大小為10,那么大圖被包含在由(1,1)開始,寬8高8的坐標系之中。

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

ax1 = fig.add_axes([left, bottom, width, height])? # main axes

ax1.plot(x, y, 'r')#繪制大圖,顏色為red

ax1.set_xlabel('x')#橫坐標名稱為x

ax1.set_ylabel('y')

ax1.set_title('title')#圖名稱為title

#繪制小圖,注意坐標系位置和大小的改變

ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25])

ax2.plot(y, x, 'b')#顏色為buue

ax2.set_xlabel('x')

ax2.set_ylabel('y')

ax2.set_title('title inside 1')

#繪制第二個小兔

plt.axes([0.6, 0.2, 0.25, 0.25])

plt.plot(y[::-1], x, 'g')#將y進行逆序

plt.xlabel('x')

plt.ylabel('y')

plt.title('title inside 2')

plt.show()

6.4、次坐標軸

x=np.arange(0,10,0.1)

y1=0.5*x**2

y2=-1*y1

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()#鏡像顯示

ax1.plot(x, y1, 'g-')

ax2.plot(x, y2, 'b-')

ax1.set_xlabel('X data')

ax1.set_ylabel('Y1 data', color='g')#第一個y坐標軸

ax2.set_ylabel('Y2 data', color='b')#第二個y坐標軸

plt.show()

7、動畫

from matplotlib import animation#引入新模塊

fig,ax=plt.subplots()

x=np.arange(0,2*np.pi,0.01)#數據為0~2PI范圍內的正弦曲線

line,=ax.plot(x,np.sin(x))# line表示列表

#構造自定義動畫函數animate,用來更新每一幀上x和y坐標值,參數表示第i幀

def animate(i):

? ? line.set_ydata(np.sin(x+i/100))

? ? return line,

#構造開始幀函數init

def init():

? ? line.set_ydata(np.sin(x))

? ? return line,

# frame表示動畫長度,一次循環所包含的幀數;interval表示更新頻率

# blit選擇更新所有點,還是僅更新新變化產生的點。應該選True,但mac用戶選擇False。

ani=animation.FuncAnimation(fig=fig,func=animate,frames=200,init_func=init,interval=20,blit=False)

plt.show()

8、繪制圖形

在matplotlib.pyplot中,你還可以找到下面的繪圖函數。如果你經常使用數據繪圖程序,應該會很熟悉這些圖形:

繪圖程序如下:

import matplotlib.pyplot as plt

# 1D data

x = [1,2,3,4,5]

y = [2.3,3.4,1.2,6.6,7.0]

plt.figure(figsize=(12,6))

plt.subplot(231)

plt.plot(x,y)

plt.title("plot")

plt.subplot(232)

plt.scatter(x, y)

plt.title("scatter")

plt.subplot(233)

plt.pie(y)

plt.title("pie")

plt.subplot(234)

plt.bar(x, y)

plt.title("bar")

# 2D data

import numpy as np

delta = 0.025

x = y = np.arange(-3.0, 3.0, delta)

X, Y = np.meshgrid(x, y)

Z? ? = Y**2 + X**2

plt.subplot(235)

plt.contour(X,Y,Z)

plt.colorbar()

plt.title("contour")

# read image

import matplotlib.image as mpimg

img=mpimg.imread('marvin.jpg')

plt.subplot(236)

plt.imshow(img)

plt.title("imshow")

plt.savefig("matplot_sample.jpg")

面用到的marvin.jpg是下圖,請保存到當地電腦:


函數式編程創造了一個仿真MATLAB的工作環境,并有許多成形的繪圖函數。如果只是作為Matplotlib的一般用戶(非開發者),pyplot可以滿足大部分的需求。

(當然,matplotlib是免費而開源的,MATLAB昂貴而封閉。這是不“仿真”的地方)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容