前提・実現したいこと
pythonで、pandasなどで成形したdataframeを、excelに出力し、
excelのグラフを作ろうとしています。(下記のようなイメージ)
下記のようなコードを書いた(excel出力した後からの処理)のですが、これらのようなコードでは
拡張性がなく、またコードが再利用できないため、非常に保守性が悪いと感じます。
そのため、jsonなどのパラメータファイルにパラメータ部分を外出ししようと
しているのですが、よい方法をご教示いただけないでしょうか。
追記:ファイル形式はjsonにこだわらないので、ファイルから読み込んだデータに対して
長々と代入文を書くのではなく、読み込んだデータをもとに、短い行数でパラメータを
設定するような工夫ができないかをご質問したいという意図でした。文章が分かりにくく申し訳ありません。
~~追記:なお、パラメータをjsonに持たせようと思い、下記jsonファイルを作って、
d = json.loads("graph_param.json")のように辞書で読み込もうとしたのですが、
JSONDecodeError: Expecting value: line 1 column 1 (char 0)となってしまいます。
参考:
https://sasuwo.org/python_reading_json_error/
~~
すみません。この件はご指摘いただき,下記で解決しました。(基礎的な文法ミスでした)
import json
with open('graph_param.json', encoding='utf-8') as f:
dct = json.load(f)
該当のソースコード
json(graph_param.json)
1{ 2 "chart_setting":{ 3 "style_val":2, 4 "height":12, 5 "width":12, 6 "title":"test_散布図", 7 "x_axis_title":"x座標", 8 "y_axis_title":"y座標" 9 }, 10 "marker1_setting":{ 11 "read_x_col":5, 12 "read_y_col":6, 13 "mark_symbol":"circle", 14 "mark_size":12, 15 "solidFill":"FF0000", 16 "line_solidFill":"0000FF" 17 }, 18 "marker2_setting":{ 19 "read_x_col":5, 20 "read_y_col":9, 21 "mark_symbol":"regtangle", 22 "mark_size":10, 23 "solidFill":"FFFF00", 24 "line_solidFill":"00FFFF" 25 }, 26 "marker3_setting":{ 27 "read_x_col":5, 28 "read_y_col":10, 29 "mark_symbol":"circle", 30 "mark_size":8, 31 "solidFill":"FF00FF", 32 "line_solidFill":"FF00FF" 33 }, 34 "marker4_setting":{ 35 "read_x_col":5, 36 "read_y_col":11, 37 "mark_symbol":"regtangle", 38 "mark_size":6, 39 "solidFill":"FFF0FF", 40 "line_solidFill":"FFF0FF" 41 } 42}
Python
1# 関数化したい。 2wb = load_workbook("test_reg_sample.xlsx") 3 4dt_s = s_row + 1 + 1 5list_xy = [[5,6], [5, 9], [5,10], [5,11]] 6list_mark = 7# グラフサイズ 8chart = ScatterChart() 9chart.style = style_val 10chart.height = 12 11chart.width = 12 12 13# ラベル 14chart.title = "sample 散布図" # タイトル 15chart.x_axis.title = 'x座標' # チャートのx軸ラベル 16chart.y_axis.title = 'y座標' # y軸ラベル 17 18# 軸の表示範囲と目盛り間隔 19chart.x_axis.scaling.min = 0 20chart.x_axis.scaling.max = 10 21chart.y_axis.scaling.min = 0 22chart.y_axis.scaling.max = 20 23chart.x_axis.majorUnit = 5 24chart.y_axis.majorUnit = 5 25 26#y,xデータの範囲を選択 27# todo:series, chartのパラメータは外だししたい。 28for i, (c_x, c_y) in enumerate(list_xy): 29 print(i, c_x, c_y) 30 y = Reference(wb["aaa"] ,min_col=c_y, max_col=c_y, min_row=dt_s-1, max_row=s_row+1+data_len) 31 x = Reference(wb["aaa"] ,min_col=c_x, max_col=c_x, min_row=dt_s, max_row=s_row+1+data_len) 32 33 #系列変数seriesをy,xを指定して定義する。yのみラベルを含むときは、title_from_data=Trueにする 34 series = Series(y, x, title_from_data=True) 35 #プロットをつなぐ線を消す 36 series.graphicalProperties.line.noFill = True 37 38 #散布図として定義したchartへデータを指定したseries変数を渡す 39 chart.series.append(series) 40 41 #マーカーを表示する(todo:ここもパラメータ化予定) 42 series.marker.symbol = "circle" 43 chart.series[i].marker.symbol = "circle" 44 chart.series[i].marker.size = 12 45 chart.series[i].marker.graphicalProperties.solidFill = "FF0000" 46 chart.series[i].marker.graphicalProperties.line.solidFill = "0000FF" 47 48#A6セルにグラフを表示 49wb["aaa"].add_chart(chart,"L10") 50wb.save("test2.xlsx")
試したこと
openpyxlのマニュアルなどを確認し、設定可能なパラメータを調査した。
jsonのパラメータについて検索して、パラメータを読み込もうとしてみた。
エラーコードから検索したサイトを調べ、ファイルの文字コードなどを変更してみた。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー