pandas と matplotlib を使って CSV を可視化し、ドラッグ操作で選択した範囲だけを別ファイルに切り出すための Tkinter 製 GUI ツールです。グラフ上で横軸の列を切り替えたり、凡例クリックで表示する値列をトグルしながらデータの切り出し条件を調整できます。
- 任意の CSV を読み込み、横軸に使う列を選択可能
- 時刻らしい列を自動推測し、必要に応じて日時として解釈
- index 以外の数値/数値変換可能な列を自動でプロット
- 凡例クリックで系列の表示・非表示を切り替え (軸は表示ラインだけで自動スケール)
- matplotlib の SpanSelector によるドラッグ範囲選択と、選択区間の CSV への書き出し
- 横軸が非数値の場合は順序インデックスにフォールバックして切り出し位置を明示
- Python 3.9 以上 (tkinter が使える環境)
- pandas
- matplotlib
- numpy
python -m pip install pandas matplotlib numpy- 上記依存パッケージをインストールします。
- 本リポジトリを取得し、スクリプトを起動します。
python csv_range_slicer_gui.py
- GUI が起動したら
CSVを開く...ボタンから元データを読み込みます。 - 横軸にしたい列をコンボボックスから選択します。
indexを日時として解釈を有効にすると、列値を日時として扱うよう試行されます。 プロット更新を押すと、index 以外の数値列 (もしくは数値変換できる列) がグラフに表示されます。凡例をクリックすると各列の表示/非表示を切り替えられます。- グラフ上をドラッグして抽出したい範囲を選択します。選択範囲はウィンドウ上部に表示されます。
選択区間をCSV出力...を押し、書き出し先を指定すると選択した範囲だけを CSV として保存できます。
- 横軸が日時の場合: matplotlib の日時スケールをもとに、選択区間の Timestamp を求めてフィルタリングします。
- 横軸が数値の場合: index を数値へ変換し、選択区間
[xmin, xmax]に含まれる行を抽出します。 - 横軸が非数値の場合: 元の行順を 0,1,2,... のポジションとして扱い、選択した位置の行を抽出します (選択位置はステータス表示に原値と併せて表示)。
- 書き出し時には選択した index を明示するため、index を列としてリセットしたうえで保存します。
- 空のグラフになる: 選択した index 以外に数値列が無い可能性があります。凡例の案内やラベルを確認してください。
- フォントや UI が崩れる: Tkinter のテーマに依存するため、必要に応じて OS の DPI 設定やテーマを調整してください。
- tkinter が見つからない: Linux 等で python3-tk パッケージの追加インストールが必要な場合があります。
- 主要ロジックは
CsvRangeSlicerAppクラス (csv_range_slicer_gui.py) にまとまっています。 - 凡例のクリック検出や SpanSelector の作成など、UI 再描画時にイベント再登録が必要な処理は
_create_span_selectorや_setup_legend_interactivityで行っています。 - 改修時は pandas/matplotlib のバージョン差異 (例:
relim(visible_only=True)の対応状況) に注意してください。