質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5010閲覧

OpenPyXLでの複数グラフの作成位置

Seven_Sea

総合スコア23

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/02 01:47

現在OpenPyxlにていくつかある数値を1個1個グラフ化したいという思いがあります。
一応、グラフ作成まではこぎつけたのですが、
最後の”.add_chart(cahrt,"A13")”のところで、A13に大量にグラフが作成されるようになってます。

FORで回しているので、1個1個別のセルなどに作成されるようにしたいのですが、
どなたかお分かりになるようでしたら、おしえていだだければと思います。

よろしくお願いいたします。

以下にエクセルの画像(こうなってほしい理想)とコードを記載します。
イメージ説明

import openpyxl
import random
from openpyxl.chart import ScatterChart,Reference,Series

wb = openpyxl.load_workbook("test.xlsx")
ws = wb["Sheet1"]
max_row = wb['Sheet1'].max_row
min_row = wb['Sheet1'].min_row
max_col = wb['Sheet1'].max_column

for i,d in zip(range(1,max_col+1,2),range(2,max_col+1,2)):
chart =ScatterChart()
xvalues = Reference(ws, min_col=i, min_row=min_row, max_row=max_row)
values = Reference(ws, min_col=d, min_row=min_row, max_row=max_row)
series = Series(values, xvalues)
series.marker.symbol = 'square'
chart.series.append(series)
chart.legend = None
ws.add_chart(chart, "A13")

wb.save("test2.xlsx")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

原因はfor文で何度も同じA13のセルに描画してしまっているから、何枚も同じセルに配置されてしまっています。
別のセルに描画をしたいという事であれば、その都度違うセルを指定する必要があります。

【Python】 エクセル列のアルファベットと数字の変換
こちらのページのコードを引用し、任意の数字をエクセルの列(アルファベット)に変換が出来ます。
掲題の質問の画像を見るに8セルおきにグラフを描画している様でしたので
適当にカウントを行う為の変数を用意し、8ずつ加算していきながらアルファベットに変換して描画しましょう。

python

1def toAlpha31(num): 2 h=int((num-1-26)/(26*26)) 3 i=int((num-1-(h*26*26))/26) 4 j=num-(i*26)-(h*26*26) 5 Alpha='' 6 for k in h,i,j: 7 if k!=0: 8 Alpha+=chr(k+64) 9 return Alpha 10 11cnt = 1 12for i,d in zip(range(1,max_col+1,2),range(2,max_col+1,2)): 13 chart =ScatterChart() 14 xvalues = Reference(ws, min_col=i, min_row=min_row, max_row=max_row) 15 values = Reference(ws, min_col=d, min_row=min_row, max_row=max_row) 16 series = Series(values, xvalues) 17 series.marker.symbol = 'square' 18 chart.series.append(series) 19 chart.legend = None 20 ws.add_chart(chart, "{}13".format(toAlpha31(cnt))) 21 cnt += 8

追記:途中で折り返したい場合

python

1cnt = 1 2column = 13 # 予め変数として行位置を指定しておく 3for i,d in zip(range(1,max_col+1,2),range(2,max_col+1,2)): 4 chart =ScatterChart() 5 xvalues = Reference(ws, min_col=i, min_row=min_row, max_row=max_row) 6 values = Reference(ws, min_col=d, min_row=min_row, max_row=max_row) 7 series = Series(values, xvalues) 8 series.marker.symbol = 'square' 9 chart.series.append(series) 10 chart.legend = None 11 ws.add_chart(chart, "{}{}".format(toAlpha31(cnt), column)) 12 cnt += 8 13 if cnt > 任意の数字: # 折り返したいタイミングを指定する 14 cnt = 1 # cntのリセット 15 column += 15 # グラフの高さ分だけ加算

投稿2020/10/02 02:41

編集2020/10/02 02:53
nto

総合スコア1438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Seven_Sea

2020/10/02 02:47

ありがとうございます。 助かりました。
nto

2020/10/02 02:54

延々と横に繰り返されてしまうコードになってしまっている為 ただいま途中で折り返し、次の行に描画していく~という為のコードも追記致しました。 ご参考下さい。
Seven_Sea

2020/12/05 13:28

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問