用python 畫圖 -- matplotlib -- 騙錢教學 (一)
要用matplotlib來做數據處理和畫圖的話,基本上最好有裝numpy, scipy, 和 matplotlib
然後簡單的畫圖大多是用matplotlib裡面的 pyplot 這個func來進行
然後簡單的畫圖大多是用matplotlib裡面的 pyplot 這個func來進行
下面從簡單的例子來說明(難的我也不會...Orz...不然怎麼叫騙錢教學)
第一步: 畫二維數據圖:
假設要畫sin圖....
# 載入需要的...
import matplotlib.pyplot as plt
import numpy as np
# 準備數據 ... 假設我要畫一個sin波 從0~180度
x = np.arange(0,180)
y = np.sin(x * np.pi / 180.0)
# 開始畫圖
# 設定要畫的的x,y數據list....
plt.plot(x,y)
# 設定圖的範圍, 不設的話,系統會自行決定
plt.xlim(-30,390)
plt.ylim(-1.5,1.5)
# 照需要寫入x 軸和y軸的 label 以及title
plt.xlabel("x-axis")
plt.ylabel("y-axis")
plt.title("The Title")
# 在這個指令之前,都還在做畫圖的動作
# 這個指令算是 "秀圖"
plt.show()
# 如果要存成圖形檔:
# 把 pyplot.show() 換成下面這行:
plt.savefig("filename.png",dpi=300,format="png")
而調整線寬的方式就是再多加一個lw的參數:
plt.plot(x,y,lw=3)
出圖後:
如果不想畫線而想畫點的話(改變line style),就在把 plt.plot(x,y) 這一行的引數多加"o",變成下面這行:
plt.plot(x,y,"o")
然後就會得到下圖:
當然還有很多其他的style可選,像是"ro"就是紅點,"--" 會是虛線, "r--" 就是紅色虛線。
這裡只先介紹最簡單的,如果要其他更複雜的line style的話,就要花工夫看manual了:
=============
第二步,畫多條線
=============
很簡單...想畫幾行就多加幾行plt.plot(....)
如下面的完整範例:
========================
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(0,360,5)
y1 = np.sin(x1 * np.pi / 180.0)
x2 = x1
y2 = np.cos(x2 * np.pi / 180.0)
x3 = x1
y3 = np.tan(x3 * np.pi / 180.0)
plt.plot(x1,y1,lw=3)
plt.plot(x2,y2,"ro")
plt.plot(x3,y3,"y--",lw=5)
plt.ylabel("y_label")
plt.xlabel("x_label")
plt.title("Title")
plt.xlim(-30,390)
plt.ylim(-5,5)
plt.show()
==================
一張圖裡面有多張數據圖...
==================
像上個例子,如果想把sin 圖和cos圖分別畫在上下兩張圖的話,就要用plt.subplot:
plt.subplot() 這個指令就是拿來畫多張圖用的指令。
而引入的參數是一個三位數的號碼ex: 212
前兩位號碼是用來分別指定上下、左右 各要畫幾張圖,而最後一位數就是接下來的圖是第幾號圖....(應該有看沒有懂吧...)
拿實例來說明。
假設要畫六張圖,上下兩張圖 左右三張圖 的排列方式: ( 2 x 3 )
圖1 圖2 圖3
圖4 圖5 圖6
可以看到上面的排列,圖的順序是由上而下由左而右來算的。而第三位碼就是拿來指定第幾張圖的。
所以在畫圖1的時候:
subplot(231)
plt.plot(x1,y1)
...
畫圖2的時候:
subplot(232)
plot.plot(x2,y2)
...
給個完整的範例的話:
當然...我故意不畫235的圖(圖5)....
不過上面可以看到一個問題,那就是231, 232, 234, 236這幾張圖的x軸刻度讓數字都疊在一起了...
所以下面說明一下,怎麼自定這個軸刻度。
用plt.xticks() 來設定x軸刻度,用plt.yticks()來設定軸刻度:
把你要畫的數值放進一個 list 後引入就可以了
ex: plt.xticks([10,20,30,40,50])
所以...接下來的範例就看下面(注意plt.xticks(), plt.yticks()的地方,和圖畫出來的樣子...)
先寫到這...好累...Orz....
plt.plot(x,y,lw=3)
出圖後:
如果不想畫線而想畫點的話(改變line style),就在把 plt.plot(x,y) 這一行的引數多加"o",變成下面這行:
plt.plot(x,y,"o")
然後就會得到下圖:
當然還有很多其他的style可選,像是"ro"就是紅點,"--" 會是虛線, "r--" 就是紅色虛線。
這裡只先介紹最簡單的,如果要其他更複雜的line style的話,就要花工夫看manual了:
=============
第二步,畫多條線
=============
很簡單...想畫幾行就多加幾行plt.plot(....)
如下面的完整範例:
========================
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(0,360,5)
y1 = np.sin(x1 * np.pi / 180.0)
x2 = x1
y2 = np.cos(x2 * np.pi / 180.0)
x3 = x1
y3 = np.tan(x3 * np.pi / 180.0)
plt.plot(x1,y1,lw=3)
plt.plot(x2,y2,"ro")
plt.plot(x3,y3,"y--",lw=5)
plt.ylabel("y_label")
plt.xlabel("x_label")
plt.title("Title")
plt.xlim(-30,390)
plt.ylim(-5,5)
plt.show()
==================
一張圖裡面有多張數據圖...
==================
像上個例子,如果想把sin 圖和cos圖分別畫在上下兩張圖的話,就要用plt.subplot:
plt.subplot() 這個指令就是拿來畫多張圖用的指令。
而引入的參數是一個三位數的號碼ex: 212
前兩位號碼是用來分別指定上下、左右 各要畫幾張圖,而最後一位數就是接下來的圖是第幾號圖....(應該有看沒有懂吧...)
拿實例來說明。
假設要畫六張圖,上下兩張圖 左右三張圖 的排列方式: ( 2 x 3 )
圖1 圖2 圖3
圖4 圖5 圖6
可以看到上面的排列,圖的順序是由上而下由左而右來算的。而第三位碼就是拿來指定第幾張圖的。
所以在畫圖1的時候:
subplot(231)
plt.plot(x1,y1)
...
畫圖2的時候:
subplot(232)
plot.plot(x2,y2)
...
給個完整的範例的話:
當然...我故意不畫235的圖(圖5)....
不過上面可以看到一個問題,那就是231, 232, 234, 236這幾張圖的x軸刻度讓數字都疊在一起了...
所以下面說明一下,怎麼自定這個軸刻度。
用plt.xticks() 來設定x軸刻度,用plt.yticks()來設定軸刻度:
把你要畫的數值放進一個 list 後引入就可以了
ex: plt.xticks([10,20,30,40,50])
所以...接下來的範例就看下面(注意plt.xticks(), plt.yticks()的地方,和圖畫出來的樣子...)
先寫到這...好累...Orz....
感恩喔!找了一個早上到下午,才知道!要添加plt.show()這樣子才能把結果hold住,這麼簡單道理我在書上都找不到,谷哥爬文也找不到!終於看見明燈了!不過你在捲簾表示框中的完整原始碼有打錯把plt.show()打成 (# 這個指令算是 "秀圖" ,"pyplot".show() )想要用的人可能會卡在這裡,所以要改一下!!!不然,結果圖每次出來後就一閃而逝!
回覆刪除打太快沒注意到~已訂正~感謝校正~~。
回覆刪除非常感謝您的範例! 幫助很大!
回覆刪除感恩
回覆刪除感恩
回覆刪除感謝分享
回覆刪除感謝教學分享!
回覆刪除非常棒的入門
回覆刪除感謝教學
回覆刪除謝謝教學!!
回覆刪除謝謝寫得很棒
回覆刪除3qqq
回覆刪除感謝教學
回覆刪除寫得很棒!
回覆刪除感謝教學
回覆刪除感謝教學, 受益良多!
回覆刪除感謝分享 很實用
回覆刪除如果是sin改成x*2sin(x)要怎麼用
回覆刪除import numpy as np
刪除x = np.arange(0,180)
y = x * 2 * np.sin(x)
numpy 產生的 array 可以支援像是下面這種語法:
刪除y = x * 2 * np.sin(x)
這個特性好像是和 numpy 的 "broadcast" 有關,有興趣可以去查查。
謝謝,簡易明瞭
回覆刪除感謝.很容易明白.也很實用.
回覆刪除