openpyxl条件付き書式:ColorScaleRuleで見やすいヒートマップを作成

openpyxl

はじめに:PythonでExcelに「ヒートマップ」を実装する

Pythonとopenpyxlを使ってExcelファイルにデータを書き出した後、「このデータの傾向を、もっと視覚的に分かりやすく表現できないか?」と考えたことはありませんか?その最も効果的な答えの一つがヒートマップです。

ヒートマップとは、数値の大小を色の濃淡やグラデーションで表現する可視化手法です。Excelでは「カラースケール」という名前の条件付き書式がこれに該当します。

この記事では、openpyxlの条件付き書式機能、特にColorScaleRuleクラスに焦点を当て、Pythonコードだけで見やすいヒートマップをExcelシート上に作成する方法を徹底的に解説します。

ColorScaleRule:openpyxlにおけるヒートマップの設計図

openpyxlでヒートマップ(カラースケール)を作成するには、openpyxl.formatting.ruleモジュールにあるColorScaleRuleクラスを使用します。これが、どのようなルールでセルに色を付けるかを定義する、まさにヒートマップの設計図となります。

この設計図を、シートオブジェクトのconditional_formatting.add()メソッドを使って、適用したいセルの範囲(レンジ)に登録することで、ヒートマップが完成します。

構成要素:ColorScaleRuleの主な引数

ColorScaleRuleを構成する主な引数は以下の通りです。

  • start_type, mid_type, end_type: グラデーションの各ポイント(開始、中間、終了)が何に基づくかを指定します(例: 'min', 'max', 'percentile')。
  • start_color, mid_color, end_color: 各ポイントの色をopenpyxl.styles.Colorオブジェクトで指定します。
  • mid_value: mid_type'percentile''num'などを指定した場合の具体的な値を設定します。

これらの要素を組み合わせることで、単純な2色ヒートマップから、中間色を含む複雑な3色ヒートマップまで自由に作成できます。

実践①:シンプルな2色ヒートマップの作成

まずは基本として、最小値を薄い色、最大値を濃い色で表現する2色のヒートマップを作成してみましょう。

Step 1: ヒートマップを適用するデータを用意

最初に、openpyxlでダミーの数値データを持つExcelファイルを作成します。

from openpyxl import Workbook
import random

wb = Workbook()
ws = wb.active
ws.title = "HeatmapDemo"

# ヘッダーを追加
ws.append(["月", "東京", "大阪", "名古屋"])

# 12ヶ月分のダミーデータを生成
for month in range(1, 13):
    ws.append([
        f"{month}月",
        random.randint(100, 500),
        random.randint(80, 450),
        random.randint(90, 480)
    ])

wb.save("branch_sales.xlsx")
print("ヒートマップ適用前のデータファイルを作成しました。")

Step 2: ColorScaleRuleで2色ヒートマップを適用

次に、生成したファイルのデータ範囲(B2からD13)に、白から青へのシンプルなヒートマップを適用します。

from openpyxl import load_workbook
from openpyxl.formatting.rule import ColorScaleRule
from openpyxl.styles import Color

wb = load_workbook("branch_sales.xlsx")
ws = wb.active

# 最小値(min)を白、最大値(max)を青とする2色ルールを作成
rule = ColorScaleRule(
    start_type='min', start_color=Color('FFEEF5FF'), # Light Blue
    end_type='max', end_color=Color('FF002060')     # Dark Blue
)

# B2:D13の範囲にルールを追加
ws.conditional_formatting.add('B2:D13', rule)

wb.save("branch_sales_heatmap_2color.xlsx")
print("2色ヒートマップを適用したファイルを保存しました。")

作成されたファイルを開くと、売上数値が低いセルは薄い青、高いセルは濃い青で着色され、一目で各支店の売上傾向が把握できるはずです。

実践②:標準的な3色ヒートマップ(赤-黄-緑)の作成

より一般的に使われる、低値を赤、中間値を黄、高値を緑で示す3色のヒートマップも作成してみましょう。

from openpyxl import load_workbook
from openpyxl.formatting.rule import ColorScaleRule
from openpyxl.styles import Color

wb = load_workbook("branch_sales.xlsx")
ws = wb.active

# 最小値(min)/50パーセンタイル(percentile)/最大値(max)の3色ルール
rule = ColorScaleRule(
    start_type='min', start_color=Color('FFF8696B'),         # Red
    mid_type='percentile', mid_value=50, mid_color=Color('FFFFEB84'), # Yellow
    end_type='max', end_color=Color('FF63BE7B')             # Green
)

ws.conditional_formatting.add('B2:D13', rule)

wb.save("branch_sales_heatmap_3color.xlsx")
print("3色ヒートマップを適用したファイルを保存しました。")

このルールを適用すると、いわゆる「信号機カラー」のヒートマップが完成し、要注意な低い数値(赤)と好調な数値(緑)がより明確になります。

ヒートマップをカスタマイズする

ColorScaleRuleの引数を調整することで、ヒートマップの挙動を細かく制御できます。

  • 中間点の変更: mid_type='percentile', mid_value=50mid_type='num', mid_value=250 のように変更すれば、「50パーセンタイル(中央値)」ではなく「数値の250」を中間点にすることができます。
  • 色の変更: ColorオブジェクトにAARRGGBB形式の16進数コードを渡せば、コーポレートカラーなど、好きな色でヒートマップを作成できます。

まとめ:ColorScaleRuleでデータに生命を吹き込む

今回は、openpyxlの条件付き書式、特にColorScaleRuleを使ってExcel上にヒートマップを作成する方法を解説しました。

  • ヒートマップは**ColorScaleRule**クラスでルールを定義する。
  • **conditional_formatting.add()**でシートの特定範囲にルールを適用する。
  • 2色または3色のスケールを、start/mid/endの各引数で柔軟に設定できる。

openpyxlを使えば、単にデータをExcelに流し込むだけでなく、ヒートマップという強力な可視化手法をプログラムで適用できます。これにより、あなたの自動化スクリプトが生成するレポートは、単なるデータの集合から、インサイトを語りかける「生きた資料」へと進化するでしょう。

コメント

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