matplotlib

佛倫斯

下載matplotlib

在NumPy課應該就下載過了

Windows 命令提示字元

pip install matplotlib

Mac 終端機

pip3 install matplotlib

下載完matplotlib後

進去Python Shell

import matplotlib

都是兩個底線

我們開始吧!

據我對它的瞭解

它就是拿來繪製圖表的

期待待會的課程~^^

matplotlib是什麼?

例題

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0,11) 
y =  2 * x +  5 
plt.title("x-t graph") 
plt.xlabel("time(unit:s)") 
plt.ylabel("displacement(unit:m)") 
plt.plot(x,y) 
plt.show()

根據這個圖形的敘述何者正確?(多選)

(1) 圖形過原點

(2) 圖形過點 \((7, 1)\)

(3) 圖形斜率為 \(2\)

(4) 圖形過 \((11, 27)\)

(5) 橫軸標題是"time(unit:s)"

(numpy.array的運算應該還記得吧)

答案:(3)(5)

\(y=2x+5\)

\(0\leq x<11\)

pyplot

matplotlib.pyplot裡面有很多函式

函式的功能大致把圖形的骨架畫出來

例如建立圖表、畫線畫點

反正就是除了美編以外的

import matplotlib.pyplot as plt

matplotlib.pyplot 簡稱是 "plt"

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.show() # 把圖表印出

plt.plot():畫點

他預設會把點連起來

等等會教怎麼解決

假如你要畫 \(n\) 個點

它們的座標分別為 \((x_1, y_1), (x_2, y_2), \cdots (x_n, y_n)\)

用python寫出來就是像這樣:

plt.plot([x1, x2, ..., xn], [y1, y2, ..., yn])

像前面的範例

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])

標的點就是

\((1, 1), (2, 4), (3, 9), (4, 16)\)

(還記得numpy.array的,恭喜你們)

不想要將那四個點連線怎麼辦?

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'o')
plt.show() # 把圖表印出

這個參數預設是 '–'

也就是連線的意思

如果改成 'o' 就可以
取消連線

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'r-')
plt.show() # 把圖表印出

'r–' 表示紅色線

可以猜猜看 'bo'
代表什麼

但顏色和樣式不是
目前的重點

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show() # 把圖表印出

特例

發現 plot() 裡面只有一個中括號了嗎

這個寫法是預設 x 座標依序是 \([0, 1, 2]\)

所以標出來的點是 \((0, 1), (1, 2), (2, 3)\)

假設你在做物理實驗,要記錄每一秒的狀況

而時間軸一定是橫軸

我左思右想
這麼奇怪的簡寫,其實還滿合理的

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show() # 把圖表印出

還是放個圖,比較有誠意

使用arange建立一維陣列

import numpy as np
royalex = np.arange(9)
dot_line = np.arange(0, 10, 2)
penghc = np.arange(69, 60, -2)
print(royalex)
print(dot_line)
print(penghc)

# 規則跟range一樣

# 輸出:
# [0 1 2 3 4 5 6 7 8]
# [0 2 4 6 8]
# [69 67 65 63 61]

# 記住,若R = np.arange(a, b, c)
# R裡不會有元素b

偷一下上次的簡報

還記得arange是什麼嗎

放三個參數:首項、末項、公差

注意末項會被砍

使用linspace建立陣列

import numpy as np
x = np.linspace(0, 2, 9)
# 把0~2切成9-1=8等份,然後頭尾都印出,所以會輸出9數
y = np.linspace(0, 8, 11)
# 把0~8切成10等份,頭尾都輸出,共輸出11數
print(x)
print(y)

# 輸出:
# [0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.  ]
# [0.  0.8 1.6 2.4 3.2 4.  4.8 5.6 6.4 7.2 8. ]

np.linspace(x, y, z)要切幾等分的問題可以想想種樹問題

8棵樹會有7個間隔,所以如果要切7份就要在z處填8

這邊也趕快想起來喲

官方給的範例。這根本嗑藥

import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0., 5., 0.2)
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
# r--是紅色虛線;bs是藍色正方形;g^是綠色三角形
plt.show()

同一張表裡面畫三個圖形

就通通放在plot裡然後用逗號隔開就好

不是bullsh*t

