iT邦幫忙

0

matplotlib技巧- x,y軸的刻度是時間或日期的折線圖怎麼畫?

matplotlib是好用的數據繪圖工具,
然而,若x,y軸的資料不是單純的數字,
而是日期,
該如何做圖呢?

譬如說我有這樣的資料,
表示某間課後安親班的家長來接送某小朋友的時間,
以管控小朋友的狀況

x軸表示日期,
y軸表示小朋友那天的回家時間

# 資料
x = ['7/21', '7/22', '7/23', '7/24', '7/25', '7/26']
y = ['17:20', '17:40', '17:36', '18:20', '17:13', '17:45']

我們主要用到的是datetime.strptime函數,
將單純的「字串」轉化為「日期」格式

from datetime import datetime
# 資料
x = ['7/21', '7/22', '7/23', '7/24', '7/25', '7/26']
y = ['17:20', '17:40', '17:36', '18:20', '17:13', '17:45']

# 轉為日期格式
x = [datetime.strptime(d, '%m/%d').date() for d in x]
y = [datetime.strptime(d, '%H:%M') for d in y]

%的意義由年~秒依序為 「%Y %m %d %H %M %S」 (年、月、日、時、分、秒,注意大小寫需正確)

注意由於y軸不是「日期」,是「小時: 分鐘」的格式,
datetime.strptime(d, '%H:%M')就好,
不要取.date()

再來用matplotlib繪折線圖,
座標軸的格式也必須調為「日期」格式,
完整範例如下:

from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

# 資料
x = ['7/21', '7/22', '7/23', '7/24', '7/25', '7/26']
y = ['17:20', '17:40', '17:36', '18:20', '17:13', '17:45']

# 轉為日期格式
x = [datetime.strptime(d, '%m/%d').date() for d in x]
y = [datetime.strptime(d, '%H:%M') for d in y]

# 設置座標軸的格式
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=1)) #座標軸刻度1天

plt.gca().yaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.gca().yaxis.set_major_locator(mdates.MinuteLocator(interval=10)) #座標軸刻度10分鐘

# Plot
plt.plot(x, y,'r-^') # 設定樣式
plt.savefig("time.png", bbox_inches='tight') #存檔,第二個參數表示把圖表外多餘的空間刪除
plt.show()

結果:
https://ithelp.ithome.com.tw/upload/images/20200730/201171147TcXSBLxr1.png

注意set_major_locator的格式中,
可以根據不同時間單位做選擇,
從秒到年的都有

  • SecondLocator
  • MinuteLocator
  • HourLocator
  • DayLocator
  • WeekdayLocator
  • MonthLocator
  • YearLocator

尚未有邦友留言

立即登入留言