ChatGPT+Python 演習版 読者特典
プログラムのソース
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()