LoginSignup
0
0

More than 1 year has passed since last update.

【matlotlib】時系列データの大小比較をやってみる

Posted at

はじめに

matplotとpandasを使ったグラフ作成です。
自分が研究でよく使うグラフを纏めました。
よろしければ使ってあげて下さい。

使用データ

flows.csvは以下のデータ形式

date observed simulated
1999/11/1 0.215 0.183
1999/11/2 0.176 0.173
1999/11/3 0.126 0.157

時系列グラフ

pandasで読み込んで表示するだけ

出力結果

output2.png

ソースコード

import pandas as pd

path = "flows.csv"
# csvデータの読み込み
data = pd.read_csv(path)
# 日付データの変更
data["date"] = pd.to_datetime(data["date"])
# 日付データをインデックスに設定
data = data.set_index("date")
# 時系列データの表示
data.plot(xlabel='date', ylabel='flow(m3/s)')

散布図

1対1の散布図とヒストグラムの作成。推定値と実測値の大小関係を表示。過大評価、過小評価の傾向を確認します。
ここを参考にしました。

出力結果

output.png

ソースコード

参考

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def scatter_hist(df, x_label, y_label, ax, ax_histx, ax_histy):
    x = df[x_label]
    y = df[y_label]
    # 表示する軸ラベルを限定
    ax_histx.tick_params(axis="x", labelbottom=False)
    ax_histy.tick_params(axis="y", labelleft=False)

    # y=xの直線記述
    ax.axline((-1,-1),(5000,5000), zorder=1,color='#252526')

    ##### 散布図作成 #####
    ax.scatter(x, y, zorder=2, alpha=0.5, color='#0000FF')
    # 軸範囲を制限
    xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
    ax.set_xlim(0,int(xymax)*1.1)
    ax.set_ylim(0,int(xymax)*1.1)
    # 軸ラベルフォントサイズ設定
    ax.tick_params(axis='x', labelsize=11)
    ax.tick_params(axis='y', labelsize=11)
    # ラベルのフォントサイズ設定
    ax.set_xlabel('observed', fontsize=13)
    ax.set_ylabel('simulated', fontsize=13)

    ##### ヒストグラム作成 #####
    # 階級幅作成
    binwidth = 0.25 # 幅設定
    lim = (int(xymax/binwidth) + 1) * binwidth
    bins = np.arange(0, lim + binwidth, binwidth)
    # 描画
    ax_histx.hist(x, bins=bins, color='#89B59F')
    ax_histy.hist(y, bins=bins, orientation='horizontal', color='#89B59F')

path = "flows.csv"
# csvデータの読み込み
data = pd.read_csv(path)

# 正方形の図を設定
fig = plt.figure(figsize=(6, 6), dpi=100)
# グラフを2*2の区画に分割
# それぞれの区画の幅の比はwidth_ratios,height_ratios
# その他のパラメータでグラフの大きさ,間隔調整
gs = fig.add_gridspec(2, 2,  width_ratios=(4, 1), height_ratios=(1, 4),
                      left=0.1, right=0.9, bottom=0.1, top=0.9,
                      wspace=0.1, hspace=0.1)
# axを定義
ax = fig.add_subplot(gs[1, 0])
ax_histx = fig.add_subplot(gs[0, 0], sharex=ax)
ax_histy = fig.add_subplot(gs[1, 1], sharey=ax)
# グラフを描画(散布図,ヒストグラム)
scatter_hist(data, 'observed', 'simulated', ax, ax_histx, ax_histy)

棒グラフで年毎の流量比較

年毎の総流量を実測値と推定値で比較。matplotlibのver3.5以降で使えます。
ここを参考にしました。

出力結果

output3.png

ソースコード

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

path = "flows.csv"
# csvデータの読み込み
data = pd.read_csv(path)
# 日付データの変更
data["date"] = pd.to_datetime(data["date"])
# 日付データをインデックスに設定
data = data.set_index("date")
# 月毎のデータ合計
data = data.resample('Y').sum()
data = data.set_index(data.index.year)

# DataFrameをリスト化
labels = list(data.index)
observed_lst= [round(flow,1) for flow in data['observed']]
simulated_lst = [round(flow,1) for flow in data['simulated']]

x = np.arange(len(labels))  # ラベルの位置
width = 0.4  # バーの幅
gap = 0.01  # バーの間隔

fig, ax = plt.subplots()
flows1 = ax.bar(x - width/2-gap, observed_lst, width, label='Observed', color = '#b4c7c8')
flows2 = ax.bar(x + width/2+gap, simulated_lst, width, label='Simulated', color = '#4c9da2')

# ラベル,タイトル等の追加
ax.set_ylabel('Flow(m3/s)')
ax.set_title('Yearly flow')
ax.set_xticks(x, labels = labels) # ver3.5以降で追加
ax.legend()

# 棒グラフの上に数値を表示
ax.bar_label(flows1, padding=0.5)
ax.bar_label(flows2, padding=0.5)

# 無駄な余白を埋める
fig.tight_layout()

終わりに

随時追加予定

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0