openpyxlのグラフで横軸の順番・向きを自由に設定!CategoryAxis活用術

openpyxl

はじめに

Pythonのopenpyxlライブラリは、Excelファイルを自動で操作できる非常に強力なツールです。特に、レポート作成などでデータをグラフ化する際に重宝します。しかし、グラフを作成する過程で「横軸のカテゴリが思った通りの順番にならない…」「ラベルの文字が長くて重なってしまい、読めない…」といった見た目の問題に直面したことはありませんか?

実はこれらの悩み、グラフの**横軸(X軸)**を制御するCategoryAxisを使いこなすことで、すべて解決できます。

この記事では、CategoryAxisに焦点を当て、その基本的な使い方から、カテゴリの順番ラベルの向きを自由自在にカスタマイズする方法まで、具体的なコード例を交えて分かりやすく解説します。

この記事を読み終える頃には、あなたもopenpyxlで作成するグラフの見た目を、思い通りに調整できるようになっているはずです。

openpyxlのCategoryAxisとは?グラフの横軸のキホン

まずは、グラフの横軸を操作する上で欠かせないCategoryAxisの役割と、基本的な設定方法を理解しましょう。これがすべてのカスタマイズの土台となります。

CategoryAxisの役割:グラフの「何を示すか」を決める軸

CategoryAxisとは、ひと言で言えば**グラフの横軸(X軸)**のことです。 グラフには通常、2つの軸があります。

  • CategoryAxis(カテゴリ軸): グラフが「何についてのデータか」を示す軸です。例えば、「商品A, B, C」や「4月, 5月, 6月」といった文字列のラベルが並びます。
  • ValueAxis(数値軸): データの「どのくらいの量か」を示す軸です。通常は縦軸(Y軸)に使われ、売上数や気温などの数値が並びます。

openpyxlでグラフを意のままに操るには、このCategoryAxisを正しく設定することが第一歩となります。

基本的な横軸(カテゴリ軸)の設定方法

それでは、実際にopenpyxlで棒グラフを作成し、横軸にカテゴリを設定する基本的なコードを見てみましょう。chart.set_categories()メソッドを使うのがポイントです。

import openpyxl
from openpyxl.chart import BarChart, Reference

# 1. 新しいExcelブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "グラフ基本設定"

# 2. グラフの元になるデータを書き込む
rows = [
    ['項目', '売上'],
    ['商品A', 400],
    ['商品B', 300],
    ['商品C', 500],
    ['商品D', 250],
]

for row in rows:
    ws.append(row)

# 3. グラフオブジェクトを作成 (今回は棒グラフ)
chart = BarChart()
chart.title = "商品別売上"
chart.style = 10 # グラフのスタイル(任意)
chart.y_axis.title = '売上数'
chart.x_axis.title = '商品名'

# 4. グラフのデータ範囲を指定
data = Reference(ws, min_col=2, min_row=1, max_row=5)
# 5. 横軸(カテゴリ軸)のラベル範囲を指定 ★ここが重要!
categories = Reference(ws, min_col=1, min_row=2, max_row=5)

# 6. グラフにデータとカテゴリを設定
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

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

# 8. Excelファイルを保存
wb.save("basic_chart.xlsx")

このコードを実行すると、A2からA5セルの「商品A」〜「商品D」が正しく横軸に設定された棒グラフが作成されます。まずはこの基本形をしっかりと押さえておきましょう。

【実践】CategoryAxisで横軸の「順番」を制御する方法

基本が分かったところで、次はいよいよ最初のつまずきポイント、「カテゴリの順番」を制御する方法です。openpyxlが自動で並べ替えてしまうカテゴリの順番を、意図した通りに表示させましょう。

なぜカテゴリの順番が意図通りにならない?

データを「4月, 5月, 6月」の順で用意したはずなのに、グラフにすると「4月, 6月, 5月」のようにアルファベット順(辞書順)でソートされてしまうことがあります。これはopenpyxlというより、Excelのグラフ仕様が関係しており、カテゴリを自動で整理しようとする働きによるものです。

しかし、ご安心ください。このおせっかいな自動ソートは、簡単な設定で無効化できます。

解決策:ax.orderingで順番を「max」から「min」へ変更する

カテゴリをデータソースの順序通りに表示させるには、chart.x_axis.orderingプロパティを"minMax"に設定します。x_axisCategoryAxisオブジェクトを指しています。

デフォルトでは"maxMin"が設定されていることがあり、これが自動ソートの原因となります。これを"minMax"に変更することで、「最小から最大へ」、つまり用意したデータの順番通りに表示されるようになります。

先ほどのコードに、たった一行追加するだけです。

# ...(データ準備とグラフオブジェクト作成までは同じ)...

# 6. グラフにデータとカテゴリを設定
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

