複数のcsvファイルを選択した場合は、シート別(ファイル名)にデータの貼り付けとグラフ(散布図)の描画を行う。
本コードは17行目(LIST_TARGET)に示す3つの系列のデータがcsvファイルに存在することを前提としている。
データ系列数が3つ以上の場合でもグラフに凡例が表示されなくなるが、動作はするはず。
#CSVのデータをExcelに貼り付けて散布図を作成
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
import numpy as np
import openpyxl as px
from openpyxl.chart import ScatterChart,Reference,Series
import os
root = tk.Tk()
#ファイルダイアログを表示するディレクトリ
INI_DIR = "D:/Python/Hello"
#書き込み先のExcelの一行目に読み込み元ファイルがどんな物理量かを記載するためのリスト
LIST_TARGET = ["時間[sec]", "角度[deg]", "角速度[deg/sec]"]
#GUIのボタンを押した時の処理
def get(*args):
#書き込み&グラフ描画用のExcelを新規作成
wb = px.Workbook()
#CSVファイルを選択する ※複数選択可
filetype = [("csv file",".csv")]
path = fl.askopenfilenames(initialdir=INI_DIR,
filetypes=filetype,
title="select file")
# 読み取った複数のCSVファイルを1つのExcelファイルにまとめる
for i in range(len(path)):
read_data = np.loadtxt(fname=path[i],
skiprows=2,
unpack=True,
encoding="UTF-8",
delimiter=",",
dtype="float")
#データ数、系列数を変数に格納
series_num = read_data.shape[0]
data_num = read_data.shape[1]
#ファイル名をシート名に設定
basename = os.path.basename(path[i])
#Excel内に新しいシートを作成してファイル名をつける
new_sheet = wb.create_sheet(index=i, title=basename)
ws = wb[basename]
#Excelの1行目に上記リストを記載する
for i in range(len(LIST_TARGET)):
ws.cell(row=1, column=i+1, value=LIST_TARGET[i])
#Excelの2行目以降にCSVデータを代入する
for i in range(data_num):
for j in range(series_num):
ws.cell(row=i+2, column=j+1, value=read_data[j][i])
#グラフとして散布図を作成する
chart = ScatterChart()
#グラフのタイトル
chart.title = "時間 vs 角度、角速度"
#x軸タイトル追加
chart.x_axis.title = "[sec]"
#y軸タイトル追加
chart.y_axis.title = "[deg], [deg/sec]"
#x軸とするデータ
x_values = Reference(ws, min_col=1, min_row=2, max_row=data_num+1)
for i in range(2, series_num+1):
#y軸とするデータ
y_values = Reference(ws, min_col=i, min_row=1, max_row=data_num+1)
#x軸とy軸の組み合わせを決める
con = Series(y_values, x_values, title_from_data=True)
#マーカーの形
con.marker.symbol = "circle"
#マーカーの塗りつぶし
con.marker.graphicalProperties.solidFill = "ffffff"
#マーカーの枠線の色
con.marker.graphicalProperties.line.solidFill = "000000"
#散布図に系列を追加
chart.series.append(con)
#シートのA1セルにグラフを追加
ws.add_chart(chart, "A1")
#Excelデータをファイル名を指定して保存
typ = [("Excel", ".xlsx")]
savefile = fl.asksaveasfilename(title="保存ファイル名を指定",
filetypes=typ,
initialdir=INI_DIR)
wb.save(savefile + ".xlsx")
#処理が完了したことをユーザーに知らせる
mb.showinfo("確認","Excelファイルの作成が完了しました")
message["text"] = "処理が完了しました"
message = tk.Label(root,text="ファイルを選択してください", width=30)
message.grid(row=0, column=0)
button = tk.Button(text="開く", command=get)
button.grid(row=0, column=1)
root.mainloop()