一篇matplotlib庫的學習博文。matplotlib對於數據可視化非常重要,它完全封裝了MatLab的所有API,在python的環境下和Python的語法一起使用更是相得益彰。
一、庫的安裝和環境的配置
windows下:py -3 -m pip install matplotlib
linux下:python3 -m pip install matplotlib
建議配合Jupyter使用。在jupyter notebook中,使用%matplotlib inline
,即可進入交互頁面(類似下圖)
二、設置中文環境
首先引入包:
import numpy as np #之后需要用到
import matplotlib as mpl #設置環境變量
import matplotlib.pyplot as plt #繪圖專用
from mpl_toolkits.mplot3d import Axes3D #繪制3D圖
為了讓圖片兼容中文的說明、名字等,這里需要:
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus']=False
三、一窺全貌
首先,我們畫一張正弦和余弦圖。
plt.figure('sin/cos', dpi=70)
# 創建一個新的 1 * 1 的子圖,接下來的圖樣繪制在其中的第 1 塊(也是唯一的一塊)
plt.subplot(1,1,1)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
# 繪制余弦曲線,使用藍色的、連續的、寬度為 1 (像素)的線條
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# 繪制正弦曲線,使用綠色的、連續的、寬度為 1 (像素)的線條
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")
# 設置橫軸的上下限
plt.xlim(-4.0,4.0)
# 設置橫軸記號
plt.xticks(np.linspace(-4,4,9,endpoint=True))
# 設置縱軸的上下限
plt.ylim(-1.0,1.0)
# 設置縱軸記號
plt.yticks(np.linspace(-1,1,5,endpoint=True))
# 以分辨率 72 來保存圖片
# savefig("exercice_2.png",dpi=72)
# 在屏幕上顯示
plt.show()
plt.figure(name,dpi)
:name是圖片的名字,dpi是分辨率plt.plot(x,y,color,linewidth,linestyle,label)
:用來繪制點線圖。color是線條顏色,linewidth是寬度,linestyle可以設置成--
,就變成了虛線。
label參數和圖例有關plt.xlim(min,max)/plt.ylim(min,max)
:設置x/y軸的范圍。plt.xtricks(列表)/plt.ytricks(列表)
:設置x軸/y軸的上顯示的值。
如果想要設置記號標簽(我們可以把 3.1423.142 當做是 ππ,但畢竟不夠精確。當我們設置記號的時候,我們可以同時設置記號的標簽。注意這里使用了 LaTeX)。可以傳入兩個對應的列表。plt.legend(loc=隨機默認)
:添加圖例,圖例來自於plt.plot()參數里的label,如果想讓label按照公式顯示,需要在字符串前后加$。即:label='$sin(x)$'
loc參數定義圖標位置,可以是upper left/right
類似的方向。plt.xlabel(labelname)/ylabel(labelname)
:添加x/y軸的名字並且顯示出來。plt.scatter(xlist,ylist)
:根據需要標注圖中的特殊點。plt.title()
:給圖一個名字- 移動坐標軸:(之前的圖片還是不好看)實際上每幅圖有四條脊柱(上下左右),為了將脊柱放在圖的中間,我們必須將其中的兩條(上和右)設置為無色,然后調整剩下的兩條到合適的位置——數據空間的 0 點。
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('red')
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.figure(figsize=(8,6), dpi=70)
# 創建一個新的 1 * 1 的子圖,接下來的圖樣繪制在其中的第 1 塊(也是唯一的一塊)
plt.subplot(1,1,1)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X, C, color="blue", linewidth=1.5, linestyle="--",label="$y=cos(x)$")
plt.plot(X, S, color="red", linewidth=1.0, linestyle="-",label='$y=sin(x)$')
plt.xlabel('Y')
plt.ylabel('X')
plt.xlim(X.min()*1.1,X.max()*1.1)
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.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, 0, +1],\
[r'$-1$', r'$0$', r'$+1$'])
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))
# 以分辨率 72 來保存圖片
# savefig("exercice_2.png",dpi=72)
t = 2*np.pi/3
plt.scatter([t,],[np.cos(t),], 20, color ='black')
plt.scatter([t,],[np.sin(t),], 20, color ='black')
plt.legend(loc="upper left")
plt.title('三角函數示意圖')
# 在屏幕上顯示
plt.show()
現在來看一下處理過后的圖的樣子:
歡迎進一步交流本博文相關內容:
博客園地址 : http://www.cnblogs.com/AsuraDong/
CSDN地址 : http://blog.csdn.net/asuradong
也可以致信進行交流 : xiaochiyijiu@163.com
歡迎關注個人微博:http://weibo.com/AsuraDong
歡迎轉載 , 但請指明出處 : )
四、精益求精
plt.figure('sin/cos', dpi=70)
# 創建一個新的 1 * 1 的子圖,接下來的圖樣繪制在其中的第 1 塊(也是唯一的一塊)
#plt.subplot(112)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X, C, color="blue", linewidth=1.5, linestyle="--",label="$y=cos(x)$")
plt.plot(X, S, color="red", linewidth=1.0, linestyle="-",label='$y=sin(x)$')
plt.xlabel('Y')
plt.ylabel('X')
plt.xlim(X.min()*1.1,X.max()*1.1)
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.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, 0, +1],\
[r'$-1$', r'$0$', r'$+1$'])
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))
# 以分辨率 72 來保存圖片
# savefig("exercice_2.png",dpi=72)
t = 2*np.pi/3
plt.scatter([t,],[np.cos(t),], 20, color ='black')
plt.scatter([t,],[np.sin(t),], 20, color ='black')
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"))
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"))
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.legend(loc="upper left")
plt.title('三角函數示意圖')
# 在屏幕上顯示
plt.show()
我們添加了標注點,並且向x軸做了垂線,使其更清晰。
五、圖的存儲
這么漂亮的圖,還是通過plt.savefig(照片名字+后綴名)
保存到本地吧。
六、子圖
plt.subplot(x,y,n)
:將圖片分成x*y塊,這個圖是第n個。(看示例)
示例一:
x = np.arange(0, 5, 0.1)
y = np.arange(0, 5, 0.1)
#plt.figure(1)
plt.subplot(221)
plt.plot(x, y, 'go')
plt.subplot(222)
plt.plot(x, y, 'r--')
plt.subplot(212)
plt.plot(x, y,)
plt.show()
示例二:
x = np.arange(0, 5, 0.1)
y = np.arange(0, 5, 0.1)
#plt.figure(1)
plt.subplot(221)
plt.plot(x, y, 'go')
plt.subplot(222)
plt.plot(x, y, 'r--')
plt.subplot(224)
plt.plot(x, y,)
plt.show()