【matplotlib】十分鐘教程

原英文文檔

簡(jiǎn)介

? ? ? ?matplotlib是一個(gè)在python中廣泛使用的2-D繪圖包窃页。其為python數(shù)據(jù)的可視化提供了一種非常便捷的方法渊抄。

pyplot

? ? ? ?pylot為matplotlib面向?qū)ο罄L圖庫(kù)提供了一個(gè)便利的接口,它的語(yǔ)法和命令和matlab十分類似格郁。

簡(jiǎn)單繪圖

? ? ? ?這一節(jié),我們將會(huì)在同一個(gè)圖像上繪制余弦和正弦曲線,所有的設(shè)置比如:figure size漏麦,dpi,線寬况褪,顏色撕贞,線型,axes测垛,axis以及文字樣式等都采用默認(rèn)參數(shù)捏膨,在后續(xù)的章節(jié)我們會(huì)讓其變得越來(lái)越漂亮。

import matplotlib.pyplot as plt
import numpy as np

# X是一個(gè)numpy.ndarray,從-π 到+π 包含256
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)

#C,S分別是X中256個(gè)值得余弦和正弦值
C,S = np.cos(X), np.sin(X)

plt.plot(X,C)
plt.plot(X,S)

plt.show()

修改參數(shù)值

? ? ? ?嘗試著去修改可能影響圖像外觀的參數(shù)食侮,來(lái)體會(huì)下其對(duì)最終展現(xiàn)的影響号涯。

# 創(chuàng)建一個(gè)8x6大小的圖像, 分辨率每英尺80的點(diǎn)
plt.figure(figsize=(8,6), dpi=80)

# 創(chuàng)建一個(gè)1*1的子圖
plt.subplot(111)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# 繪制一個(gè)藍(lán)色的,線寬為1個(gè)像素的連續(xù)余弦曲線
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")

# 繪制一個(gè)綠色的锯七,線寬為1個(gè)像素的連續(xù)正弦曲線
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")

# 設(shè)置x軸范圍
plt.xlim(-4.0,4.0)

# 設(shè)置x軸刻度
plt.xticks(np.linspace(-4,4,9,endpoint=True))

# 設(shè)置y軸范圍
plt.ylim(-1.0,1.0)

# 設(shè)置y軸刻度
plt.yticks(np.linspace(-1,1,5,endpoint=True))

# 保存圖像诚隙,分辨率為72
# plt.savefig("exercice.png",dpi=72)

# 在屏幕上顯示結(jié)果
plt.show()

改變顏色和線寬

plt.figure(figsize=(10,6), dpi=80)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-")

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

當(dāng)前圖像的坐標(biāo)軸和圖像之間太過(guò)緊湊,可以在坐標(biāo)軸和圖像之間增加一些空間起胰。

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)

設(shè)置刻度

對(duì)于繪制正弦余弦圖像而言久又,上述圖像的坐標(biāo)表示并不理想,沒有標(biāo)出特殊點(diǎn)的位置比如-π效五,π 地消,-π/2 ,π/2等

plt.xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])

設(shè)置刻度標(biāo)簽

在設(shè)置刻度是,我們還可以指定對(duì)應(yīng)的標(biāo)簽畏妖,如果有數(shù)學(xué)公式還可以使用latex語(yǔ)法脉执。

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1],[r'$-1$', r'$0$', r'$+1$'])

移動(dòng)脊線

脊線其實(shí)就是圖中邊框的四個(gè)邊(top/bottom/left/right),它可以連接數(shù)據(jù)刻度戒劫,確定數(shù)據(jù)范圍半夷,同樣也是可以隨意移動(dòng)的婆廊。

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))

添加圖例

在左上角添加圖例,在添加圖例前需要在plt.plot中增加label參數(shù)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label=r'$cos(x)$')
plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-", label=r'$sin(x)$')

plt.legend(loc='upper left', frameon=False)
md_8.png

添加注釋

給你感興趣的點(diǎn)添加注釋巫橄,這里給x=2π/3位置的sin和cos曲線添加注釋淘邻。

t = 2*np.pi/3

plt.plot([t,t],[0,np.cos(t)],linestyle="--",color='blue',linewidth=1.5)
plt.scatter([t,],[np.cos(t),],50,color='blue')
plt.annotate(r'$\cos(\frac{2\pi}{3}) = -\frac{\sqrt{3}}{2}$',xy=(t,np.cos(t)),xycoords='data',xytext=(-90, -50))

plt.plot([t,t],[0,np.sin(t)],linestyle="--",color="red",linewidth=1.5)
plt.scatter([t,],[np.sin(t),],50,color='red')

Figures,Subplot,Axes 和Ticks

