Python 複数のcsvファイルから指定したxyデータをExcelへ抽出して散布図を作成する「openpyxl」

 '20/01/31更新:文末の関連記事を更新したことで、本記事のコードを更新しました。
 本記事では、次の1,2のような処理をすることで、最終的に下図のような表と散布図を作成します。
1. 複数のcsvファイルから指定した2列をそれぞれ抽出して、列方向へ並べてゆき、ひとつのエクセルファイルにて保存する。
2. 次に、Excel上で重ね合わせ散布図を作成する。

f:id:HK29:20200131185826p:plain

 ■本プログラム
使用手順は本コードの下に記載してます。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys, glob
import re
sys.path.append(".")
import csv_combine_excel as mymodu

import pandas as pd
import numpy as np
from openpyxl import load_workbook
from openpyxl.chart import ScatterChart,Reference,Series
from openpyxl.chart.text import RichText
from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties, Font

import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

def csv2excel_graph(fname):
    wb = load_workbook(fname)
    rows = wb['Sheet1'].max_row
    columns = wb['Sheet1'].max_column
    print("rows -> " + str(rows))
    print("columns -> " + str(columns))
    ws = wb.active
    
    chart = ScatterChart()
    myfont = Font(typeface='Calibri')
    cp = CharacterProperties(latin=myfont, sz=1400)
    chart.title = "hogehoge"
    chart.x_axis.title = 'x axis'
    chart.x_axis.title.tx.rich.p[0].r[0].rPr = cp
    chart.x_axis.txPr = RichText(p=[Paragraph(pPr=ParagraphProperties(defRPr=cp), endParaRPr=cp)])
    chart.y_axis.title = 'y axis'
    chart.y_axis.title.tx.rich.p[0].r[0].rPr = cp
    chart.y_axis.txPr = RichText(p=[Paragraph(pPr=ParagraphProperties(defRPr=cp), endParaRPr=cp)])

    for i in range(1, columns, 2):
        x_values = Reference(ws, min_col=i, min_row = 2, max_row = rows)
        y_values = Reference(ws, min_col=i+1, min_row = 1, max_row = rows)
        con = Series(y_values, x_values, title_from_data=True)
        con.marker.symbol = 'circle'
        con.marker.size = 2
        #con.marker.graphicalProperties.solidFill ="FFFFFF"
        chart.series.append(con)
    ws.add_chart(chart, "A18") 
    wb.save(fname)

if __name__ == '__main__':
    ### parameter
    myfiles = glob.glob("*.csv")
    myfiles = sorted(myfiles, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
    mycolumn_name_list = ('x', 'y')
    myheader = 1
    mydata_startrow = 3
    outfile = now + '_' + mycolumn_name_list[0] + '_' + mycolumn_name_list[1] + '.xlsx'

    ### call function
    mymodu.csv2excel(myfiles, mycolumn_name_list, myheader, mydata_startrow, outfile)
    csv2excel_graph(outfile)

●使用手順

1. 自作モジュールは、下記リンク先にあるコードを「csv_combine_excel.py」のファイル名で保存する。

Python csvファイル中にある指定2列を複数ファイルからひとつのExcelファイルを作成する - HK29’s blog

2. 本体プログラムは、本記事の上記「本プログラム」をコピペして適当な名前、例えば「csv2excel_plotgraph.py」と付けて保存する。

3. 適当なcsvファイルをいくつか用意する(上記リンク先のような数値の行列データ)。下図はファイル構成であり、csvファイル名と数に制約条件はない。

f:id:HK29:20191110113755p:plain

4. $ python csv2excel_plotgraph.py などとして本体ファイルを実行する

5. 実行後

下図のようにエクセルファイルと、パイキャッシュフォルダができる。

f:id:HK29:20191110114312p:plain

以上

<広告>