Python openpyxl SurfaceChart の使い方!Excelで3D等高線グラフを作成するガイド

openpyxl

「地形データや温度分布、シミュレーション結果のような3次元データをExcelで見栄え良く可視化したい…」 「Excelの手作業で3D等高線グラフ(サーフェスチャート)を作るのは、データ点数が多くて正直面倒だ…」

もしあなたがPythonでデータを扱っているなら、その作業は完全に自動化できます。Excelの強力なグラフ機能を、Pythonから直接コントロールできることをご存-知でしたか?

この記事を読めば、Pythonのopenpyxlライブラリを使って、3次元データを美しく表現するSurfaceChart(3D等高線グラフ)をExcel上に自動で作成し、思い通りにカスタマイズする方法がわかります。データ処理からレポート作成までをシームレスに繋げ、あなたの分析作業を次のレベルへと進めましょう。


SurfaceChartとは?3次元データを色の濃淡で表現するグラフ

まずは結論です。SurfaceChartは、2つの変数(X軸とY軸)に対する3つ目の変数の値(Z軸)を、色の濃淡やグラデーションで表現する3Dグラフです。

ちょうど、地図帳で見る地形図(トポグラフィックマップ)を思い浮かべてみてください。SurfaceChartは、まさにあれをExcel上で再現する機能です。山の高さや谷の深さを色で表現するように、データの「高さ」や「深さ」といった量を視覚的に一目で捉えるのに非常に便利です。

このグラフは、以下のようなデータに特に適しています。

  • z = f(x, y) のような数式の結果
  • 行列(Matrix)形式のデータ
  • センサーなどで計測したメッシュ状の測定データ(例:室内の温度分布)

ちなみに、openpyxlにはSurfaceChartSurfaceChart3Dの2種類があります。前者は色の帯で等高線のように表現し、後者はより滑らかな3D曲面として表現する、といった違いがあります。今回は基本的なSurfaceChartを扱います。


SurfaceChart作成の基本手順(サンプルコード付き)

SurfaceChartの作成は非常に簡単です。 結論から言うと、「①格子状のデータ準備」「②グラフオブジェクトの作成」「③シートへの追加」という3つのステップで完了します。

Step1. 最も重要!格子状(グリッド)のデータを作成する

SurfaceChartを作成する上で、最も重要で、特有のステップがこのデータ準備です。SurfaceChartは、特定の形式で配置された格子状(グリッド)のデータを必要とします。

その形式とは、以下のルールです。

  1. 1行目: Y軸のラベル(目盛り)をB列から右に向かって配置します。
  2. 1列目: X軸のラベル(目盛り)を2行目から下に向かって配置します。
  3. 内側のセル (B2以降): 対応するX, Yの値に対するZ軸の値を配置します。
  4. A1セル: 空白にしておくのが一般的です。

この形式を手作業で作るのは大変なので、Pythonで自動生成しましょう。ここでは例として、z = sin(x) + cos(y) という数式の結果をプロットするデータを作成します。

import openpyxl
import math

# 新しいワークブックとシートを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "SurfaceChart_Sample"

# Step1: 格子状のデータを作成
# 1行目にY軸ラベル (-5から5まで)
ws.cell(row=1, column=1).value = None # A1は空白
for i in range(11):
    ws.cell(row=1, column=2 + i).value = i - 5

# 1列目にX軸ラベル (-5から5まで)
for i in range(11):
    ws.cell(row=2 + i, column=1).value = i - 5

# 内側のセルにZ値を計算して入力
# z = sin(x) + cos(y)
for r in range(11): # X軸
    x = r - 5
    for c in range(11): # Y軸
        y = c - 5
        z = math.sin(math.radians(x*20)) + math.cos(math.radians(y*20))
        ws.cell(row=2 + r, column=2 + c).value = z

これで、グラフの元となるデータがExcelシート上に準備できました。

Step2. SurfaceChartオブジェクトを作成し、データ範囲を指定する

次に、SurfaceChartオブジェクトを作成し、先ほど書き込んだデータの範囲をグラフに教えます。

from openpyxl.chart import SurfaceChart, Reference

# SurfaceChartオブジェクトを作成
chart = SurfaceChart()
chart.title = "z = sin(x) + cos(y)"

# データの範囲をReferenceで指定
# A1からL12までの範囲を全て含める
ref = Reference(ws, min_col=1, min_row=1, max_col=12, max_row=12)