到目前為止,我們都在使用默認(rèn)的Figure和Axes湘换,這對(duì)于快速繪圖來(lái)確實(shí)很方便宾舅。我們也可以使用figure,subplot,axes顯示的控制圖像的顯示。在matplotlib中一個(gè)figure意味著用戶界面的整個(gè)窗體彩倚。在figure中可以是subplot筹我,也可以是axes,subplot只能以規(guī)則格網(wǎng)的形式展現(xiàn)帆离,axes用戶可以任意的指定放置的位置蔬蕊,你可以根據(jù)你的使用目的來(lái)選擇。當(dāng)我們繪制圖形的時(shí)候matplotlib會(huì)調(diào)用gca()獲取當(dāng)前的Axe哥谷,gca會(huì)調(diào)用gcf獲取當(dāng)前的figure岸夯。

Figures

Figures就是GUI中的一個(gè)窗體,它有很多參數(shù)可以控制Figure的樣式

參數(shù) 默認(rèn)值 描述
num 1 figure的索引
figsize figure.figsize 圖像大小(寬呼巷,高)囱修,單位英尺
dpi figure.dpi 每英尺圖像的分辨率
facecolor figure.facecolor 背景顏色
edgecolor figure.edgecolor 圍繞繪圖區(qū)域邊緣的顏色
frameon True 是否繪制圖像框架

subplots

通過(guò)子圖赎瑰,你可以合理的布局自己的圖像王悍,只需要指定行列書以及當(dāng)前繪制的圖像索引。 gridspec 是一個(gè)更為強(qiáng)大的設(shè)定字圖的工具

plt.subplot(2,1,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)

plt.subplot(2,1,2)
plt.xticks([]), yticks([])
plt.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)

# plt.savefig('.subplot-horizontal.png', dpi=64)
plt.show()
plt.subplot(1,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,1)',ha='center',va='center',size=24,alpha=.5)

plt.subplot(1,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,2)',ha='center',va='center',size=24,alpha=.5)

# plt.savefig('subplot-vertical.png', dpi=64)
plt.show()
plt.subplot(2,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,3)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,4)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)

# plt.savefig('subplot-grid.png', dpi=64)
plt.show()
 import matplotlib.gridspec as gridspec

G = gridspec.GridSpec(3, 3)

axes_1 = plt.subplot(G[0, :])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 1',ha='center',va='center',size=24,alpha=.5)

axes_2 = plt.subplot(G[1,:-1])
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5, 'Axes 2',ha='center',va='center',size=24,alpha=.5)

axes_3 = plt.subplot(G[1:, -1])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 3',ha='center',va='center',size=24,alpha=.5)

axes_4 = plt.subplot(G[-1,0])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 4',ha='center',va='center',size=24,alpha=.5)

axes_5 = plt.subplot(G[-1,-2])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 5',ha='center',va='center',size=24,alpha=.5)

#plt.savefig('gridspec.png', dpi=64)
plt.show()

Axes

Axes和subplot非常類似餐曼,不同的是压储,用戶可以任意設(shè)定Axes在Figures中的位置。

plt.axes([0.1,0.1,.8,.8])
plt.xticks([]), plt.yticks([])
plt.text(0.6,0.6, 'axes([0.1,0.1,.8,.8])',ha='center',va='center',size=20,alpha=.5)

plt.axes([0.2,0.2,.3,.3])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'axes([0.2,0.2,.3,.3])',ha='center',va='center',size=16,alpha=.5)

plt.show()
plt.axes([0.1,0.1,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.1,0.1,.8,.8])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.2,0.2,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.2,0.2,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.3,0.3,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.3,0.3,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.4,0.4,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.4,0.4,.5,.5])',ha='left',va='center',size=16,alpha=.5)

# plt.savefig("axes-2.png",dpi=64)
plt.show()

Ticks

合理的刻度是圖像展示的重要組成部分

其它類型的圖像

常規(guī)繪圖

n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)

plt.axes([0.025,0.025,0.95,0.95])

plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=.25)

plt.plot (X, Y-1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y-1, (Y-1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y-1, (Y-1) < -1, color='red',  alpha=.25)

plt.xlim(-np.pi,np.pi), plt.xticks([])
plt.ylim(-2.5,2.5), plt.yticks([])
# plt.savefig('plot_ex.png',dpi=48)
plt.show()

散點(diǎn)圖

n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X)

plt.axes([0.025,0.025,0.95,0.95])
plt.scatter(X,Y, s=75, c=T, alpha=.5)

plt.xlim(-1.5,1.5), plt.xticks([])
plt.ylim(-1.5,1.5), plt.yticks([])
# plt.savefig('scatter_ex.png',dpi=48)
plt.show()

柱狀圖

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.axes([0.025,0.025,0.95,0.95])
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

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

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

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

# plt.savefig('bar_ex.png', dpi=48)
plt.show()

等值線圖

def f(x,y):
    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)

