Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibで12か月ごとに年の目盛りを表示する日付軸の設定方法

Matplotlibで時系列データを可視化する際、「月ごとの細かい目盛りは残しつつ、年ラベルだけ12か月ごと(=毎年)に表示したい」というニーズはよくあります。本記事では、matplotlib.datesモジュールが提供するYearLocatorMonthLocatorDateFormatterを組み合わせて、見やすい日付軸を実現する方法を解説します。

実装の手順

  • 図のサイズを設定し、サブプロット周辺の余白を自動調整します。
  • Pandas・NumPy・matplotlib.datesを使って、日付インデックス、データ系列、および各種ロケーター/フォーマッター(years、months、monthsFmt、yearsFmt)を準備します。
  • DateFormatterに「%B」を指定すると、月名がフルネーム(January、Februaryなど)で表示されます。
  • DateFormatterに「%Y」を指定すると、年が4桁の数値で表示されます。
  • plt.figure()で新しい図を作成します(既存の図がある場合はそれをアクティブ化します)。
  • add_subplot()で図にax(Axesオブジェクト)を追加します。
  • plot()メソッドで「dts」(datetime型のインデックス)と「s」(データ系列)をプロットします。
  • set_minor_locator()にmonthsを設定することで、小目盛りが月単位になり、大目盛りの年ラベルが12か月ごとに表示されるようになります。
  • plt.show()で図を画面に表示します。

コード例

import numpy as np
from matplotlib import pyplot as plt, dates as mdates
import pandas as pd

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

# 2020年1月〜2021年6月まで7日間隔の日付範囲を生成
d = pd.date_range("2020-01-01", "2021-06-01", freq="7D")
y = np.cumsum(np.random.normal(size=len(d)))
s = pd.Series(y, index=d)

# ロケーターとフォーマッターの定義
years = mdates.YearLocator()
months = mdates.MonthLocator()
monthsFmt = mdates.DateFormatter('%B')
yearsFmt = mdates.DateFormatter('\n%Y')

dts = s.index.to_pydatetime()
fig = plt.figure()

ax = fig.add_subplot(111)
ax.plot(dts, s)

# 小目盛り:月ごとに月名を表示
ax.xaxis.set_minor_locator(months)
ax.xaxis.set_minor_formatter(monthsFmt)
plt.setp(ax.xaxis.get_minorticklabels(), rotation=90)

# 大目盛り:12か月ごとに年を表示
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)

plt.show()

ポイント解説

mdates.YearLocator()は年単位の大目盛り(major tick)を配置するロケーター、mdates.MonthLocator()は月単位の小目盛り(minor tick)を配置するロケーターです。この2つを組み合わせることで、月レベルの詳細な情報を保ちながら、年に一度だけ目立つ年ラベルを表示できます。

また、DateFormatter('\n%Y')のように先頭に改行文字を入れると、年ラベルが月ラベルより一段下にずれて表示され、ラベル同士の重なりを防ぐことができます。plt.setp()で小目盛りのラベルを90度回転させているのも、長い月名が重ならないようにするための工夫です。

出力結果

上記のコードを実行すると、次のようなグラフが出力されます。月名が縦向き(90度回転)の小目盛りラベルとして表示され、その下段に年ラベルが12か月ごとに配置されているのが確認できます。

Matplotlibで12か月ごとに年の目盛りを表示する日付軸の設定方法Matplotlibで12か月ごとに年の目盛りを表示する日付軸の設定方法

  1. Matplotlibで3Dプロットのアスペクト比を設定する方法

    Matplotlibで3Dプロットのアスペクト比を設定するには、set_aspect()メソッドを使用します。ここでは、曲面プロット(サーフェスプロット)を例に、具体的な手順とサンプルコードを解説します。 3Dプロットのアスペクト比を設定する手順 以下の手順に従って実装します。 figure()メソッドで新しい図を作成するか、既存の図をアクティブにします。 projection=3d を指定して現在のAxes(座標軸)を取得します。存在しない場合は自動的に作成されます。 numpyを使ってデータ点 R、Y、z を生成します。 R、Y、zをもとにサーフェスプロット(曲面図)を作成します。 s

  2. Matplotlibのグラフをフルスクリーンで表示する方法

    Matplotlibで作成したグラフをフルスクリーン(全画面)で表示したい場合、full_screen_toggle()メソッドを使用すると簡単に実現できます。このメソッドは、現在開いているフィギュアウィンドウを全画面モードに切り替える機能を持ちます。 手順 figure()メソッドを使って、新しいフィギュアを作成するか、既存のフィギュアをアクティブにします。 2つのリストを渡してplot()メソッドを呼び出し、折れ線グラフを描画します。 get_current_fig_manager()メソッドで、現在のフィギュアのマネージャー(figure manager)を取得します。 取得したマネー