はじめに
Excelで3Dサーフェスグラフ(等高線グラフ)、手作業で作るのは少し面倒ではありませんか? 多くのデータを元に複雑なグラフを作成しようとすると、クリック操作が多くなり時間がかかってしまいます。
本記事では、そんな悩みを解決するために、Pythonの人気ライブラリopenpyxlを使って3Dサーフェスグラフの作成を自動化する方法を、初心者にも分かりやすく解説します。
この記事を最後まで読めば、SurfaceChart3Dの基本的な使い方をマスターし、面倒なデータ可視化の作業を大幅に効率化できるようになります。レポート作成の自動化に、ぜひ役立ててください。
準備:openpyxlをインストールしよう
まず、この記事で利用するopenpyxlライブラリをインストールします。 PythonでExcelファイルを操作するための定番ライブラリです。
まだインストールしていない方は、お使いのターミナルやコマンドプロンプトで以下のコマンドを実行してください。
pip install openpyxlすでにインストール済みの方は、このセクションは読み飛ばして次へ進んでください。また、今回のサンプルコードでは数値計算を簡単にするためnumpyも使用します。同様にインストールしておくと便利です。
pip install numpyopenpyxlのSurfaceChart/SurfaceChart3Dとは?
SurfaceChartやSurfaceChart3Dは、3次元データを可視化するためのグラフです。 Excelで手動作成できる「等高線グラフ」や「3-D等高線グラフ」を、Pythonコードで生成するものだと考えてください。
SurfaceChart: データをワイヤーフレーム(針金)で表現します。SurfaceChart3D: データに色付けを行い、地形のように表現します。
数値の大小を「高さ」と「色」で直感的に表現できるため、特定のパターンの発見や、データ全体の傾向を把握するのに非常に役立ちます。例えば、以下のようなデータの可視化に適しています。
- ある領域の温度や圧力の分布
- 地形の標高データ
- 数学関数のプロット
- 機械学習モデルの出力結果
今回は、より視覚的に分かりやすいSurfaceChart3Dをメインに解説を進めます。
ステップ1:グラフ化するデータを準備する
3Dサーフェスグラフを作成するには、元となる格子状(グリッド状)のデータが必要です。 Excelシート上では、行列形式でデータが並んでいる状態をイメージしてください。ここでは、グラフ化するためのサンプルデータをPythonで生成し、Excelシートに書き込む手順を解説します。
サンプルデータを作成するPythonコード
今回はサンプルとして、z = sin(x) * cos(y) という簡単な数学関数を使い、グラフの元となるデータセットをnumpyで生成します。
import numpy as np
# グラフのデータ範囲を定義
x = np.arange(-5, 5, 0.5)
y = np.arange(-5, 5, 0.5)
X, Y = np.meshgrid(x, y)
# Z値を計算 (z = sin(x) * cos(y))
Z = np.sin(X) * np.cos(Y)このコードにより、X軸、Y軸、そしてそれぞれの交点に対応するZ軸の値(高さ)を持つデータが生成されます。
作成したデータをExcelシートに書き込む
次に、生成したZ軸のデータをopenpyxlを使って新しいExcelブックのシートに書き込みます。
from openpyxl import Workbook
# 新しいExcelブックを作成
wb = Workbook()
ws = wb.active
ws.title = "SurfaceChart Data"
# ヘッダーなどを書き込む場合はここに記述(今回はデータのみ)
# numpyで生成したデータをシートに書き込む
for i, row in enumerate(Z):
for j, val in enumerate(row):
# openpyxlのセルは1から始まるため、i+1, j+1とする
ws.cell(row=i + 1, column=j + 1, value=val)このコードを実行すると、Zという二次元配列のデータが、ExcelシートのA1セルから順番に書き込まれます。
ステップ2:SurfaceChart3Dを作成してシートに追加する
データの準備ができたら、いよいよグラフを作成します。 ここでは、SurfaceChart3Dオブジェクトを作成し、先ほど書き込んだデータを参照させてグラフを描画するまでの具体的な手順を、コードと共に解説します。
SurfaceChart3Dオブジェクトの初期化
まず、グラフオブジェクトを作成するために、openpyxl.chartからSurfaceChart3Dをインポートし、インスタンスを生成します。
from openpyxl.chart import SurfaceChart3D
# 3Dサーフェスグラフのオブジェクトを作成
chart = SurfaceChart3D()これだけで、グラフの器が用意できました。
データ範囲の指定 (Referenceオブジェクト)
次に、グラフにどのセルのデータを表示させるかをReferenceオブジェクトを使って指定します。Referenceは、操作対象のワークシートと、セルの範囲(開始・終了の行と列)を指定するための重要なクラスです。
from openpyxl.chart.reference import Reference
# データの範囲を計算 (データはZ.shapeで行数と列数がわかる)
num_rows, num_cols = Z.shape
# データを参照する範囲を定義
# min_row=1, min_col=1: A1セルから
# max_row=num_rows, max_col=num_cols: データの最終セルまで
data = Reference(ws, min_col=1, min_row=1, max_col=num_cols, max_row=num_rows)
# グラフにデータ範囲を追加
chart.add_data(data)Referenceの引数は直感的です。min_col=1はA列、min_row=1は1行目を指し、データの範囲を正確に指定できます。
グラフの追加とExcelファイルの保存
最後に、作成したグラフオブジェクトをworksheet.add_chart()メソッドでシート上の好きな位置に追加し、Excelファイルとして保存します。
# グラフをシートの"E5"セルを左上にして配置
ws.add_chart(chart, "E5")
# Excelファイルを保存
wb.save("surface_chart_example.xlsx")
print("Excelファイル'surface_chart_example.xlsx'を作成しました。")add_chart()の第2引数"E5"は、グラフの左上隅を配置するセルの位置を示します。これで、データとグラフが描画されたExcelファイルが完成します。
もう一歩進んでみよう:グラフのカスタマイズ
作成したグラフの見た目を調整すると、より伝わりやすい資料になります。 タイトルや軸ラベルを設定するだけでも、グラフの品質は格段に向上します。
グラフタイトルを設定する
グラフに分かりやすいタイトルを追加するには、chart.titleプロパティに文字列を設定します。
# グラフにタイトルを設定
chart.title = "z = sin(x) * cos(y)"X, Y, Z軸にラベルを追加する
各軸が何を表しているのかを示すラベルを設定することは非常に重要です。chart.x_axis.titleのように各軸のプロパティから設定できます。
# 各軸にラベルを設定
chart.x_axis.title = "X-Axis"
chart.y_axis.title = "Y-Axis"
chart.z_axis.title = "Z-Axis (Value)"グラフのサイズを変更する
シート上でのグラフの幅(width)と高さ(height)を調整して、見やすい大きさに変更できます。
# グラフのサイズを設定 (単位はcmに近い)
chart.width = 30 # 幅
chart.height = 20 # 高さこれらのカスタマイズを先ほどのコードのws.add_chart()の前に追記するだけで、よりリッチなグラフを自動で作成できます。
まとめ
最後に、本記事で学んだ内容を簡潔に振り返りましょう。
pip install openpyxlでライブラリを準備する。- 3Dサーフェスグラフには、格子状(行列形式)のデータが必要。
SurfaceChart3D()でグラフオブジェクトを作成する。Reference()でグラフ化したいExcelシート上のデータ範囲を指定する。ws.add_chart(chart, "E5")でシートにグラフを追加する。chart.titleやchart.x_axis.titleなどで見た目のカスタマイズが可能。
openpyxlを使えば、これまで手作業で行っていたExcelのグラフ作成も、Pythonコードで完全に自動化できます。大量のデータから定期的にレポートを作成するような場面で、この技術は絶大な効果を発揮するはずです。
ぜひ、あなたの業務効率化に役立ててみてください。


コメント