matplotlib實現數據可視化

一篇matplotlib庫的學習博文。matplotlib對於數據可視化非常重要,它完全封裝了MatLab的所有API,在python的環境下和Python的語法一起使用更是相得益彰。

一、庫的安裝和環境的配置

windows下:py -3 -m pip install matplotlib

linux下:python3 -m pip install matplotlib

建議配合Jupyter使用。在jupyter notebook中,使用%matplotlib inline,即可進入交互頁面(類似下圖)

1.png

二、設置中文環境

首先引入包:

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

2.png

  1. plt.figure(name,dpi):name是圖片的名字,dpi是分辨率
  2. plt.plot(x,y,color,linewidth,linestyle,label):用來繪製點線圖。color是線條顏色,linewidth是寬度,linestyle可以設置成--,就變成了虛線。
    label參數和圖例有關
  3. plt.xlim(min,max)/plt.ylim(min,max):設置x/y軸的範圍。
  4. plt.xtricks(列表)/plt.ytricks(列表):設置x軸/y軸的上顯示的值。
    如果想要設置記號標籤(我們可以把 3.1423.142 當做是 ππ,但畢竟不夠精確。當我們設置記號的時候,我們可以同時設置記號的標籤。注意這裏使用了 LaTeX)。可以傳入兩個對應的列表。
  5. plt.legend(loc=隨機默認):添加圖例,圖例來自於plt.plot()參數裏的label,如果想讓label按照公式顯示,需要在字符串前後加$。即:label='$sin(x)$'
    loc參數定義圖標位置,可以是upper left/right類似的方向。
  6. plt.xlabel(labelname)/ylabel(labelname):添加x/y軸的名字並且顯示出來。
  7. plt.scatter(xlist,ylist):根據需要標註圖中的特殊點。
  8. plt.title():給圖一個名字
  9. 移動座標軸:(之前的圖片還是不好看)實際上每幅圖有四條脊柱(上下左右),爲了將脊柱放在圖的中間,我們必須將其中的兩條(上和右)設置爲無色,然後調整剩下的兩條到合適的位置——數據空間的 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()

現在來看一下處理過後的圖的樣子:
3.png

四、精益求精

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

4.png

我們添加了標註點,並且向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()  

5.png

示例二:

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

6.png

致謝

譯文作者

原文大神

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章