Python-matplotlib:快速入門教程

用 matplotlib 來(lái)繪制一幅完美的三角函數(shù)圖吧!

本文的源代碼:點(diǎn)擊進(jìn)入ipy notebook

此文由 Cescfangs翻譯自: Nicolas P. Rougier的Matplotlib教程,并作出了適當(dāng)?shù)男薷摹?/p>

1.快速創(chuàng)建三角函數(shù)

%matplotlib inline 
#要在ipy notebook里直接顯示Matplotlib的輸出圖象,需要%inline

import matplotlib.pyplot as plt
import numpy as np
X = np.linspace(-np.pi,np.pi,256,endpoint=True)
(C,S)=np.cos(X),np.sin(X)

#這里用到了Matplotlib和numpy模塊,linspace在(?π,π)之間分成共256個(gè)小段,
#并把這256個(gè)值賦予X。C,S分別是cosine和sine值(X,C,S都是numpy數(shù)組)
plt.plot(X,C)
plt.plot(X,S)

1.1

2.參數(shù)修改-繪制完美的三角函數(shù)

在第一部分中我們通過(guò)Matplotlibnumpy快速創(chuàng)建了一個(gè)三角函數(shù)圖,所采用的參數(shù)都是默認(rèn)的。事實(shí)上我們可以通過(guò)相關(guān)參數(shù)(包括線型、顏色、坐標(biāo)、標(biāo)題、圖示……)的修改使圖形滿足自己的需求。

2.1線寬和顏色

把cosine函數(shù)的顏色設(shè)置為藍(lán)色,sine則是紅色,而且線是不是看起來(lái)不夠粗?

fig = plt.figure(figsize=(10,6),dpi=80)
plt.plot(X, C, 'b-',lw=2.5)
plt.plot(X, S, 'r-',lw=2.5)
#這里`b-`是`color="blue",linestyle="-"`的簡(jiǎn)寫(xiě)形式
#`lw`=`linewidth`,兩種寫(xiě)法都是合理的,但是`b-`這種形式明顯更加簡(jiǎn)潔,也很好理解


加粗之后的效果

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

仔細(xì)看上面的圖,總覺(jué)得不舒服,大概是因?yàn)閮蓷l曲線“頂天立地”的原因吧,要是再多留些空間會(huì)更好?試試lim:

...
plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)
...
不要~~頂天立地~~

2.3坐標(biāo)刻度改為 3.14 更合適?

對(duì)于三角函數(shù)來(lái)說(shuō),1,2,3這些整數(shù)值沒(méi)有多大意義,倒是3.14這種能讓人家一看就知道:

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


3.14

等等,3.14改成$\pi$不是更好嗎?

...
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$'])
...


pi

2.4坐標(biāo)軸放在中間更好看吧?

現(xiàn)在的坐標(biāo)軸位于圖象四周唉,而且X,Y的原點(diǎn)分散,感覺(jué)上吧坐標(biāo)軸放在圖象中間會(huì)更好看一點(diǎn)吧?

...
ax=plt.gca()
ax.spines['right'].set_color('none') #先把右邊和上邊的邊界設(shè)置為不可見(jiàn)
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0)) #然后把下邊界和左邊界移動(dòng)到0點(diǎn)
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.plot(X, C, 'b-',lw=2.5)
plt.plot(X, S, 'r-',lw=2.5)
#
...


坐標(biāo)軸在中間

2.5喂喂喂!我怎么知道哪條是cosine?

那就加個(gè)圖例吧:

...
plt.plot(X, C, 'b-',lw=2.5, label='cosine')
plt.plot(X, S, 'r-',lw=2.5, label='sine')
plt.legend(loc='upper left')
...
加上圖例一目了然

2.6特殊點(diǎn)注釋不可少

在一幅圖像中,有些關(guān)鍵的點(diǎn)要是標(biāo)注出來(lái)的話,重點(diǎn)就不言自明了吧?2$\pi$/3如何?

...
t=2*np.pi/3

plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.cos(t),], 50, color ='blue') #畫(huà)出需要標(biāo)注的點(diǎn)

plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
         xy=(t, np.sin(t)), xycoords='data',
         xytext=(+10, +30), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) 
#給這個(gè)點(diǎn)添加注釋,下同

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

plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
         xy=(t, np.cos(t)), xycoords='data',
         xytext=(-90, -50), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
...
標(biāo)注美美噠

2.7最后再修改一些細(xì)節(jié)

坐標(biāo)軸上標(biāo)記的刻度字體太小了吧!而且會(huì)被圖象擋住唉!

...
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='w',edgecolor='None',alpha=0.4))
...

大功告成

不斷嘗試,找到自己喜歡的風(fēng)格,之后就可以直接調(diào)用了,不需要每次都重新倒騰~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容