ChatGPT+Python 演習版 読者特典

プログラムのソース

プログラム本体(zip形式)

import pandas as pd
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import simpledialog

class ScatterPlotApp:
    def __init__(self, root):
        # ウィンドウの設定
        root.title("Scatter Plot App")
        root.geometry("400x600")

        # ファイル指定のテキストボックス
        self.lbl_file_input = tk.Label(root, text="Input CSV File Paths (separate by newline)")
        self.lbl_file_input.pack(pady=10)
        self.txt_file_input = tk.Text(root, height=10)
        self.txt_file_input.pack(pady=10)

        # グラフのドットサイズの入力
        self.lbl_dot_size = tk.Label(root, text="Dot Size")
        self.lbl_dot_size.pack(pady=5)
        self.entry_dot_size = tk.Entry(root)
        self.entry_dot_size.insert(0, "5")  # 初期値
        self.entry_dot_size.pack(pady=5)

        # ドットの透明度の入力
        self.lbl_alpha = tk.Label(root, text="Dot Transparency (0.0 to 1.0)")
        self.lbl_alpha.pack(pady=5)
        self.entry_alpha = tk.Entry(root)
        self.entry_alpha.insert(0, "1.0")  # 初期値
        self.entry_alpha.pack(pady=5)

        # グラフのY軸のMax, Minの入力
        self.lbl_ymin = tk.Label(root, text="Y Min Value")
        self.lbl_ymin.pack(pady=5)
        self.entry_ymin = tk.Entry(root)
        self.entry_ymin.insert(0, "-10")  # 初期値
        self.entry_ymin.pack(pady=5)

        self.lbl_ymax = tk.Label(root, text="Y Max Value")
        self.lbl_ymax.pack(pady=5)
        self.entry_ymax = tk.Entry(root)
        self.entry_ymax.insert(0, "10")  # 初期値
        self.entry_ymax.pack(pady=5)

        # 保存先のファイル名の入力
        self.lbl_output_file = tk.Label(root, text="Output CSV File Path")
        self.lbl_output_file.pack(pady=5)
        self.entry_output_file = tk.Entry(root)
        self.entry_output_file.insert(0, "E:\\output.csv")  # 初期値
        self.entry_output_file.pack(pady=5)

        # 実行ボタン
        self.btn_execute = tk.Button(root, text="実行", command=self.create_scatter_plot, bg="blue", fg="white", height=2, width=10)
        self.btn_execute.pack(pady=20)

    def create_scatter_plot(self):
        dot_size = float(self.entry_dot_size.get())
        alpha = float(self.entry_alpha.get())
        y_min = float(self.entry_ymin.get())
        y_max = float(self.entry_ymax.get())
        output_file = self.entry_output_file.get()

        # テキストボックスからファイルパスを取得し、改行で分割
        filenames = self.txt_file_input.get("1.0", "end-1c").split('\n')

        all_data_list = []
        plt.figure()

        for file in filenames:
            if file.strip():  # 空の行を無視
                data = pd.read_csv(file.strip())
                # ファイル名から拡張子を除去し、列名として使用
                column_name = file.split('\\')[-1].replace('.csv', '')
                data.columns = ['Time', column_name]
                all_data_list.append(data)
                plt.scatter(data['Time'], data[column_name], label=column_name, s=dot_size, alpha=alpha)

        # データを横方向に連結
        all_data = pd.concat(all_data_list, axis=1)

        plt.ylim(y_min, y_max)
        plt.legend()
        plt.show()

        # データをCSVファイルに保存
        all_data.to_csv(output_file, index=False)

if __name__ == "__main__":
    root = tk.Tk()
    app = ScatterPlotApp(root)
    root.mainloop()