1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CSVのデータをExcelに貼り付けて散布図を作成

Last updated at Posted at 2021-05-16

複数の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()
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?