在處理資料時我們總是會希望資料以最好懂的方式呈現,但若照我們以往的處理方式再怎麼樣排版也都是文字輸出,如果將資料畫成圖表不是可以更清楚的呈現嗎?今天我就來介紹一個資料視覺畫的基礎模組 matplotlib
pipenv --python 3.7
pipenv shell
pipenv install matplotlib
import matplotlib.pyplot as plt
data1 = [1.0,2.5,3.5,4.8,9.5,13.5]
data2 = [1,2,3,4,5,6]
# X軸數據 Y軸數據
plt.scatter(data2, data1)
plt.show()
import matplotlib.pyplot as plt
data1 = [1.0,2.5,3.5,4.8,9.5,13.5]
data2 = [1,2,3,4,5,6]
# X軸數據 Y軸數據
plt.plot(data2, data1)
plt.show()
import matplotlib.pyplot as plt
data = [1.0,2.5,3.5,4.8,9.5,13.5,5.3,2.5,7.4,9.5]
plt.hist(data, width=0.5)
plt.show()
import matplotlib.pyplot as plt
data = [1.0,2.5,3.5,4.8,9.5,13.5,5.3,2.5,7.4,9.5]
plt.boxplot(data)
plt.show()
import matplotlib.pyplot as plt
data = [1.0,2.5,3.5,4.8]
plt.pie(data)
plt.show()
程式修改來源:https://www.itread01.com/article/1532154074.html
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import random
#import seaborn
def urandom():
return random.randint(100,2000)
#取樣點選擇1400個,因為設定的訊號頻率分量最高為600赫茲,根據取樣定理知取樣頻率要大於訊號頻率2倍,所以這裡設定取樣頻率為1400赫茲(即一秒內有1400個取樣點,一樣意思的)
x=np.linspace(0,1,4000)
#設定需要取樣的訊號,頻率分量有180,390和600
#y=7*np.sin(2*np.pi*180*x) + 2.8*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x)+6.2*np.sin(2*np.pi*751*x)
y=7*np.sin(2*np.pi*urandom()*x) + 2.8*np.sin(2*np.pi*urandom()*x)+5.1*np.sin(2*np.pi*urandom()*x)+6.2*np.sin(2*np.pi*urandom()*x)
#y=7*np.sin(2*np.pi*urandom()*x)
yy=fft(y) #快速傅立葉變換
yreal = yy.real # 獲取實數部分
yimag = yy.imag # 獲取虛數部分
yf=abs(fft(y)) # 取絕對值
yf1=abs(fft(y))/len(x) #歸一化處理
yf2 = yf1[range(int(len(x)/2))] #由於對稱性,只取一半區間
xf = np.arange(len(y)) # 頻率
xf1 = xf
xf2 = xf[range(int(len(x)/2))] #取一半區間
plt.subplot(221)
plt.plot(x[0:50],y[0:50])
plt.title('Original wave')
plt.subplot(222)
plt.plot(xf,yf,'r')
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B') #注意這裡的顏色可以查詢顏色程式碼表
plt.subplot(223)
plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')
plt.subplot(224)
plt.plot(xf2,yf2,'b')
plt.title('FFT of Mixed wave',fontsize=10,color='#F08080')
count = 0
for i in yf2:
if(i > 0.7):
print(xf2.item(count))
count += 1
plt.show()
延伸閱讀
https://matplotlib.org/
https://ithelp.ithome.com.tw/articles/10186484
https://www.itread01.com/article/1532154074.html
https://blog.techbridge.cc/2018/05/11/python-data-science-and-machine-learning-matplotlib-tutorial/