Pythonとopenpyxlでグラフの線の色や太さを変える!GraphicalProperties入門

openpyxl

はじめに:この記事で解決できること

Pythonのopenpyxlライブラリは、Excelファイルを操作する上で非常に強力なツールです。特にデータの可視化において、グラフを自動生成できる機能は多くの開発者にとって魅力的でしょう。

しかし、デフォルトで作成されるグラフのデザインはシンプルです。「グラフの線の色を赤にしたい」「特定のデータ系列の線を太くして強調したい」といった、より細かいデザインの調整で困った経験はありませんか?

この記事を読めば、GraphicalPropertiesという機能を使って、Pythonコード上からExcelグラフの線の色、太さ、種類などを自由自在にカスタマイズする方法をマスターできます。初心者の方にも分かりやすく、コピー&ペーストで試せるコードを交えながら丁寧に解説していきます。

openpyxlのGraphicalPropertiesとは?

まずは結論から。GraphicalPropertiesとは、**グラフや図形といった描画オブジェクトの見た目(書式)を定義するための機能(クラス)**です。

これを使うことで、Excel上で手動で行っていたような、以下のような多彩なデザイン調整をPythonコードで実現できます。

  • 線の設定: 色、太さ、種類(実線, 点線, 破線など)、透明度
  • 塗りつぶしの設定: 単色、グラデーション、パターン
  • 図形の効果: 影、光彩、ぼかし

主に、グラフを構成するデータ系列(Seriesオブジェクト)の見た目を変更するために利用します。これからは、GraphicalPropertiesを使いこなして、データの意図がより伝わる、視覚的に優れたグラフを作成していきましょう。

【実践】グラフの線のスタイルを変更する基本コード

ここでは、最も利用頻度の高い「グラフの線のスタイル変更」を例に、GraphicalPropertiesの具体的な使い方を4つのステップで解説します。

このコードは、openpyxlのバージョン3.0.0以降で動作することを確認しています。

Step 1: 準備(ライブラリのインポートとExcelファイルの準備)

まず、openpyxlで基本的な折れ線グラフを作成します。グラフのデザインを変更するためには、その対象となるグラフが不可欠です。

import openpyxl
from openpyxl.chart import LineChart, Reference

# 1. 新しいワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "GraphSample"

# 2. グラフの元となるサンプルデータを書き込む
rows = [
    ["Month", "Series 1", "Series 2"],
    ["Jan", 10, 30],
    ["Feb", 40, 60],
    ["Mar", 50, 70],
    ["Apr", 20, 80],
    ["May", 10, 40],
    ["Jun", 60, 90],
]
for row in rows:
    ws.append(row)

# 3. 折れ線グラフのオブジェクトを作成
chart = LineChart()
chart.title = "Monthly Sales"
chart.x_axis.title = "Month"
chart.y_axis.title = "Sales"

# 4. データ範囲を指定
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7)
cats = Reference(ws, min_col=1, min_row=2, max_row=7)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)

# 5. ワークシートにグラフを追加
ws.add_chart(chart, "A10")

# この時点ではまだデフォルトのグラフ
# wb.save("default_chart.xlsx")

このコードを実行すると、まだデザインが適用されていない、シンプルな折れ線グラフが作成されます。

Step 2: GraphicalPropertiesをインスタンス化する

次に、書式設定の情報を格納するためのGraphicalPropertiesオブジェクトを作成します。

このオブジェクト自体が「線の色」や「太さ」の情報を持つわけではなく、それらの情報を保持する、さらに下層のオブジェクト(LinePropertiesなど)を格納する「入れ物」の役割を果たします。

from openpyxl.chart.graphical import GraphicalProperties

# 書式設定の入れ物を作成
gp = GraphicalProperties()

Step 3: LinePropertiesで線のプロパティを設定する

線の具体的なスタイル(色や太さ)は、LinePropertiesを使って設定します。

from openpyxl.drawing.line import LineProperties
from openpyxl.drawing.colors import SolidColorFillProperties

# 線のプロパティを定義
# solidFillにカラーコード'FF0000'(赤色)を指定
line_props = LineProperties(solidFill=SolidColorFillProperties(rgb="FF0000"))

# 作成した線のプロパティをGraphicalPropertiesのln属性に設定
gp.ln = line_props

ここでは、SolidColorFillPropertiesを使って線の色を赤色(RGB: FF0000)に指定しました。

線の太さも変更したい場合は、w(width)プロパティに数値を指定します。単位はemu(English Metric Unit)という特殊なものですが、1pt = 12700 emu と覚えておけば十分です。例えば、線を2ptの太さにしたい場合は以下のように記述します。

