Matplotlibで非常に大きなデータセット(日付、時刻(x軸)と記録された値(y軸)を1年間毎日15分ごとにプロットする方法)

Aug 23 2020

Pythonでx対yのグラフを作成することになっています。私のデータセットは、1年の長さ15分間隔で記録された日付-時刻と温度で構成されています。1か月のデータがあり、Matplotlibでプロットしようとしたとします。x軸(データ時間)が軸全体に塗りつぶされているため、グラフがそれほど明確ではなく、明確な画像が得られませんが、Excelではmatplotlibと比較して優れたプロットが得られます。

30個の毎日のcsvデータ記録ファイルを開き、それを連結して1つのデータフレームを形成するために使用するコードは次のとおりです。

import pandas as pd
from openpyxl import load_workbook
import tkinter as tk
import datetime
from datetime import datetime
from datetime import time
from tkinter import filedialog
import matplotlib.pyplot as plt
root = tk.Tk()
root.withdraw()
root.call('wm', 'attributes', '.', '-topmost', True)
files = filedialog.askopenfilename(multiple=True) 
%gui tk
var = root.tk.splitlist(files)
filePaths = []
for f in var:
    df = pd.read_csv(f,skiprows=8, index_col=None, header=0, parse_dates=True, squeeze=True, encoding='ISO-8859–1', names=['Date', 'Time', 'Temperature', 'Humidty']) #, 
    filePaths.append(df)
    df = pd.concat(filePaths, axis=0, join='outer', ignore_index=False, sort=True, verify_integrity=False, levels=None) 
    df["Time period"] = df["Date"] + df["Time"]
    plt.figure()
    plt.subplots(figsize=(25,20))
    plt.plot('Time period', 'Temperature', data=df, linewidth=2, color='g')
    plt.title('Temperature distribution Graph')
    plt.xlabel('Time')
    plt.grid(True)

データの例

出力グラフは次のようになります。

出力グラフでわかるように、x軸にデータポイントがあり、読み取り可能な形式ではありません。また、.csvファイルを数日間ロードして連結すると、matplotlibは複数のグラフを表示します。

Excel / Libreでプロットされた同じデータセットは、x軸に日付が正しく配置された滑らかなグラフを提供し、折れ線グラフも完璧です。

Excel / Libreでプロットされたものと同様のグラフをプロットするようにコードを書き直したいと思います。助けてください

回答

PeterArk Aug 23 2020 at 21:20

このアプローチを試してください:

日付ロケーターを使用して、必要な日付範囲でx軸をフォーマットします。日付ロケーターを使用して、間隔を秒、分などで定義できます。

  • SecondLocator:秒を検索
  • MinuteLocator:分を検索
  • HourLocator:時間を見つけます
  • DayLocator:指定された曜日を検索します
  • MonthLocator:月を検索します
  • YearLocator:年を検索します

この例ではMinuteLocator、15分間隔でを使用しています。

matplotlib.datesプロットの就業日へのインポート:

import matplotlib.dates as mdates

import pandas as pd
import matplotlib.pyplot as plt

データを取得する

# Sample data
# Data
df = pd.DataFrame({
    'Date': ['07/14/2020', '07/14/2020', '07/14/2020', '07/14/2020'],
    'Time': ['12:15:00 AM', '12:30:00 AM', '12:45:00 AM', '01:00:00 AM'],
    'Temperature': [22.5, 22.5, 22.5, 23.0]
})

Time period文字列から日付オブジェクトに変換します。

# Convert data to Date and Time
df["Time period"] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

定義minmax間隔:

min = min(df['Time period'])
max = max(df['Time period'])

プロットを作成します。

# Plot

# Create figure and plot space
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot()

ロケーターを使用して時間間隔を設定します。

# Set Time Interval
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=15))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))

プロットオプションとプロットを設定します。

# Set labels
ax.set(xlabel="Time",
       ylabel="Temperature",
       title="Temperature distribution Graph", xlim=[min , max])

# Plot chart
ax.plot('Time period', 'Temperature', data=df, linewidth=2, color='g')
ax.grid(True)
fig.autofmt_xdate()
plt.show()