這篇跟下篇都會介紹繪圖工具。這篇會介紹 Matplotlib。
此篇文是由 Joyce 所撰寫
如果想用自己的電腦來跑的話需要安裝 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() # 顯現圖形
(座標)圖形的基本組成會有
特別注意,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() # 顯現圖形
在繪製圖形時,預設的線條顏色是藍色,想要改變顏色的話,只需要把參數加上去即可。常見的方法有兩種
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,常用的語法
字串打法 | 數字打法 |
---|---|
'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
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)就會很方便,它可以將圖形進行切割,並在各個位置擺上子圖。繪製子圖需要三個重要的參數
例如:
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() # 顯現圖形
今天的繪圖方式跟明天的很像,只是在使用的方式上不一樣,那明天見了!