昨天介紹的資料分析後,相信大家對於資料分析都能輕鬆上手。把特如果要把一堆數據和資料給你的老闆和顧客看,可能就比較不適合。一張圖勝過於千言萬語,你需要是將數據進行視覺化,讓別人一目了然。
Mathplotlib 是非常強大的視覺化工具,建立於 numpy 套件處理資料視覺化的套件。我們就來看看可以畫哪些圖吧!
pip install matplotlib
import matplotlib.pyplot as plt
採用經典樣式
plt.style.use('classic')
# 互動式圖片鑲嵌在 notebook
%matplotlib notebook
# 靜態的圖片鑲嵌在 notebook
%matplotlib inline
import matplotlib.pyplot as plt
x = [ i**2 for i in range(10)]
plt.plot(x)
plt.show()
import matplotlib.pyplot as plt
x = [ i**2 for i in range(10)]
plt.plot(x)
plt.savefig('demo.jpg')
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes()
x = np.linspace(-5, 5, 1000)
ax.plot(x, np.sin(x))
plt.title('Sin')
plt.xlabel('x')
plt.ylabel('y')
可以直接在color這個參數修改文字,詳細可以參考
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes()
x = np.linspace(-5, 5, 1000)
ax.plot(x, np.sin(x), color='red')
plt.title('Sin')
plt.xlabel('x')
plt.ylabel('y')
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes()
x = np.linspace(-5, 5, 1000)
ax.plot(x, np.sin(x))
plt.title('Sin')
plt.xlabel('x')
plt.ylabel('y')
# 調整 x 的刻度
plt.xticks([-3, -2, 0, 2, 5])
# 調整 x 的範圍
plt.xlim(-10, 10)
plt.tick_params(axis='x', labelsize=12, color='r')
記得 plt.plot 的回傳值要使用「,」才能讓 lengend 正確呼叫成功哦!
loc 的參數可以是 best、upper right、center left、lower left 等等(可自己組組看英文)
import matplotlib.pyplot as plt
stock_a = [ 10, 59, 70, 61, 80]
stock_b = [ 67, 83, 37, 32, 48]
stock_c = [ 43, 23, 84, 75, 37]
month = [ 4, 5, 6, 7, 8]
plt.xticks(month)
line_a, = plt.plot(month, stock_a, '-o', label='A')
line_b, = plt.plot(month, stock_b, '-*', label='B')
line_c, = plt.plot(month, stock_c, '-^', label='C')
plt.legend(handles=[line_a, line_b, line_c], loc='lower right')
plt.title('Stock', fontsize=16)
plt.xlabel('Month', fontsize=16)
plt.ylabel('the price of stock', fontsize=16)
plt.show()
當然一張圖也可以塞很多不同種類的圖片,透過 subplot 可以各種擺圖案哦!
plt.subplot(n_rows, n_columns, n_subplot)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 1000)
plt.figure(figsize=(20, 5))
plt.subplot(1, 3, 1)
plt.plot(x, np.sin(x))
plt.subplot(1, 3, 2)
plt.plot(x, np.cos(x))
plt.subplot(1, 3, 3)
plt.plot(x, np.tan(x))
其實把 np.linspace 第三個參數值稍為調整低一點,只有呈現 20 個點,那就可以畫散佈圖囉
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = plt.axes()
x = np.linspace(-5, 5, 20)
y = np.sin(x)
plt.plot(x, y, 'o')
# plt.scatter(x, y)
plt.title('Scatter Plot')
plt.xlabel('x')
plt.ylabel('y')
plt.plot 和 plt.scatter 都可以畫出這個圖。而 plt.scatter 可以針對每個點的大小或顏色作設定,在資料量小的時候沒有差別,但倘若要繪製的資料點超過數千個時候,plt.plot 採用複製的方式、plt.scatter是個別建立,效能上 plt.plot 會勝過 plt.scatter。
import matplotlib.pyplot as plt
import numpy as np
# 隨機生成 1000個點(normal distribution)
d = np.random.randn(1000)
plt.hist(d)
若想要每個長條加上數字,可以使用 plt.text 搭配迴圈
import matplotlib.pyplot as plt
import numpy as np
fruits_num = [120, 320, 275]
ind = np.arange(len(fruits_num))
fig, ax = plt.subplots(figsize = (10,5))
plt.xticks(ind, ['banana', 'apple', 'lemon'])
plt.ylim(0, 500)
ax.bar(ind, fruits_num, width=0.4)
for index, data in enumerate(fruits_num):
plt.text(x=index , y =data+30 , s=data , fontdict=dict(fontsize=20))
plt.show()