用python 畫圖 -- matplotlib -- 騙錢教學 (一)

要用matplotlib來做數據處理和畫圖的話,基本上最好有裝numpy, scipy, 和 matplotlib


然後簡單的畫圖大多是用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....

留言

  1. 感恩喔!找了一個早上到下午,才知道!要添加plt.show()這樣子才能把結果hold住,這麼簡單道理我在書上都找不到,谷哥爬文也找不到!終於看見明燈了!不過你在捲簾表示框中的完整原始碼有打錯把plt.show()打成 (# 這個指令算是 "秀圖" ,"pyplot".show() )想要用的人可能會卡在這裡,所以要改一下!!!不然,結果圖每次出來後就一閃而逝!

    回覆刪除
  2. 打太快沒注意到~已訂正~感謝校正~~。

    回覆刪除
  3. 非常感謝您的範例! 幫助很大!

    回覆刪除
  4. 感謝教學分享!

    回覆刪除
  5. 感謝教學, 受益良多!

    回覆刪除
  6. 感謝分享 很實用

    回覆刪除
  7. 如果是sin改成x*2sin(x)要怎麼用

    回覆刪除
    回覆
    1. import numpy as np
      x = np.arange(0,180)
      y = x * 2 * np.sin(x)

      刪除
    2. numpy 產生的 array 可以支援像是下面這種語法:

      y = x * 2 * np.sin(x)

      這個特性好像是和 numpy 的 "broadcast" 有關,有興趣可以去查查。

      刪除
  8. 謝謝,簡易明瞭

    回覆刪除
  9. 感謝.很容易明白.也很實用.

    回覆刪除

張貼留言

熱門文章