iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

昨天介紹的資料分析後,相信大家對於資料分析都能輕鬆上手。把特如果要把一堆數據和資料給你的老闆和顧客看,可能就比較不適合。一張圖勝過於千言萬語,你需要是將數據進行視覺化,讓別人一目了然。

Mathplotlib 是非常強大的視覺化工具,建立於 numpy 套件處理資料視覺化的套件。我們就來看看可以畫哪些圖吧!

基本技巧

安裝與使用

pip install matplotlib
import matplotlib.pyplot as plt

設定樣式

採用經典樣式

plt.style.use('classic')

notebook 設定

# 互動式圖片鑲嵌在 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')

標題

  • title:大標題
  • xlabel:x 座標說明
  • 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')

換顏色

可以直接在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')

座標軸刻度設定

  • tick_params 可以調整做座標軸上刻度的參數
    • axis:x、y、both
    • labelsize:刻度文字大小
    • color:刻度顏色
  • plt.xticks 或 plt.yticks 可以隨意顯示要的刻度
  • plt.xlim 、 plt.ylim 更改座標軸的顯示範圍
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)
  • n_rows:列數
  • n_columns:行數
  • n_subplot:第n個圖案
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()


上一篇
Day 06 : 資料處理 Pandas (2)
下一篇
Day 08 : 資料視覺化 Seaborn
系列文
Python資料分析學習地圖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言