# ★★★ カテゴリの順番をデータソース通りにする ★★★
chart.x_axis.ordering = "minMax"
# ★★★ ここまでを追加 ★★★

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

# 8. Excelファイルを保存
wb.save("chart_ordering.xlsx")

このchart.x_axis.ordering = "minMax"というおまじない一行で、カテゴリの順番に関する悩みはほとんど解決するはずです。

【実践】CategoryAxisで横軸ラベルの「向き」を調整する方法

次に、もう一つの大きな悩みである「ラベルの重なり」を解決します。横軸のラベルが長すぎてお互いに重なってしまう問題を、ラベルの向きを変えることでスマートに解消しましょう。

ラベルが重なって見づらい…を解決する

例えば、「2025年4月期 第1四半期」「2025年4月期 第2四半期」…のようにカテゴリ名が長い場合や、項目数が多い場合、デフォルトの横書き表示ではラベル同士が重なってしまい、非常に見づらいグラフになってしまいます。

これを解決する最も一般的な方法が、ラベルを斜めに回転させることです。

ax.txPrで回転角度を指定し、ラベルを斜めにする

ラベルの見た目(書式)は、chart.x_axis.txPrプロパティで設定します。txPrは “Text Properties” の略です。そして、回転角度はrot属性で指定します。

注意点として、角度は度数(-90° 〜 90°)で直接指定するのではなく、度数に60000を掛けた値を設定する必要があります。

  • -45°にしたい場合: -45 * 60000 = -2700000
  • -90°(縦書き)にしたい場合: -90 * 60000 = -5400000

では、先ほどのコードにラベルを-45度回転させる処理を追加してみましょう。

from openpyxl.drawing.text import CharacterProperties

# ...(データ準備とグラフオブジェクト作成までは同じ)...

# 6. グラフにデータとカテゴリを設定
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

# ★★★ 横軸ラベルを-45度回転させる ★★★
chart.x_axis.txPr = CharacterProperties(rot=-2700000)
# ★★★ ここまでを追加 ★★★

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

# 8. Excelファイルを保存
wb.save("chart_rotation.xlsx")

これで、ラベルが綺麗に斜めに表示され、重なりが解消された見やすいグラフが作成できます。

(応用)ax.tickLblSkipで見出しを間引いて表示する

ラベルが非常に多い場合、回転させてもごちゃごちゃしてしまうことがあります。そんな時は、ラベルを間引いて表示するtickLblSkipプロパティが便利です。

例えば、chart.x_axis.tickLblSkip = 2と設定すると、ラベルが1つおき(2つに1つ)に表示されます。3にすれば2つおき(3つに1つ)です。

# ...

# ★★★ ラベルを1つおきに表示する ★★★
chart.x_axis.tickLblSkip = 2

# ...

大量の時系列データを扱う際などに非常に有効なテクニックです。

覚えておくと便利!CategoryAxisのその他カスタマイズ術

さいごに、順番や向き以外にも、知っていると表現の幅が広がる便利なカスタマイズ方法をいくつかご紹介します。

軸のタイトルを設定する (ax.title)

これは基本ですが、chart.x_axis.titleで簡単に軸のタイトルを設定できます。既出のコード例でも使用していますが、改めて確認しておきましょう。

chart.x_axis.title = "商品カテゴリ"

目盛線(Gridlines)をカスタマイズする

デザイン上、横軸の目盛線が不要な場合があります。その際はmajorGridlinesNoneに設定することで非表示にできます。

# 横軸の主目盛線を非表示にする
chart.x_axis.majorGridlines = None

軸の表示・非表示を切り替える (ax.delete)

カテゴリラベルだけでなく、軸そのものを非表示にしたい場合はdeleteプロパティを使います。

# 横軸全体(ラベル、線)を非表示にする
chart.x_axis.delete = True

これらのプロパティを組み合わせることで、さらに柔軟なグラフデザインが可能になります。

まとめ

今回は、openpyxlでグラフを作成する際の強力な助っ人、CategoryAxisの活用術について詳しく解説しました。

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

  • CategoryAxis はExcelグラフの横軸(X軸)を司る重要なオブジェクトです。
  • カテゴリの設定は chart.set_categories() メソッドが基本となります。
  • 横軸の順番が崩れる問題は、chart.x_axis.ordering = "minMax" で解決できます。
  • ラベルの重なりは、chart.x_axis.txPrrot 属性で角度を設定すれば解消できます。(値は 度数 * 60000

最初は少し複雑に感じるかもしれませんが、これらの設定方法は一度覚えてしまえば、あらゆる場面で応用が効きます。

この記事で紹介したコードを参考に、ぜひあなたのPythonスクリプトでも見栄えの良い、分かりやすいグラフを作成してみてください。openpyxlによるレポート作成が、きっともっと楽しく、効率的になるはずです。

コメント

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