牛刀小試
導入類庫:
import matplotlib.pyplot as plt
畫圖:
plt.plot([1, 2, 3, 4])
如果只提供了一個參數給plot()時,默認是給y的,自動生成x。給圖添加修飾
plt.xlabel('x label') # 橫坐標
plt.ylabel('y label') # 縱坐標
plt.title('Test') # 標題
-
顯示
plt.show()
結果如圖1所示
圖1.png
接下來,我們改變一些參數試試:
可以給plot()傳入多個參數:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
第一個列表參數賦值給x
第二個列表參數賦值給y
第三個參數“ro”種r
表示顏色,o
表示形狀通過axis()改變坐標軸的度量
plt.axis([0, 6, 0, 20])
列表的前兩個數表示x軸的范圍,0~6
列表的后兩個數表示y軸的范圍,0~20同樣使用plt.show()顯示圖像
plt.show()
結果如圖2所示
- 但通用的方法還是給plot()傳入數組
import numpy as np
array = np.arange(0, 5, 0.1)
plt.plot(array, array**2, 'bs')
結果如圖3所示
圖3.png
設置線條屬性
一般有以下幾個方法設置線條屬性
- 使用關鍵字:
plt.plot(x, y, linewidth=2.0)
- 使用plot返回一個由二維線條對象組成的列表,該對象有一個setter方法
line, = plt.plot(x, y, '-') # 此處返回的列表長度為1
line.set_antialiased(False) # 設置antialising屬性為False
- 使用setp()命令,可以使用關鍵字標注和matlab風格的方式
lines = plt.plot(x1, y1, x2, y2) # 返回線條列表,長度為2
plt.setp(lines, color='r', linewidth=2.0) # 使用keyword
plt.setp(lines, 'color', 'r', 'linewidth', 2.0) # matlab風格
常用的屬性
多圖和axes
Matplotlib和Matlab一樣,都有圖和子圖的概念,圖用figure表示,子圖用axes表示
所有使用plt的操作都是針對當前的圖或子圖進行的
- gca()可以輸出當前的axes
- gcf()可以輸出當前的figure
- 下面是一個多圖多子圖的例子:
x = np.arange(0, 5, 0.1)
plt.figure(1) # 創建了圖1(figure(1))
plt.subplot(211) # 在figure1種生成子圖1
plt.plot(x, np.sin(x)) # 在當前子圖,也就是子圖1種畫圖
plt.subplot(212) # 在figure1中生成子圖2
plt.plot(x, x**2)
plt.figure(2)
plt.subplot(131)
plt.plot(x, x)
plt.subplot(132)
plt.plot(x, 2*x+1)
plt.subplot(133)
plt.plot(x, np.cos(x))
plt.show()
其中:
- 在創建子圖時使用了
plt.subplot(211)
,其中的211
可以這樣解釋:前兩位數可以理解為2*1
,也就是在figure1中生成兩個子圖,最后一位1
解釋為子圖編號,也就是figure1中的第一個子圖 -
211
也可理解為圖的布局為兩行一列的第一個圖,132
就理解為一行三列的第二副圖
上面程序的運行結果:
-
上面的創建圖和子圖的方法有些麻煩,有一種更為簡單的方法:
使用plt.subplots
創建新的figure,返回值為已創建subplot對象的Numpy數組:
>>>fig, axes = plt.subplots(2, 3)
>>>axes
[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940B0D940>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CAC550>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CE5240>]
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D77748>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D88FD0>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940E41780>]]
結果如圖6,在一個figure中創建了6個子圖
圖6.pngfigure過度時會導致內存警告
可以使用clg()刪除當前figure,cla()刪除當前的axes plt針對當前子圖進行操作,而axes只關注它本身
使用axes也可以操作子圖
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(1, 5, 0.1)
y = x**3
ax.scatter(x, y)
ax.set_xlabel('x label')
ax.set_ylabel('y label')
plt.show()
結果如圖7所示
文本工作
- 可以使用text()在任意位置添加文本
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
結果如圖8所示
- 使用
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
在點(60, 0.025)
處添加了文本u=100, sigma=15
-
plt.grid(True)
表示在圖中添加網格
- 使用annotate()
from numpy import pi
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
plt.ylim(-2,2)
lt.show()
運行結果如圖9所示
使用
plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
來進行注釋,point(2, 1)', xy=(2, 1)
表示在點(2, 10)
處添加文本"point(2, 1)"
xytext=(3, 1.5),arrowprops=dict(facecolor='black', shrink=0.05)
表示注釋文本的位置為(3, 1.5)
處,arrowprops
描述了箭頭
使用文本的方法
- 所有的
test()
方法都會返回一個matplotlib.text.Text
實例,可以使用關鍵字參數和setp()的形式使用文本。
t = plt.xlabel('my data', fontsize=14, color='red')
- matplotib可以使用TeX表達式描述任何文本,比如文本
plt.title(r'$\sigma_i=15$')
這里有一些常用的數學式表述方式
http://matplotlib.org/users/mathtext.html#mathtext-tutorial
保存到文件
使用plt.savefig()將當前圖保存到文件
例如:將figure保存為svg文件,plt.savefig('figpath.svg')
總結一些自己學習的知識點,謝謝!