Seriesとの違いは?openpyxlのDataPointを理解して、より細やかなグラフ描画を実現する

openpyxl

はじめに:なぜDataPointを知る必要があるのか?

「グラフの中の特定の棒だけ色を変えたい」「最大値の点だけを特別に目立たせたい」——。

この記事は、openpyxlで基本的なグラフ作成はできるようになったけれど、もう一歩進んだ、そんな細やかなグラフ装飾を実現したいあなたのためのものです。

Seriesオブジェクトを使えばデータ系列全体のスタイルは変更できますが、「個々の要素」をカスタマイズすることはできません。この課題を解決するのが、今回主役となる**DataPoint**オブジェクトです。

この記事を読み終えれば、あなたはDataPointを使いこなし、グラフ上の特定のデータ点を自在に操ることで、より視覚的に伝わる魅力的なグラフを自動で作成できるようになるでしょう。


役割の比較:SeriesとDataPointの決定的な違い

結論から言うと、**Seriesは「データ系列全体」を、DataPointは「系列内の個々の点」**を操作するためのオブジェクトです。この役割分担が最も重要なポイントです。

Seriesの役割

Seriesは、グラフに描画する一つのデータグループ全体を管理します。

  • 担当範囲: データ系列全体(例:商品Aの年間売上データすべて)
  • 主な設定:
    • 凡例(はんれい)名の設定
    • 系列全体の棒グラフの色を青色で統一する
    • 折れ線グラフの線のスタイルを点線にする

DataPointの役割

DataPointは、Seriesによって管理されているデータ系列の中の、たった一つのデータ点にピンポイントで介入します。

  • 担当範囲: 系列内の一つのデータ点(例:商品Aの売上のうち、4月のデータだけ)
  • 主な設定:
    • 4月の棒グラフだけを赤色に変更する
    • 売上最大値の点のマーカーだけを星形にする

例え話で解説

この関係性をアイドルのグループで例えてみましょう。

  • Series: グループ全体の設定です。「グループ全員でこの衣装を着てください」と指示するのがSeriesの役割です。
  • DataPoint: グループの中の特定のメンバー(推しメン)への個別指示です。「〇〇さんだけ、髪飾りを付けてください」と、一人だけを目立たせるのがDataPointの役割です。

このように、全体への指示はSeries、個人への指示はDataPointと覚えると非常に分かりやすいです。


実践!DataPointでグラフの特定要素をカスタマイズする

それでは、実際にDataPointを使って、グラフの特定の棒の色を変えるコードを見ていきましょう。今回は「月別売上データの中で、最も売上が高かった月の棒グラフだけ色を変えて強調する」という処理を実装します。

ステップ1: 基本となるグラフとSeriesの準備

まずは、DataPointを使わない、ごく普通の棒グラフを作成します。この時点では、すべての棒は同じ色で描画されます。

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

# このバージョンで動作確認しています
print(f"openpyxlのバージョン: {openpyxl.__version__}")
# >> openpyxlのバージョン: 3.1.2

# ワークブックとシートを準備
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "個別カスタマイズ"

# グラフの元になるサンプルデータ
rows = [
    ["月", "売上"],
    ["1月", 150],
    ["2月", 200],
    ["3月", 280], # ← この最大値を強調したい
    ["4月", 180],
    ["5月", 250],
]
for row in rows:
    ws.append(row)

# グラフオブジェクトの作成
chart = BarChart()
chart.title = "月別 売上レポート"
chart.legend = None # 凡例は非表示に

# データ範囲の指定
data = Reference(ws, min_col=2, min_row=1, max_row=6)
cats = Reference(ws, min_col=1, min_row=2, max_row=6)

# Seriesの作成とグラフへの追加
series = Series(values=data, title_from_data=True)
chart.append(series)
chart.set_categories(cats)

# この段階で一度保存してみる
# ws.add_chart(chart, "D2")
# wb.save("basic_chart.xlsx")

このコードだけだと、3月の売上が最大であることは分かりますが、視覚的には目立ちません。

ステップ2: DataPointオブジェクトの作成と設定

次に、特定のデータ点(今回は3月)をカスタマイズするためのDataPointを作成します。

