iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
3
AI & Data

資幾資比系列 第 4

[Series - 3] Matplotlib

前言

這篇跟下篇都會介紹繪圖工具。這篇會介紹 Matplotlib

此篇文是由 Joyce 所撰寫


實作連結


Matplotlib

  • Matplotlib是NumPy可視覺化的操作介面,也是Python最常見的繪圖軟件
  • 它是一種圖像處理工具,與Matlab相似,最大的不同點是它可以結合Python的其他函數,及Matplotlib是免費的
  • Matplotlib的預設參數是可以進行更改的,像是顏色大小字體

環境準備

如果想用自己的電腦來跑的話需要安裝 Package

# For anoconda (recommend)
$ conda install matplotlib

# For pip
$ pip install matplotlib

小試身手

在正式開始介紹之前,先來個小小的練習,前面說到Matplotlib是NumPy的圖形介面,因此我們引入NumPy,做個簡單的介紹。

實作

import numpy as np # 引入NumPy
from matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(20) # x軸的值
y = 3 * x + 1  # y軸的值

plt.title("practice") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x,y) # 繪製x,y軸的圖
plt.show() # 顯現圖形

(座標)圖形的基本組成會有

  • title : 標題,即這個圖形名稱
  • xlabel : x軸的名稱,有時可以加註單位
  • ylabel : y軸的名稱,有時可以加註單位
  • plot : 繪製,建立好各自的座標後,利用plot進行繪製,
  • show : 顯示,利用plot繪製好的圖形是不會顯現出來的,需要用show才可以將圖形呈現出來

特別注意,Matplotlib的標題及名稱是不支援中文的,如果打中文的話,會顯示不出來。可以另外下載套件支援中文的輸入。


線的樣式

進行座標圖形的繪製時,預設線的樣式是實線,可用以下的參數進行修改,參數的關鍵字是linestyle,也可以用簡寫ls,

  • $-$ 實線
  • $--$ 虛線
  • $:$ 點線

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(20) # x軸的值
y = 3 * x + 1  # y軸的值

plt.title("change linestyle") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x,y,ls = "--") # 繪製x,y軸的圖
plt.show() # 顯現圖形


線條粗細

可以利用參數linewidth,將線條的粗細進行改變,預設值是1,數值越大越粗,愈小則越細

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(20) # x軸的值
y = 3 * x + 1  # y軸的值

plt.title("change linewidth") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x,y,linewidth = 5) # 繪製x,y軸的圖
plt.show() # 顯現圖形


顏色改變

在繪製圖形時,預設的線條顏色是藍色,想要改變顏色的話,只需要把參數加上去即可。常見的方法有兩種

  1. color = "某顏色",例如 : color = "藍色"
  2. color = 十六進制表示法,例如 : color = "#FFFF00"

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(20) # x軸的值
y = 3 * x + 1  # y軸的值

plt.title("change color") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x,y, color = "red") # 繪製x,y軸的圖
plt.show() # 顯現圖形

加上圖例

當圖形中有兩條以上的線條時,加上圖例可以讓圖形更加完整。圖例的參數是legend,常用的語法

  1. loc : 位置,即圖例是放置在哪
字串打法 數字打法
'best' 0
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10

best 會依據圖形選擇一個最好的位置(1~10其中一個),預設為best

  1. fontsize : 字體大小,可以數值表示,單位是points,或設定好大小的參數
    • 數值
    • xx-small
    • x-small
    • small
    • medium
    • large
    • x-large
    • xx-large

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(20) # x軸的值
y1 = 3 * x + 1  # y軸的值
y2 = -3 * x + 20  # y軸的值

plt.title("add legend") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x,y1, color = "red", label = "y1") # 繪製x,y1的圖
plt.plot(x,y2, ls = "--", label = "y2") # 繪製x,y2的圖
plt.legend(loc = 0, prop={'size': "x-large"})
plt.show() # 顯現圖形

座標圖

上面的例子全部都是座標圖的舉例,下面換一個sin的函數作呈現。

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(-180, 180)
y = np.sin(x * np.pi / 180.0)

