MatplotlibとPandasで日付データのカーネル密度推定(KDE)プロットを作成する方法
Matplotlibを使用して、Pandasの日付データからカーネル密度推定(KDE)プロットを作成する方法を解説します。KDEプロットはデータの分布を滑らかな曲線で可視化できる便利な手法ですが、日付型はそのままでは数値演算ができないため、序数(ordinal)に変換してからプロットするのがポイントです。
実装の手順
- 図のサイズを設定し、サブプロット周辺の余白(パディング)を調整します。
- Pandasのデータフレームを作成します。
- 日付列を序数(ordinal)形式に変換します。
- 序数値に対してカーネル密度推定(kind='kde')でプロットします。
- set_xticklabels()メソッドを使って、x軸の目盛りラベルを読みやすい日付形式に戻します。
- 図を表示するにはshow()メソッドを使用します。
コード例
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
dates = pd.date_range('2010-01-01', periods=31, freq='D')
df = pd.DataFrame(np.random.choice(dates, 100), columns=['dates'])
df['ordinal'] = [x.toordinal() for x in df.dates]
ax = df['ordinal'].plot(kind='kde')
x_ticks = ax.get_xticks()
ax.set_xticks(x_ticks[::2])
xlabels = [datetime.datetime.fromordinal(int(x))
.strftime('%Y-%m-%d') for x in x_ticks[::2]]
ax.set_xticklabels(xlabels)
plt.show()
出力結果

コードのポイント解説
pd.date_range('2010-01-01', periods=31, freq='D') により、2010年1月1日を起点とした31日分の日付範囲を生成しています。次に np.random.choice(dates, 100) でその中からランダムに100個の日付を選択し、データフレームを作成します。
KDEの計算には数値が必要なため、toordinal() メソッドで各日付を序数(西暦1年1月1日を1とする連続した整数値)に変換した新しい列「ordinal」を追加しています。
x軸の目盛りは get_xticks() で取得し、スライス [::2] を使って1つおきに表示することで、ラベル同士の重なりを防いでいます。最後に fromordinal() で序数を日付オブジェクトへ戻し、strftime('%Y-%m-%d') によって「年-月-日」形式の文字列に整形してラベルとして設定すれば、直感的に読み取れるグラフが完成します。
-
Python Matplotlibで密度マップをプロットする方法を徹底解説
PythonのMatplotlibを使って密度マップ(ヒートマップ)をプロットするには、pcolormesh()メソッドを利用するのが便利です。この記事では、NumPyでデータを生成し、擬似カラープロットとして可視化するまでの手順をコード例とともに解説します。 密度マップを描く基本の手順 NumPyを使ってside(軸の範囲)、x、y、zのデータを作成します。NumPyのlinspace関数を使うと、指定した区間を任意の分割数で等間隔にサンプリングしたデータを簡単に生成できます。 meshgrid()関数にsideのデータを渡し、1次元の座標ベクトルから2次元の座標行列(メッシュグリッド)
-
Matplotlibを使ってPythonで3D密度マップを描画する方法を徹底解説
MatplotlibとNumPyを組み合わせると、Pythonで簡単に3D密度マップ(濃度分布図)を作成できます。本記事では、pcolormesh()メソッドを使って擬似カラープロットとして密度マップを可視化する具体的な手順を、サンプルコード付きでわかりやすく解説します。 3D密度マップを描画する基本の手順 NumPyでデータを生成する:side、x、y、zの各データをNumPyで作成します。特にlinspace関数を使うと、指定した2点間の範囲を任意の分割数で等間隔にデータ生成できるため便利です。 座標行列を作成する:sideデータをもとにmeshgrid()を使い、座標ベクトルから2次元