PythonとopenpyxlでExcelの散布図を自動作成!サンプルコードで徹底解説

openpyxl

定期的なレポート作成で、毎回Excelを開いて同じような散布図を作っていませんか? データが増えるたびに範囲を修正し、タイトルを付け直し…。単純作業だとわかっていても、地味に時間がかかり、ミスの原因にもなりかねません。

もし、その作業がPythonスクリプトを実行するだけで一瞬で終わるとしたら、どうでしょう?

この記事では、Pythonのopenpyxlライブラリを使って、面倒なExcelの散布図作成を完全に自動化する方法を、たくさんのサンプルコードと共に徹底的に解説します。

はじめに:Excelの散布図作成、まだ手作業で消耗してる?

手作業によるグラフ作成は、時間がかかるだけでなく、「先月と同じ設定にしたはずなのに微妙に違う…」といった再現性の問題も起こりがちです。Pythonで自動化すれば、これらの悩みから一気に解放されます。

この記事を読めば、面倒なグラフ作成が自動化できます

  • コピペで動くサンプルコードですぐに散布図を作成できる。
  • グラフにするデータ範囲の指定方法がわかる。
  • グラフのタイトルや軸ラベルを自由自在に設定できる。
  • 複数のデータを重ねた比較グラフの作り方もわかる。

一度コードを書いてしまえば、あとはデータファイルを差し替えて実行するだけ。毎月のレポート作成が劇的に楽になります。

対象読者

  • Pythonの基本的な書き方(変数、リストなど)がわかる方
  • 手作業のExcel業務を効率化したいと考えている方
  • openpyxlでセルの読み書きはしたことがあるが、グラフ作成は初めての方

まずは準備から|必要なものリスト

コードを動かす前に、必要なライブラリと元になるデータファイルを準備しましょう。準備はとても簡単です。

Pythonライブラリ openpyxl のインストール

openpyxlは、PythonでExcelファイル(.xlsx形式)を操作するための定番ライブラリです。ターミナルやコマンドプロンプトで以下のコマンドを実行してインストールしてください。

pip install openpyxl

これだけで、Excelファイルを操作する準備は完了です。openpyxlは標準ライブラリではないため、お使いの環境に初めて導入する場合はこの作業が必要です。

グラフの元になるExcelファイル(サンプルデータ)

次に、グラフ化したいデータを含むExcelファイルを用意します。今回は、scatter_data.xlsxというファイル名で、以下のような「商品の重量と価格」のデータがSheet1に入っていると仮定します。

A列 (重量 g)B列 (価格 円)
10500
15780
221100
281350
351800
402100

このデータを使って、横軸(X軸)に重量、縦軸(Y軸)に価格をとった散布図を作成していきます。

コピペで動く!散布図を自動作成するPythonコードの全体像

まずは、完成形のコードをお見せします。上記のscatter_data.xlsxファイルと同じ階層にこのPythonスクリプトを保存して実行すれば、散布図が追加されたscatter_chart_result.xlsxというファイルが新しく生成されます。

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

# --- 1. Excelファイルの読み込みとグラフオブジェクトの準備 ---
# 既存のファイルを読み込む
wb = openpyxl.load_workbook('scatter_data.xlsx')
ws = wb.active  # アクティブなシートを選択

# ScatterChart (散布図) オブジェクトを作成
chart = ScatterChart()

# --- 2. グラフにするデータの範囲を決める (Reference) ---
# X軸のデータ範囲 (A2セルからA7セルまで)
x_values = Reference(ws, min_col=1, min_row=2, max_row=7)
# Y軸のデータ範囲 (B2セルからB7セルまで)
y_values = Reference(ws, min_col=2, min_row=2, max_row=7)

# --- 3. X軸・Y軸のデータをグラフにセットする (Series) ---
# データ系列を作成 (valuesがY軸, xvaluesがX軸)
series = Series(values=y_values, xvalues=x_values, title="重量と価格の関係")
chart.series.append(series)

# --- 4. タイトル設定とシートへの配置 ---
# グラフのタイトルと軸ラベルを設定
chart.title = "商品の重量と価格の分布"
chart.x_axis.title = "重量 (g)"
chart.y_axis.title = "価格 (円)"

# 凡例を非表示にする (系列が1つのため)
chart.legend = None

# グラフをD2セルを左上としてシートに追加
ws.add_chart(chart, "D2")

# --- 変更を保存 ---
wb.save("scatter_chart_result.xlsx")

print("処理が完了しました。'scatter_chart_result.xlsx' を確認してください。")

どうでしょうか?思ったより短いコードで実現できると感じたかもしれません。次に、このコードが何をしているのか、4つのステップに分けて詳しく見ていきましょう。

コードを徹底解説!散布図作成の重要4ステップ

ここからは、先ほどのコードを分解し、openpyxlでのグラフ作成の「キモ」となる部分を一つずつ解説します。

ステップ1:Excelファイルを読み込み、グラフオブジェクトを用意する

このステップでは、操作対象のExcelファイルを開き、グラフの土台となるオブジェクトを作成します。

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

# 既存のファイルを読み込む
wb = openpyxl.load_workbook('scatter_data.xlsx')
ws = wb.active 

# ScatterChart (散布図) オブジェクトを作成
chart = ScatterChart()