plt.title("change color") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x, y) # 繪製x,y軸的圖
plt.show() # 顯現圖形


散佈圖

散佈圖即點圖,在平面上分布,常應用於相關的分析上,繪製散佈圖需用scatter這個函數。

實作

import matplotlib.pyplot as plt # 引入matplotlib的函數

x = [1,2,8,9,3,4,5,6] # x軸的值
y = [3,1,8,5,4,3,2,6]  # y軸的值

plt.title("scatter diagram") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.scatter(x, y) # 繪製散佈圖
plt.show() # 顯現圖形                       

直方圖

直方圖是用來呈現一維的資料,要繪製時,需使用hist這個函數。經常直方圖會用來表示累積的資料,此時需將參數cumulative設定為True,預設為False。

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

data = np.random.normal(size = 50) # 產生50個常態分配的亂數
plt.title("histogram") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.hist(data)# 繪製直方圖
plt.show() # 顯現圖形        

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

data = np.random.normal(size = 50) # 產生50個常態分配的亂數
plt.title("histogram2") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.hist(data,cumulative=True)# 繪製直方圖
plt.show() # 顯現圖形 

長條圖

長條圖是用來呈現二維的資料,繪製時,需使用bar這個函數。bar是直的顯示,若想要橫向顯示,需使用barh

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(1,11) # x軸的值
y = [3,1,8,5,4,2,4,6,3,7]  # y軸的值

plt.title("bar chart") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.bar(x, y) # 繪製長條圖
plt.show() # 顯現圖形 

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(1,11) # y軸的值
y = [3,1,8,5,4,2,4,6,3,7]  # x軸的值

plt.title("bar chart2") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.barh(x, y) # 繪製長條圖
plt.show() # 顯現圖形 


折線圖

折線圖在Matplotlib裡跟座標圖的寫法一樣,利用plot的函數繪製。

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(1, 9) # x軸的值
y = [3,1,8,5,4,3,2,6]  # y軸的值

plt.title("line chart") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.plot(x, y) # 繪製折線圖
plt.show() # 顯現圖形        

圓餅圖

有時,資料比較適合用圓餅圖呈現,可以用pie這個函數繪製出圓餅圖。

實作

import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

category = ["clothing", "book", "meal", "snacks"] # 總類名稱
expand = [2000, 1500, 3000, 800]  # 圓餅圖的值
color = ["rea", "yellow", "blue", "green"] # 設定顏色

plt.title("pie chart") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
plt.pie(expand, label = category, color = color) # 繪製圓餅圖
plt.show() # 顯現圖形 


子圖

有時候,會將圖表放在一起比較,這時候使用子圖(subplot)就會很方便,它可以將圖形進行切割,並在各個位置擺上子圖。繪製子圖需要三個重要的參數

  1. nrows : 切割的列數
  2. ncols : 切割的行數
  3. index : 放在哪個格子裡

例如:

實作

import matplotlib.pyplot as plt # 引入matplotlib的函數

fig = plt.figure()    #創建圖表
sub1 = fig.add_subplot(2, 2, 1) # 添加子圖表1
sub2 = fig.add_subplot(2, 2, 2) # 添加子圖表2
sub3 = fig.add_subplot(2, 2, 3) # 添加子圖表3
sub4 = fig.add_subplot(2, 2, 4) # 添加子圖表4

sub1.plot(np.arange(5), [8,5,3,6,7]) # 繪製子圖1
sub2.plot(np.arange(5), [2,4,2,5,6]) # 繪製子圖2
sub3.plot(np.arange(5), [4,3,5,6,1]) # 繪製子圖3
sub4.plot(np.arange(5), [8,2,4,3,5]) # 繪製子圖4

plt.show() # 顯現圖形


結語

今天的繪圖方式跟明天的很像,只是在使用的方式上不一樣,那明天見了!


參考資料


上一篇
[Series - 2] Pandas基礎介紹
下一篇
[Series - 4] Seaborn
系列文
資幾資比31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言