Python

【matplotlib】x軸を日付へ変換&フォーマット

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Pythonのmatplotlibで日付を表示させたいけどウマくいかない…

『横軸の日付が重なって潰れないようにするには?』
『Excelのように日付形式を変更できるの?』

こんな疑問に答えます。

SE歴25年のオッサンが解説するぞい!
SEおっさん
SEおっさん

【matplotlib】x軸を日付へ変換&フォーマット

Pythonにmatplotlibというグラフ描画ライブラリがあります。
グラフのX軸に日付データをセットして、
日付表示形式のフォーマットや、角度をつけたり出来ます。

x軸の型変換(文字列→日付)とフォーマット形式の変更手順

  1. CSVデータをPandasのdataflameに読み込ませる
  2. 日付の文字列を日付型へ変換する(x軸)

    str型 => datetime型 変換

  3. 見やすい角度に調整する

    plt.xticks(rotation=30) #横軸目盛りを30度傾ける

  4. 見やすい日付にフォーマットする

    set_major_formatterとmatplotlibライブラリのmdatesを使用



スポンサーリンク

CSVデータをPandasのdataflameに読み込ませる

厚生労働省のHPよりPCR検査実施人数CSVを入手して、Pandasのdataflameに読み込む処理です

/* Pandasをインポート */
import pandas as pd 

# 厚生労働省のPCR検査実施人数
URL = "https://www.mhlw.go.jp/content/pcr_tested_daily.csv"

# PandasでCSV読み込み
df = pd.read_csv(URL)

df.tail()

キチンと取得したCSVをdfに読み込めてますね。

日付の文字列を日付型へ変換する

Pandasのdataflameに読み込んだPCR検査情報は全て文字列型です。
日付に見える項目も実際は文字列型になっています。

文字列型を日付型に変換し、matplotのpyplotで表示してみましょう。

#matplotlibのpyplotをインポート
import matplotlib.pyplot as plt

#横軸(x軸)に日付を設定
X = df.iloc[700:, 0]   #データ量が多いため700行目以降
X_dt = pd.to_datetime(X)

#縦軸:PCR検査実施人数
Y = df.iloc[700:, 1]   #データ量が多いため700行目以降

#グラフ作図
plt.plot(X_dt, Y)
plt.show()

はい。
一応、日付がでてますが潰れちゃってますね^^;
これを見栄え良くフォーマットしましょう。

Y軸の1e6となっているのは、10の6乘という意味です。



スポンサーリンク

日付を見やすい角度に調整する

日付を見やすい角度に調整します。

plt.plot(X_dt, Y)

#横軸目盛りを30度傾ける
plt.xticks(rotation=30)

plt.show()

日付の潰れが解消されて、見やすい形になりました。

datetime型のプロットをするとデフォルトのyyyy-mm形式で表示されます。
少し長いですよね。
次は、日付の表示形式を変更です。

日付を見やすい表示形式にフォーマットする

今度は日付を見やすい表示形式にフォーマットしよう。
フォーマットとは書式という意味です。

日付の表示形式の変更は下記を使用します。
・set_major_formatter
・matplotlibライブラリのmdates

matplotlibでX軸の日付データをExcelのようにフォーマットで表示形式を変更することができます。
例を見ていきましょう。

plt.plot(X_dt, Y)

#横軸目盛りを30度傾ける
plt.xticks(rotation=30)

# 日付表示のフォーマット
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%y/%m"))
plt.show()

日付表示のフォーマットをyy/mm形式に変更できましたね。

%y…西暦 (下2桁) の 10進数(※%Yは4桁)
%m…0埋めした10進数の月(※%Mは分)
ちなみに、
%d…0埋めした10進数の日にち(※%Dはmm/dd/yy)
となります。

 

表示の調整は、まだまだ調査が必要かなぁ…
うーん。奥が深いPandasとmatplotlib。
頑張るぞー (^^;
とりあえず、今日はこれまで。

SEおっさん
SEおっさん
ここまで読んでくれてありがとう!

「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪

「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪

LINEでのお問合わせも受付中!
LINE公式アカウント

メッセージをお待ちしています!

取得資格
  • 応用情報技術者
  • Oracle Master Gold
  • Java Silver SE
  • Java EE Webコンポーネントディベロッパ
  • Python エンジニア認定データ分析
  • 簿記2級


スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • LINEで送る

コメントを残す

*