(t**2 代表t裡面每個元素都2次方)

等等看下一張投影片

猜猜 plt.axis() 什麼意思

plt.axis()

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'bo')
plt.axis([0, 6, 0, 20])
plt.show() # 把圖表印出

很明顯吧

plt.axis([0, 6, 0, 20])
plt.axis([0, 6, 0, 20])

plt.axis()

可以發現這個 function 就是在約束
兩軸顯示的區間

像上面那行就是代表僅顯示

\(0\leq x\leq 6,\ 0\leq y\leq 20\)

這個區間裡面的圖形

plt.axis([xmin, xmax, ymin, ymax])

表示僅顯示

\(x_{min }\leq x\leq x_{max},\ y_{min}\leq y\leq y_{max}\)

這個區間裡面的圖形

plt.axis()

字串當變數??!

import numpy as np
import matplotlib.pyplot as plt
dtpw = {'D': np.arange(50), 
        'T': np.linspace(-100, -2, 50)}
plt.plot('D', 'T', 'ro', data=dtpw)
plt.axis([0, 50, -100, 0])
plt.show()

dtpw是一個data

'D'和'T'都代表一個numpy.array

'D' 是 \(0\sim 49\) 的 \(50\) 個整數

'T' 是 \(-100\sim -2\) 等差的 \(50\) 個數

把'D'和'T'放進plot()裡面有點像當變數用

import numpy as np
import matplotlib.pyplot as plt
dtpw = {'D': np.arange(50), 
        'T': np.linspace(-100, -2, 50)}
plt.plot('D', 'T', 'r-', data=dtpw)
plt.axis([0, 50, -100, 0])
plt.show()

假如data裡面的東西要再做運算

import numpy as np
import matplotlib.pyplot as plt
dtpw = {'D': np.arange(50), 
        'T': np.linspace(-100, -2, 50)}
dtpw['W'] = np.abs(dtpw['T'])**(1/2)*(-1)
plt.plot('D', 'W', 'r-', data=dtpw)
plt.axis([0, 50, -10, 0])
plt.show()

(numpy.array的運算)

例題

import numpy as np
import matplotlib.pyplot as plt
dtpw = {'D': np.arange(1, 7), 
        'T': np.array([4, -11, 0, -2, 3, 9])}
dtpw['P'] = (dtpw['D']+5)*2
dtpw['W'] = np.abs(dtpw['T'])-6
plt.plot('P', 'W', 'o', data=dtpw)
plt.show()

以下那個點在圖形上?

(A) \((22, 3)\)

(B) \((1, 4)\)

(C) \((18, -8)\)

(A) \((22, 3)\)

(B) \((1, 4)\)

(C) \((18, -8)\)

當橫軸是項目時

橫軸是項目

※佛倫斯沒有任何政治立場
此圖僅作為範例

import matplotlib.pyplot as plt
names = ['Aviego', 'Braviego', 'Ceviego']
values = [1, 10, 5]
plt.plot(names, values, 'o')
plt.show()

還有一些剛剛沒講

plt.show():顯示圖表

plt.title():圖名

plt.xlabel():x軸標題

plt.ylabel():y軸標題

plt.bar():長條圖

plt.scatter():散部圖

plt.legend():顯示圖例

等等用範例簡單帶過,這邊不難

import matplotlib.pyplot as plt
names = ['Gold', 'Silver', 'Bronze']
values = [1, 3, 4]
plt.bar(names, values)
plt.title('Asian-Pacific Weak-Pretending Olympiad')
plt.show()
import matplotlib.pyplot as plt
names = ['Gold', 'Silver', 'Bronze']
values = [1, 3, 4]
plt.scatter(names, values, label='medalists')
plt.title('Asian-Pacific Weak-Pretending Olympiad')
plt.legend()
plt.show()

其實這就是 plt.plot()
然後拿掉線而已

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0,11) 
y =  2 * x +  5 
plt.title("x-t graph") 
plt.xlabel("time(unit:s)") 
plt.ylabel("displacement(unit:m)") 
plt.plot(x,y) 
plt.show()

最初的例題

謝謝大家 <3

今天的只教比較基本的東西

想了解更多可以上網站去查詢更難的製圖方法

加油!

python15

By princetonbxxxh