iT邦幫忙

3

【python好用模組-matplotlib】好用數據繪圖工具,折線圖、散點圖、長條圖都難不倒我

嗨,大家好,
今天要來認識好用的數據繪圖工具- matplotlib,
據說matplotlib的命名緣由是來自另一個程式語言matlab,
如果對matlab熟悉那對matplotlib會更快上手

但我對matlab不熟,
直接來學習matplotlib吧

安裝

matplotlib不是python的內建模組,
可能會需要另外安裝(我不確定anaconda有沒有幫忙裝好)
安裝指令:pip install matplotlib

引用模組

撰寫程式前,會在程式最上方引入模組

import matplotlib.pyplot as plt

基礎概念

雖然matplotlib的指令非常多,
但是最重要的就記兩個指令就好:
plot()show()
plot()是在圖形上畫線(不顯示在螢幕上),
show()是當我們畫好圖形,顯示在螢幕上,
其它指令就是如何把圖形畫的更精美。

基礎折線圖

譬如說我們有x軸和y軸上的數據,
把xy軸上面的點傳入plot()中,
即可畫出折線圖(注意傳入xy的數據需一樣多):

import matplotlib.pyplot as plt

xpt = [1,3,5]
ypt = [1,9,25]
plt.plot(xpt,ypt) #畫線
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114NL0kEACNqj.png

然而目前這張圖非常樸素,
一般我們在做圖表時,可能會想要有圖表的標題
或想要設定線段寬度、樣式、顏色…等,
或是把很多條線畫在同一張圖裡互相比較,
製作圖例讓人了解每條線的意思

這邊就逐步介紹各項功能吧

座標軸刻度、樣式設定

可以用xticksyticks這兩個指令來設定x軸及y軸的刻度,
範例:

import matplotlib.pyplot as plt

xpt = [1,3,5]
ypt = [1,9,25]
plt.plot(xpt,ypt) #畫線
plt.xticks([0,5,10]) #設定x軸刻度
plt.yticks([0,10,20,50]) #設定y軸刻度
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114tawDbTq1cX.png

tick_params()則可以設定座標軸的刻度大小顏色
範例:

import matplotlib.pyplot as plt

xpt = [1,3,5]
ypt = [1,9,25]
plt.plot(xpt,ypt) #畫線
plt.xticks([0,5,10]) #設定x軸刻度
plt.yticks([0,10,20,50]) #設定y軸刻度
plt.tick_params(axis='both', labelsize=60, color='green')
plt.show() #顯示繪製的圖形

(labelsize=60將刻度設為超大字)
https://ithelp.ithome.com.tw/upload/images/20200622/201171147ONF46nxqg.png

標題顯示

目前matplotlib暫無支援顯示中文,
以下有幾個重要的方法:

  • title: 圖表標題
  • xlabel: x軸標題
  • ylabel: y軸標題
    可選參數為fontsize,可以設定標題的文字大小

範例:

import matplotlib.pyplot as plt

xpt = [1,3,5]
ypt = [1,9,25]
plt.plot(xpt,ypt) #畫線
plt.title("My Chart", fontsize=24) #圖表標題
plt.xlabel("xValue", fontsize=16) #x軸標題
plt.ylabel("yValue", fontsize=20) #y軸標題
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114nWJKM0kySi.png

多組數據

如果有多組數據,就在plt.plot()的參數依序輸入多組數據,
例如:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y_1 = [1,4,9,16,25,36,49,64]
y_2 = [1,8,27,64,125,216,343,512]
plt.plot(x,y_1,x, y_2) #畫線
plt.tick_params(axis='both', labelsize=24, color='green')
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114YLWpP0vMUW.png

線條色彩、樣式與圖例

想要設定線條樣式,
可以在plot裡面設定,
底下列出常見的色彩及樣式參數

字元 顏色
b blue(藍色)
g green(綠色)
k black(黑色)
r red(紅色)
w white(白色)
y yellow(黃色)
字元 線條樣式
- 預設實線
-- 虛線
-. 虛點線
: 點線

| 字元 | 標記 |
| . | 點標記|
| , | 像素標記|
| o | 圓標記|
| v | 反三角標記|
| ^ | 三角標記|
| s | 方形標記|
| p | 五角標記|
| * | 星星標記|
| + | 加號標記|

這些樣式可以組合使用,
例如r-.^是紅色點虛線三角標記,
g--*是綠色虛線星號標記,
範例:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y_1 = [1,4,9,16,25,36,49,64]
y_2 = [1,8,27,64,125,216,343,512]
plt.plot(x,y_1,'r-.^',x, y_2, 'g--*') #畫線
plt.tick_params(axis='both', labelsize=24, color='green')
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/201171142wIGnXjclY.png