plt.axes([0.025,0.025,0.95,0.95])

plt.contourf(X, Y, f(X,Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)

plt.xticks([]), plt.yticks([])
plt.show()

顯示圖像

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

n = 10
x = np.linspace(-3,3,3.5*n)
y = np.linspace(-3,3,3.0*n)
X,Y = np.meshgrid(x,y)
Z = f(X,Y)

plt.axes([0.025,0.025,0.95,0.95])
plt.imshow(Z,interpolation='nearest', cmap='bone', origin='lower')
plt.colorbar(shrink=.92)

plt.xticks([]), plt.yticks([])
plt.show()

餅狀圖

n = 20
Z = np.ones(n)
Z[-1] *= 2

plt.axes([0.025,0.025,0.95,0.95])

plt.pie(Z, explode=Z*.05, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.gca().set_aspect('equal')
plt.xticks([]), plt.yticks([])

plt.show()

繪制格網(wǎng)

axe = plt.gca()
axe.set_xlim(0,4)
axe.set_ylim(0,3)

axe.xaxis.set_major_locator(plt.MultipleLocator(1.0))
axe.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
axe.yaxis.set_major_locator(plt.MultipleLocator(1.0))
axe.yaxis.set_minor_locator(plt.MultipleLocator(0.1))
axe.grid(which='major',axis='x',linewidth=0.75, linestyle='-', color='0.75')
axe.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color='0.75')
axe.grid(which='major',axis='y',linewidth=0.75, linestyle='-', color='0.75')
axe.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color='0.75')
axes.set_xticklabels([])
axes.set_yticklabels([])

plt.show()

3D圖像

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

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)

ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='hot')
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.hot)
ax.set_zlim(-2,2)

plt.show()

繪制文本

eqs = []

eqs.append((r"$W^{3\beta}_{\delta_1 \rho_1 \sigma_2} = U^{3\beta}_{\delta_1 \rho_1} + \frac{1}{8 \pi 2} \int^{\alpha_2}_{\alpha_2} d \alpha^\prime_2 \left[\frac{ U^{2\beta}_{\delta_1 \rho_1} - \alpha^\prime_2U^{1\beta}_{\rho_1 \sigma_2} }{U^{0\beta}_{\rho_1 \sigma_2}}\right]$"))
eqs.append((r"$\frac{d\rho}{d t} + \rho \vec{v}\cdot\nabla\vec{v} = -\nabla p + \mu\nabla^2 \vec{v} + \rho \vec{g}$"))
eqs.append((r"$\int_{-\infty}^\infty e^{-x^2}dx=\sqrt{\pi}$"))
eqs.append((r"$E = mc^2 = \sqrt{{m_0}^2c^4 + p^2c^2}$"))
eqs.append((r"$F_G = G\frac{m_1m_2}{r^2}$"))

plt.axes([0.025,0.025,0.95,0.95])

for i in range(24):
    index = np.random.randint(0,len(eqs))
    eq = eqs[index]
    size = np.random.uniform(12,32)
    x,y = np.random.uniform(0,1,2)
    alpha = np.random.uniform(0.25,.75)
    plt.text(x, y, eq, ha='center', va='center', color="#11557c", alpha=alpha,
             transform=plt.gca().transAxes, fontsize=size, clip_on=True)

plt.xticks([]), plt.yticks([])
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末源譬,一起剝皮案震驚了整個(gè)濱河市集惋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踩娘,老刑警劉巖刮刑,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異养渴,居然都是意外死亡雷绢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門理卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翘紊,“玉大人,你說(shuō)我怎么就攤上這事藐唠》保” “怎么了鹉究?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)踪宠。 經(jīng)常有香客問我自赔,道長(zhǎng),這世上最難降的妖魔是什么殴蓬? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任匿级,我火速辦了婚禮,結(jié)果婚禮上染厅,老公的妹妹穿的比我還像新娘痘绎。我一直安慰自己,他們只是感情好肖粮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布孤页。 她就那樣靜靜地躺著,像睡著了一般涩馆。 火紅的嫁衣襯著肌膚如雪行施。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天魂那,我揣著相機(jī)與錄音蛾号,去河邊找鬼。 笑死涯雅,一個(gè)胖子當(dāng)著我的面吹牛鲜结,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播活逆,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼精刷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔗候?” 一聲冷哼從身側(cè)響起怒允,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锈遥,沒想到半個(gè)月后纫事,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡所灸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年丽惶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆寺。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚊夫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懦尝,到底是詐尸還是另有隱情知纷,我是刑警寧澤壤圃,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站琅轧,受9級(jí)特大地震影響伍绳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乍桂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一冲杀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹酌,春花似錦权谁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辐啄,卻和暖如春采章,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壶辜。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工悯舟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸民。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓抵怎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阱洪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子便贵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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