# 線の太さを2pt(= 2 * 12700 = 25400 emu)に設定
gp.ln.w = 25400

Step 4: グラフの系列に適用する

最後に、作成した書式設定(GraphicalPropertiesオブジェクト)を、デザインを変更したいグラフのデータ系列(Series)に適用します。

グラフの系列はchart.seriesというリストに格納されています。最初の系列(この例では”Series 1″)のデザインを変更するには、インデックス[0]を指定します。

# グラフの最初のデータ系列を取得
s = chart.series[0]

# 作成した書式設定を適用
s.graphicalProperties = gp

これで全ての準備が整いました。変更を保存してExcelファイルを開くと、”Series 1″の線が赤色の太線になっていることが確認できます。

▼完成した全体のサンプルコード

import openpyxl
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.graphical import GraphicalProperties
from openpyxl.drawing.line import LineProperties
from openpyxl.drawing.colors import SolidColorFillProperties

# --- Step 1: グラフの準備 ---
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "GraphSample"
rows = [
    ["Month", "Series 1", "Series 2"],
    ["Jan", 10, 30], ["Feb", 40, 60], ["Mar", 50, 70],
    ["Apr", 20, 80], ["May", 10, 40], ["Jun", 60, 90],
]
for row in rows:
    ws.append(row)
chart = LineChart()
chart.title = "Monthly Sales"
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7)
cats = Reference(ws, min_col=1, min_row=2, max_row=7)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)

# --- Step 2 & 3: 書式設定の作成 ---
# 赤色の太さ2ptの線を作成
gp_red_bold = GraphicalProperties(
    ln=LineProperties(
        solidFill=SolidColorFillProperties(rgb="FF0000"),
        w=25400  # 2pt
    )
)

# --- Step 4: グラフ系列への適用 ---
# 最初の系列(Series 1)に適用
chart.series[0].graphicalProperties = gp_red_bold

# --- グラフの追加と保存 ---
ws.add_chart(chart, "A10")
wb.save("custom_line_chart.xlsx")

【応用】知っていると便利な線の設定

GraphicalPropertiesは、単に色と太さを変えるだけではありません。線の種類を変えるなど、より高度な設定も可能です。

点線や破線に変更する方法

線の種類を変更するには、LinePropertiesprstDashプロパティを使用します。代表的な設定値は以下の通りです。

  • 'solid':実線(デフォルト)
  • 'sysDot':点線
  • 'sysDash':破線
# 点線を設定する場合
gp.ln.prstDash = "sysDot"

# 破線を設定する場合
gp.ln.prstDash = "sysDash"

これを先ほどのコードに組み込むだけで、簡単に線のスタイルを点線や破線に変更できます。

よくあるエラーと対処法:AttributeErrorを回避しよう

GraphicalPropertiesを扱う際、特に初心者が遭遇しやすいのがAttributeErrorです。

▼よくあるエラー例 AttributeError: 'NoneType' object has no attribute 'solidFill'

このエラーは、gp.lnがまだ存在しない(Noneである)のに、その先のsolidFillを設定しようとした場合などに発生します。

NG例:

# gp.lnが存在しないため、このコードはエラーになる
gp = GraphicalProperties()
gp.ln.solidFill = SolidColorFillProperties(rgb="FF0000") # AttributeError!

OK例:

# 必ずLinePropertiesオブジェクトを作成して、gp.lnに代入する
gp = GraphicalProperties()
line_props = LineProperties(solidFill=SolidColorFillProperties(rgb="FF0000"))
gp.ln = line_props

解決策は、LinePropertiesのような下層のオブジェクトを先にきちんと作成し、それを上位のオブジェクト(この場合はgp)の正しい属性(ln)に代入することです。焦らず、オブジェクトの構造を意識してコードを記述しましょう。

まとめ:GraphicalPropertiesを使いこなして見やすいグラフを作成しよう

今回は、openpyxlでグラフの見た目をカスタマイズするGraphicalPropertiesの基本的な使い方を解説しました。

  • GraphicalPropertiesは、グラフや図形の書式を設定する「入れ物」
  • 線のスタイルはLinePropertiesで定義する
  • 線の色はsolidFill、太さはwプロパティで指定できる(1pt = 12700 emu)
  • 作成したGraphicalPropertiesオブジェクトを、chart.series[i].graphicalPropertiesに代入して適用する
  • AttributeErrorは、オブジェクトの階層構造を意識すれば防げる

GraphicalPropertiesを使いこなせば、Pythonで自動生成するExcelレポートやデータの可視化結果が、よりプロフェッショナルで伝わりやすいものになります。ぜひ、あなたのプロジェクトでも活用してみてください。

コメント

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