其實這張圖畫的不錯了,
只是可以再加上圖例說明紅線跟綠線是什麼東東

圖例- plt.legend()

我覺得這個語法非常特殊
範例:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y_1 = [1,4,9,16,25,36,49,64]
y_2 = [1,8,27,64,125,216,343,512]

Data_1, = plt.plot(x,y_1,'r-.^',label='x_square') #畫線
Data_2, = plt.plot(x, y_2, 'g--*',label='x_cube') #畫線

plt.tick_params(axis='both', labelsize=24, color='green')
plt.legend(handles=[Data_1, Data_2])
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114X1D1b7w1DQ.png

在plot的參數需額外設置label
另外在這行Data_1, = …
注意變數後面要多一個逗號

保存圖檔

如果想要把自己畫好的圖存起來,
可以使用plt.savefig()指令,
注意這個指令必須放在plt.show()之前
範例:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y_1 = [1,4,9,16,25,36,49,64]
y_2 = [1,8,27,64,125,216,343,512]

Data_1, = plt.plot(x,y_1,'r-.^',label='x_square') #畫線
Data_2, = plt.plot(x, y_2, 'g--*',label='x_cube') #畫線

plt.tick_params(axis='both', labelsize=24, color='green')
plt.legend(handles=[Data_1, Data_2])
plt.savefig('testChart.png', bbox_inches='tight') #存檔,第二個參數表示把圖表外多餘的空間刪除
plt.show() #顯示繪製的圖形

繪製散點圖

繪製散點圖的語法跟折線圖有點像,
plt.plot()改成plt.scatter()
但參數略有不同,plt.scatter()可選參數有sc
分別用來指定點的大小顏色,範例:
(s預設20,c預設是藍色)

import matplotlib.pyplot as plt

xpt=range(1,11)
ypt=[x**2 for x in xpt]
plt.scatter(xpt,ypt, s=40, c='green')
plt.title("Test Chart", fontsize=24) #圖表標題
plt.xlabel("xValue", fontsize=16) #x軸標題
plt.ylabel("yValue", fontsize=16) #y軸標題
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114PV2pu03Fgi.png

繪製長條圖

繪製長條圖的語法可以用plt.bar(X, Y, width)
width表示長條圖寬度

小馬想到一個應用,
譬如說小明7~9月的電費支出為[531,690,326]
便可以用長條圖表示:

import matplotlib.pyplot as plt

spends = [531,690,326]
X = [7,8,9]
plt.bar(X,spends, 0.35)
plt.title('Electricity Expense Table') #表格名稱: 電費支出表
plt.ylabel('Monthly electricity bill') # y軸標題
plt.xticks(X,['July','August','September']) #設定x軸刻度
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114zGsc7snoo6.png

其它補充- axes()與axis()函數

matplotlib裡面有這兩個非常像的函數,
如果不明白的話讀別人程式還會以為他是不是拼錯字了,
所以給大家介紹介紹

  • axis(列表)- 設定x, y座標的範圍
    例子:
import matplotlib.pyplot as plt

xpt = [1,3,5]
ypt = [1,9,25]
plt.plot(xpt,ypt) #畫線
plt.axis([0,20,0,50])
plt.show() #顯示繪製的圖形

本例將x座標的範圍設在0~20,
y座標的範圍設在0~50,
https://ithelp.ithome.com.tw/upload/images/20200622/20117114XfilBovhmT.png

  • axes([左邊位置, 下邊位置, 寬, 高])- 設定圖表本身的位置(左下角座標為(0,0), 右上角座標為(1,1))
    可參考「參考資料2」,畫出圖中圖的效果
    範例:
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
plt.axes([0, 0, 1, 1]) #畫大圖
plt.plot(x,y) #畫線

xpt = [1,3,5]
ypt = [1,9,25]
plt.axes([0.7, 0.2, 0.25, 0.25]) #畫小圖
plt.plot(xpt,ypt) #畫線
plt.show() #顯示繪製的圖形

https://ithelp.ithome.com.tw/upload/images/20200622/20117114SmsEPV5AmS.png

參考資料

  1. (書本) Python入門邁向高手之路王者歸來/ 出版社:深石/ 作者: 洪錦魁
    https://ithelp.ithome.com.tw/upload/images/20200301/20117114iS8wGZXAWv.png

蠻推薦這本書的,深入淺出講解語法,跟著實作很好懂,涵蓋主題也廣

  1. matplotlib畫圖中圖

尚未有邦友留言

立即登入留言