在最開始接觸python科學計算的時候,就知道了Matplotlib這個繪圖庫。個人是比較喜歡這種可視化的工具,照我看,GUI這種理念幾乎是划時代的。如果說numpy是用來處理數據,那么Matplotlib就是用來展示數據的,抽象的數據,以圖表的形式展示出來,無論是對自己,還是對看到的人,接受起來都比較輕松,也跟更容易發現數據內部隱藏着的某些規律性。
Matplotlib似乎是模仿的Matlab,Matlab沒有接觸過,但是Matplotlib是真的很好用,畫出來的圖都很優雅,可調整的參數也很多,並且剛開始學也不復雜,官網的幫助文檔講的也都很詳細,深入的話當然還是有很多東西的。平常最常用的是pyplot模塊,入手並不難,下面簡單紀錄下,順便多說句,Matplotlib與numpy高度集成,轉換的時候毫無滯礙。
文章參見這里:http://matplotlib.org/api/pyplot_api.html
Example1:
# -*- coding:utf-8 -*-
# 導入相關模塊 import numpy as np import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1) # 生成一個numpy數組對象 y = np.sin(x) plt.plot(x, y) # 先是x坐標,后是y坐標 plt.show() # 沒有這句就畫不出圖 |
這是最簡單的,plot里的參數都是默認的。效果如下:
看起來是曲線,其實都是直線,只是因為點與點之間的距離很小,看起來比較平滑,plot默認會將點連接成線
Example2:
plt.plot([1, 2, 3, 4]) # 增加一個y軸的標簽,pyplot模塊本身提供了方法 plt.ylabel('some numbers') plt.show() |
這個地方,plot()只提供了一個參數,matplotlib默認是y的,那x的怎么辦,matplotlib很聰明,它會自動生成一個,規律就是:從0開始,長度與y相同,效果就就是上圖,可以發現,給坐標軸增加標簽很簡單
Example3:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro') # 多了個參數,自定義顯示效果 # 增加圖名、x和y軸的名字 plt.title('Dot') plt.xlabel('x') plt.ylabel('y') # axis方法定義x軸和y軸的屬性 plt.axis([0, 6, 0, 20]) plt.show() |
Plot默認是藍色實線,這里在plot里增加一個參數'ro',顯示就變成紅色圓點了,更多的效果參照下圖。
Axis方法改變了坐標的屬性,參數為[xmin, xmax, ymin, ymax]
Example4:
t = np.arange(0, 5, 0.2) # plot可以同時接收多個參數 plt.plot(t, t, 'r--', t, t ** 2, 'bs', t, t ** 3, 'g^') plt.show() |
從這個例子中可以看到pyplot的靈活性,效果很多樣,都可以自定義,還可以同時接受多個參數繪制在一張圖表里
Example5:
x = np.arange(0, 5, 0.1) # plot可以接受更多的參數 plt.plot(x, x, linewidth='2.0', color='green') plt.show() |
Matplotlib里有專門的Line2D對象,屬性很多,遠不止這兩個,還得繼續學習呢
http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D
Example6:
# 定義一個函數 def f(t): return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0, 5, 0.1) t2 = np.arange(0, 5, 0.02)
# 分塊 plt.subplot(211) plt.plot(t1, f(t1), 'bo')
plt.subplot(212) plt.plot(t2, f(t2), 'r-')
plt.show() |
分塊顯示,應用起來很實際。Subplot里的三位數字,第一個表示行數,第二個表示列數,第三個表示編號。數字相同的話,后面的圖像會把前面的覆蓋
Example7:
mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # hist繪制直方圖 n, bins, patches = plt.hist(x, 50, normed=1, alpha=0.75)
# text也是個有着復雜屬性的對象 # matplotlib還可以自動轉換成數學表達式 plt.text(60, 0.025, r'$\mu=100, \sigma=15$', fontsize='20') plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show() |
這個例子就復雜很多,其中有兩點,一個是hist,另一個是text對象
可參照以下網址:http://matplotlib.org/users/mathtext.html#mathtext-tutorial
Example8:
t = np.arange(0, 5, 0.01) s = np.cos(2 * np.pi * t) line = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black',shrink=0.05))
plt.ylim(-2, 2)
plt.show() |
想畫出這樣的圖自然沒那么簡單,參照:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate
總結:以上所說,都是比較常用的,參數也相對簡單,從這些例子中也能看到,看似簡單的東西,背后往往復雜,要學的東西依然還有很多,加油吧。