結論として、何番目のデータを変更するかをidxで指定し、graphicalPropertiesで見た目を設定します。

from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.fill import SolidColorFillProperties
from openpyxl.chart.marker import DataPoint # DataPointをインポート

# 強調したいデータ点 (3月) のインデックスを指定
# データは0から数えるので、3番目のデータはidx=2
dp = DataPoint(idx=2)

# 色の設定 (オレンジ色)
dp.graphicalProperties = GraphicalProperties(
    solidFill=SolidColorFillProperties(prstClr="orange")
)

idxは0から始まるインデックスであることに注意してください。データが「1月, 2月, 3月…」と並んでいる場合、3月は3番目なのでidx=2となります。

ステップ3: SeriesにDataPointを追加する

最後に、作成したDataPointSeriesオブジェクトに追加します。

これはseriesが持つ**dPtというリストにappendする**ことで実現できます。

# SeriesにDataPointを追加
series.dPt.append(dp)

dPtは “Data Points” の略で、ここに追加されたDataPointオブジェクトの設定が、グラフ描画時に個別に適用されます。

サンプルコード:最大値のデータ点だけ色を変える

ステップ1から3までをまとめ、動的に最大値を探してその棒の色を変える完成コードがこちらです。

# ... (ステップ1のコードの続き) ...
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.fill import SolidColorFillProperties
from openpyxl.chart.marker import DataPoint

# --- ここからがDataPointの処理 ---

# B列の売上データをリストとして取得
sales_data = [cell.value for cell in ws['B'][1:]] # B2以降のセル
max_sale = max(sales_data)
# 最大値のインデックスを取得
max_idx = sales_data.index(max_sale)

print(f"最大売上: {max_sale}, インデックス: {max_idx}")
# >> 最大売上: 280, インデックス: 2

# 最大値のインデックスを持つDataPointを作成
dp = DataPoint(idx=max_idx)
# 色をオレンジに設定
dp.graphicalProperties = GraphicalProperties(
    solidFill=SolidColorFillProperties(prstClr="orange")
)

# SeriesにDataPointを追加
series.dPt.append(dp)

# --- 処理はここまで ---

# ワークシートにグラフを追加し、ファイルを保存
ws.add_chart(chart, "D2")
wb.save("customized_chart.xlsx")

print("特定のデータ点を強調したExcelファイルを保存しました。")

このコードを実行すると、「3月」の棒グラフだけがオレンジ色になった、メリハリのあるグラフが生成されます。


SeriesとDataPointの使い分け早見表

SeriesDataPointのどちらを使えばよいか迷ったときは、この表を参考にしてください。

やりたいこと使うべきオブジェクト備考
系列全体の凡例名を設定したいSeriesseries.title = "新しい凡例"
グラフの棒をすべて青色にしたいSeriesseries.graphicalPropertiesで設定
3番目の棒だけを赤色にしたいDataPointDataPoint(idx=2)を作成し、色を設定
折れ線グラフのマーカーをすべて四角にしたいSeriesseries.marker.symbol = "square"
最小値の点のマーカーだけを星印にしたいDataPoint最小値のidxを調べ、DataPointを作成
データラベルをすべて表示したいSerieschart.dLbls(Chartオブジェクトで設定)
特定の点のデータラベルだけフォントを大きくしたいDataPointdp.dLblで個別のデータラベルを設定

まとめ:DataPointを使いこなし、伝わるグラフを作成しよう

今回は、openpyxlでグラフの特定のデータ点だけをカスタマイズするDataPointオブジェクトについて、Seriesとの違いに焦点を当てて解説しました。

  • Seriesは「全体」、**DataPointは「個別」**の書式設定を担当します。
  • DataPointは、変更したいデータの**idx(0始まりのインデックス)**を指定して作成します。
  • 作成したDataPointは、series.dPt.append()でデータ系列に追加することで適用されます。

DataPointを使いこなせるようになると、単にデータを可視化するだけでなく、グラフを通じて最も伝えたいメッセージは何かを強調できるようになります。これは、あなたの作る資料を「ただのレポート」から「説得力のある提案書」へと進化させる強力な武器となるでしょう。

ぜひ、このテクニックを活用して、日々の業務で一目置かれるグラフ作成を目指してください。

コメント

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