openpyxl.load_workbook()でExcelファイルをプログラムに読み込みます。wb.activeで現在アクティブになっているシート(通常は一番左のシート)を取得します。 そして、ScatterChart()を呼び出すことで、空の散布図グラフのインスタンスが作成されます。このchartオブジェクトに、これからデータや設定を追加していきます。

ステップ2:Referenceでグラフにするデータの範囲を決める

Referenceは、グラフに使うデータが**「Excelシートのどのセル範囲にあるか」**を指定するための非常に重要なオブジェクトです。

# X軸のデータ範囲 (A2セルからA7セルまで)
x_values = Reference(ws, min_col=1, min_row=2, max_row=7)
# Y軸のデータ範囲 (B2セルからB7セルまで)
y_values = Reference(ws, min_col=2, min_row=2, max_row=7)

引数の意味は以下の通りです。

  • ws: 対象となるワークシート。
  • min_col: 開始列の番号 (A列=1, B列=2, …)。
  • min_row: 開始行の番号。
  • max_row: 終了行の番号。

ここでは、X軸のデータとしてA列の2〜7行目、Y軸のデータとしてB列の2〜7行目を指定しています。列も行も番号が1から始まる点に注意してください。

ステップ3:SeriesでX軸・Y軸のデータをグラフにセットする

Referenceで指定したデータ範囲を、実際にグラフ上の1つのデータ系列(プロット群)としてまとめるのがSeriesの役割です。

# データ系列を作成
series = Series(values=y_values, xvalues=x_values, title="重量と価格の関係")
# 作成した系列をグラフに追加
chart.series.append(series)

Seriesオブジェクトを作成する際の引数が重要です。

  • values: Y軸のデータ範囲をReferenceオブジェクトで指定します。
  • xvalues: X軸のデータ範囲をReferenceオブジェクトで指定します。
  • title: 凡例に表示される系列名です。

作成したseriesオブジェクトをchart.series.append()でグラフに追加することで、初めてデータがグラフに紐付けられます。

ステップ4:タイトル設定とシートへの配置 (add_chart)

最後に、グラフの見た目を整え、シートの好きな位置に配置します。

# グラフのタイトルと軸ラベルを設定
chart.title = "商品の重量と価格の分布"
chart.x_axis.title = "重量 (g)"
chart.y_axis.title = "価格 (円)"

# グラフをD2セルを左上としてシートに追加
ws.add_chart(chart, "D2")

# 変更を保存
wb.save("scatter_chart_result.xlsx")

chart.titlechart.x_axis.titleのように、直感的なプロパティ名で各種ラベルを設定できます。 そして、ws.add_chart(chart, "D2")で、作成したchartオブジェクトをD2セルを左上の角として配置します。最後にwb.save()で変更をファイルに保存するのを忘れないようにしましょう。

【応用】もっと見やすいグラフへ!カスタマイズテクニック

基本の作り方がわかれば、応用は簡単です。ここでは、より実践的なカスタマイズ方法を2つ紹介します。

複数のデータ系列(比較グラフ)を追加する方法

例えば、自社製品と競合製品のデータを1つのグラフにプロットして比較したい場合です。C列に「競合価格」のデータがあるとしましょう。 やることは単純で、ステップ2と3の処理を、追加したいデータの分だけ繰り返すだけです。

# ... (ステップ1は同じ) ...

# --- 1つ目の系列 (自社製品) ---
x_values1 = Reference(ws, min_col=1, min_row=2, max_row=7)
y_values1 = Reference(ws, min_col=2, min_row=2, max_row=7)
series1 = Series(values=y_values1, xvalues=x_values1, title="自社製品")
chart.series.append(series1)

# --- 2つ目の系列 (競合製品) を追加 ---
# X軸(重量)は共通。Y軸はC列(3番目の列)を指定
y_values2 = Reference(ws, min_col=3, min_row=2, max_row=7) 
series2 = Series(values=y_values2, xvalues=x_values1, title="競合製品")
chart.series.append(series2)

# ... (ステップ4は同じ) ...
# この場合、凡例は表示させた方が分かりやすい
# chart.legend = None をコメントアウトまたは削除する

グラフの見た目を調整する(タイトル、軸ラベル、凡例、マーカー)

chartオブジェクトやseriesオブジェクトのプロパティを変更することで、見た目を細かく調整できます。

# 凡例の位置を右側(right)にする
chart.legend.position = 'r'

# 2つ目の系列 (series2) のマーカーをカスタマイズ
series2.marker.symbol = "triangle"  # マーカーを三角形に
series2.marker.size = 8             # マーカーのサイズを大きく
# マーカーの色を赤色 (RGB) にする
series2.marker.graphicalProperties.solidFill = "FF0000" 

このように、凡例の位置を変えたり、データ系列ごとにマーカーの形や色を変えることで、より伝わりやすいグラフを作成できます。

まとめ:Pythonで面倒なExcel作業を自動化しよう

今回は、openpyxlを使ってExcelの散布図作成を自動化する方法を、サンプルコードを交えて解説しました。

  • ScatterChart() でグラフの土台を作る。
  • Reference() でシート上のデータ範囲を指定する。
  • Series() でX軸・Y軸のデータを系列としてまとめる。
  • add_chart() でシートにグラフを配置する。

この4つのステップさえ覚えてしまえば、様々なグラフ作成に応用できます。 日々の定型業務はPythonに任せて、より創造的な仕事に時間を使いましょう。この記事が、あなたの業務効率化の第一歩となれば幸いです。

コメント

タイトルとURLをコピーしました