# グラフにデータを追加
chart.add_data(ref, from_rows=True)

Referenceでデータ範囲を指定する際、X軸・Y軸のラベルを含めた全体の範囲を指定するのがポイントです。

Step3. グラフをシートに追加して保存する

最後に、作成したグラフオブジェクトを ws.add_chart() を使ってシート上の好きな位置に追加し、ファイルを保存します。

以下に、ここまでの全手順をまとめた、コピー&ペーストで動作する完全なサンプルコードを示します。

import openpyxl
import math
from openpyxl.chart import SurfaceChart, Reference

# --- Step1: データ準備 ---
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "SurfaceChart_Sample"

ws.cell(row=1, column=1).value = None
for i in range(11):
    ws.cell(row=1, column=2 + i).value = i - 5
for i in range(11):
    ws.cell(row=2 + i, column=1).value = i - 5

for r in range(11):
    x = r - 5
    for c in range(11):
        y = c - 5
        z = math.sin(math.radians(x*20)) + math.cos(math.radians(y*20))
        ws.cell(row=2 + r, column=2 + c).value = z

# --- Step2: グラフオブジェクト作成 ---
chart = SurfaceChart()
chart.title = "z = sin(x) + cos(y)"
ref = Reference(ws, min_col=1, min_row=1, max_col=12, max_row=12)
chart.add_data(ref, from_rows=True)

# --- Step3: シートに追加して保存 ---
ws.add_chart(chart, "A15") # A15セルを左上の角としてグラフを配置
wb.save("surface_chart_sample.xlsx")

print("SurfaceChartを含むExcelファイルを作成しました。")

このコードを実行すれば、美しい3D等高線グラフが描画されたExcelファイルが手に入ります。


【応用】SurfaceChartの見た目をカスタマイズする

SurfaceChartは、そのままでも十分に見栄えが良いですが、いくつかのプロパティを調整することで、さらに分かりやすくカスタマイズできます。 結論として、wireframe(ワイヤーフレーム)の表示/非表示や、軸タイトルの設定などを通じて、グラフの見た目を調整可能です。

ワイヤーフレームの表示を切り替える (wireframe)

wireframeは、グラフの格子線の表示をコントロールするプロパティです。デフォルトはTrue(表示する)になっています。これをFalseにすると、格子線が消え、色のグラデーションがより滑らかに見えるようになります。

# ワイヤーフレームを非表示にする
chart.wireframe = False

グラフや軸にタイトルを設定する

グラフ全体のタイトルはchart.titleで設定できますが、各軸にもタイトルを付けることで、グラフが何を表しているのかがより明確になります。

# グラフのタイトル
chart.title = "z = sin(x) + cos(y) のプロット"

# X軸とY軸のタイトル
chart.x_axis.title = "X-Axis"
chart.y_axis.title = "Y-Axis"

残念ながら、2025年現在のopenpyxlではchart.z_axis.titleのような形で直接Z軸のタイトルを設定する簡単な方法はありませんが、X軸とY軸のタイトルだけでも情報の明確さは大きく向上します。

グラフの視点を変更する (view3d)

さらに高度なカスタマイズとして、View3Dオブジェクトを利用してグラフの視点を変更することもできます。これにより、グラフを回転させたり、見下ろす角度を変えたりすることが可能です。

from openpyxl.chart.view3d import View3D

# グラフを少し回転させる
chart.view3d = View3D(rot_x=30, rot_y=20)

まとめ

今回は、Pythonのopenpyxlライブラリを使って、3次元データを可視化するSurfaceChart(3D等高線グラフ)を作成する方法を解説しました。

最後に、この記事の重要なポイントを振り返りましょう。

  • SurfaceChartは、格子状の3次元データを可視化するのに最適なグラフです。
  • 最も重要なのは、1行目/1列目に軸ラベル、内側にZ値を配置したデータ形式を準備することです。
  • Referenceでデータ範囲を指定し、add_data()でグラフにデータを設定します。
  • wireframeやタイトルの設定、view3dの利用で、見た目を分かりやすくカスタマイズできます

SurfaceChartをマスターすれば、これまで表現が難しかった多次元データも、直感的で説得力のあるレポートにまとめることができます。ぜひあなたのPythonによるデータ可視化とレポート自動化の幅を広げるために、この強力な機能を活用してみてください。

コメント

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