数字を「割合」として見せたいとき、表のままだと読み手は頭の中で足し算をしなければなりません。円グラフにすれば、全体の中での位置づけが一目で伝わります。
本記事では、Spire.XLS for Python を使用して Python で Excel に円グラフを作成する方法 を解説します。標準の円グラフ、スライスを切り離した分離型の円グラフ、そして小さな項目を補助円にまとめる複合円グラフの 3 種類を順に扱います。
全体の流れは 3 種類とも同じです。Workbook を作り、セルにデータを入力し、Worksheet.Charts.Add() に ExcelChartType の値を渡してグラフを追加し、Chart オブジェクトのプロパティで見た目を整えて保存する——以降のセクションで変わるのは、渡すグラフの種類と補助円まわりの設定だけです。
クイックナビゲーション
準備:Spire.XLS for Python のインストール
本記事のコードは Spire.XLS for Python と plum-dispatch v1.7.4 を使用しています(動作確認は Spire.XLS for Python 16.8.2)。pip コマンドでインストールしてください。
pip install Spire.XLS
スクリプト側では、次の 2 行をインポートします。
from spire.xls import *
from spire.xls.common import *
なお、Workbook() で新規作成したブックには既定で 3 枚のワークシートが含まれます。本記事のコードでは Workbook.CreateEmptySheets(1) を呼び、グラフ用のシート 1 枚だけを持つファイルを出力しています。あわせて Workbook.Version に ExcelVersion.Version2016 を設定しておくと、保存形式が古い .xls にならずに済みます。
標準の円グラフを作成する
まずは基本の円グラフです。Worksheet.Charts.Add(ExcelChartType.Pie) メソッドでグラフを追加し、戻り値の Chart オブジェクトにデータ範囲やタイトル、系列のラベルを設定します。
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成
workbook = Workbook()
workbook.Version = ExcelVersion.Version2016
workbook.CreateEmptySheets(1)
sheet = workbook.Worksheets.get_Item(0)
sheet.Name = "PieChart"
# グラフの元データを入力
data = [("年度", "売上高"), ("2021年", 4000), ("2022年", 6000),
("2023年", 7000), ("2024年", 8500)]
for r, (label, value) in enumerate(data, start=1):
sheet.Range[r, 1].Text = label
if isinstance(value, str):
sheet.Range[r, 2].Text = value
else:
sheet.Range[r, 2].NumberValue = value
# 表の書式を整える
sheet.Range["A1:B1"].RowHeight = 15
sheet.Range["A1:B1"].Style.Color = Color.get_DarkGray()
sheet.Range["A1:B1"].Style.Font.Color = Color.get_White()
sheet.Range["A1:B1"].Style.VerticalAlignment = VerticalAlignType.Center
sheet.Range["A1:B1"].Style.HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["B2:B5"].Style.NumberFormat = '"¥"#,##0'
sheet.Columns[0].ColumnWidth = 12
# 円グラフを追加
chart = sheet.Charts.Add(ExcelChartType.Pie)
# データ範囲を指定
chart.DataRange = sheet.Range["B2:B5"]
chart.SeriesDataFromRange = False
# グラフの位置を指定
chart.LeftColumn = 4
chart.TopRow = 2
chart.RightColumn = 12
chart.BottomRow = 20
# グラフタイトルを設定
chart.ChartTitle = "年度別の売上構成"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 12
# 最初の系列を取得
cs = chart.Series[0]
# カテゴリラベルと値を系列に設定
cs.CategoryLabels = sheet.Range["A2:A5"]
cs.Values = sheet.Range["B2:B5"]
# データラベルに値を表示
cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True
workbook.SaveToFile("PieChart.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

円グラフでは、棒グラフのように「表の見出し行を含めてデータ範囲を渡す」方法が使えません。上のコードで Chart.DataRange に渡しているのは数値列(B2:B5)だけで、項目名は Series[0].CategoryLabels に別途指定しています。この 2 つを分けて設定するのが円グラフのポイントです。
Series[0] は最初の系列を表します。円グラフは 1 系列で描くのが基本なので、通常は Series[0] にだけ設定すれば十分です。
分離型の円グラフを作成する
分離型の円グラフは、スライスの一部を円の中心から切り離して強調する形式です。作り方は標準の円グラフと同じで、Worksheet.Charts.Add() に渡す値を ExcelChartType.PieExploded に変えるだけです。
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成
workbook = Workbook()
workbook.Version = ExcelVersion.Version2016
workbook.CreateEmptySheets(1)
sheet = workbook.Worksheets.get_Item(0)
sheet.Name = "ExplodedPie"
# グラフの元データを入力(標準の円グラフと同じデータを使う)
data = [("年度", "売上高"), ("2021年", 4000), ("2022年", 6000),
("2023年", 7000), ("2024年", 8500)]
for r, (label, value) in enumerate(data, start=1):
sheet.Range[r, 1].Text = label
if isinstance(value, str):
sheet.Range[r, 2].Text = value
else:
sheet.Range[r, 2].NumberValue = value
sheet.Range["A1:B1"].Style.Color = Color.get_DarkGray()
sheet.Range["A1:B1"].Style.Font.Color = Color.get_White()
sheet.Range["A1:B1"].Style.HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["B2:B5"].Style.NumberFormat = '"¥"#,##0'
sheet.Columns[0].ColumnWidth = 12
# 分離型の円グラフを追加
chart = sheet.Charts.Add(ExcelChartType.PieExploded)
chart.DataRange = sheet.Range["B2:B5"]
chart.SeriesDataFromRange = False
chart.LeftColumn = 4
chart.TopRow = 2
chart.RightColumn = 12
chart.BottomRow = 20
chart.ChartTitle = "年度別の売上構成"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 12
cs = chart.Series[0]
cs.CategoryLabels = sheet.Range["A2:A5"]
cs.Values = sheet.Range["B2:B5"]
cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True
workbook.SaveToFile("ExplodedPieChart.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

PieExploded では、すべてのスライスが均等に切り離された状態で出力されます。特定の 1 スライスだけを大きく離したい場合は、Series のデータポイント単位で切り離し量を指定する必要があります。全体を均等に離すだけでよければ、この 1 行の変更で済みます。
複合円グラフを作成する
複合円グラフ(pie of pie)は、構成比の小さい項目を補助円にまとめて表示する形式です。項目が多いと主円グラフのスライスが細くなりすぎるため、その対策として使われます。ExcelChartType.PieOfPie で追加し、系列の Format.Options で補助円のサイズと振り分け条件を指定します。
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成
workbook = Workbook()
workbook.Version = ExcelVersion.Version2016
workbook.CreateEmptySheets(1)
sheet = workbook.Worksheets.get_Item(0)
sheet.Name = "PieOfPie"
# グラフの元データを入力(売上構成比)
data = [("商品", "売上構成比"), ("コーヒー", 0.27), ("ビスケット", 0.13),
("紅茶", 0.26), ("野菜", 0.25), ("果物", 0.03),
("スナック菓子", 0.05), ("飲料", 0.01)]
for r, (label, value) in enumerate(data, start=1):
sheet.Range[r, 1].Text = label
if isinstance(value, str):
sheet.Range[r, 2].Text = value
else:
sheet.Range[r, 2].NumberValue = value
# 表の書式を整える
sheet.Range["A1:B1"].Style.Color = Color.get_DarkGray()
sheet.Range["A1:B1"].Style.Font.Color = Color.get_White()
sheet.Range["A1:B1"].Style.HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["B2:B8"].Style.NumberFormat = "0%"
sheet.AutoFitColumn(1)
# 複合円グラフを追加
chart = sheet.Charts.Add(ExcelChartType.PieOfPie)
chart.DataRange = sheet.Range["B2:B8"]
chart.SeriesDataFromRange = False
chart.LeftColumn = 4
chart.TopRow = 2
chart.RightColumn = 13
chart.BottomRow = 21
chart.ChartTitle = "商品カテゴリ別の売上構成比"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 12
cs = chart.Series[0]
cs.CategoryLabels = sheet.Range["A2:A8"]
cs.Values = sheet.Range["B2:B8"]
cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True
# 補助円グラフのサイズ(主円グラフに対する割合)
cs.Format.Options.PieSecondSize = 50
# 補助円グラフに振り分ける条件(10% 未満の項目を補助円へ)
cs.Format.Options.SplitType = SplitType.Percent
cs.Format.Options.SplitValue = 10
workbook.SaveToFile("PieOfPieChart.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

上の例では、構成比が 10% 未満の「果物(3%)」「スナック菓子(5%)」「飲料(1%)」の 3 項目が補助円グラフへ移り、主円グラフには 4 つの大きなスライスだけが残ります。SplitType には次の値を指定できます。
SplitType |
SplitValue の意味 |
|---|---|
Percent |
構成比がこの値(%)未満の項目を補助円へ |
Position |
下位 N 件の項目を補助円へ |
Value |
値がこの値未満の項目を補助円へ |
Custom |
個別に指定した項目を補助円へ |
PieSecondSize は主円グラフに対する補助円グラフの大きさを割合(%)で指定します。小さくしすぎると補助円の中のラベルが読めなくなるため、50 前後を目安に調整してください。
どの円グラフを選ぶか
3 種類のどれを使うかは、項目の数と見せたい内容で決まります。
- 項目が 5 つ前後まで — 標準の円グラフ(
Pie)で十分です - 1 つだけ強調したい項目がある — 分離型(
PieExploded)でスライスを切り離します - 項目が 7 つ以上あり、下位が細かすぎる — 複合円グラフ(
PieOfPie)で下位を補助円にまとめます
ただし、円グラフが向かないデータもあります。円グラフが表せるのは「合計に占める割合」だけなので、値の合計そのものに意味がないデータ(前年比、平均点、気温など)には使えません。また、項目が多すぎる場合や、項目間のわずかな差を比較したい場合は横棒グラフのほうが正確に伝わります。ExcelChartType には Pie3D(3D 円)や Pie3DExploded(3D 分離型)も用意されていますが、遠近感のぶん面積の比較が難しくなるため、実務では平面のまま使うことをおすすめします。
まとめ
本記事では、Spire.XLS for Python を使用して Python で Excel に円グラフを作成する方法 を解説しました。3 種類とも、Worksheet.Charts.Add() に ExcelChartType.Pie / PieExploded / PieOfPie のいずれかを渡して追加し、数値は Chart.DataRange、項目名は Series[0].CategoryLabels に分けて指定します。複合円グラフだけは、Series[0].Format.Options の PieSecondSize と SplitType / SplitValue で補助円の見え方を制御します。
Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。なお無償の試用版では、保存したファイルに評価用の警告シートが追加されます。ライセンスを適用するとこれも出力されなくなります。
FAQ
円グラフのスライスにパーセントを表示するにはどうすればよいですか?
Series[0].DataPoints.DefaultDataPoint.DataLabels.HasPercentage = True を設定すると、データラベルが構成比(%)表示になります。値とパーセントを両方出したい場合は HasValue と併せて有効にしてください。なお本記事の複合円グラフの例のように、元データを 0.27 のような小数で持ち、セルの表示形式を "0%" にする方法でも構いません。
Chart.DataRange に見出し行を含めたら、カテゴリ名が表示されませんでした。
円グラフでは、Chart.DataRange に渡した範囲の先頭行は系列名として扱われます。項目名(カテゴリ名)は別の列にあるため、Series[0].CategoryLabels で明示的に指定してください。棒グラフや折れ線グラフのように 1 回の範囲指定で完結しない点が異なります。
構成比ではなく「下位 N 件」で補助円グラフに振り分けられますか?
はい。cs.Format.Options.SplitType = SplitType.Position とし、SplitValue に件数を指定します。たとえば SplitValue = 3 にすると、下位 3 件の項目が補助円グラフへ移ります。同様に SplitType.Value を使えば「値がこの値未満の項目」という条件で振り分けられます。
分離型で 1 つのスライスだけを切り離せますか?
ExcelChartType.PieExploded はすべてのスライスを均等に切り離す動作になります。データポイント単位で切り離し量を数値指定するプロパティは、動作確認したバージョン(16.8.2)の Python バインディングでは公開されていません。1 か所だけを強調したい場合は、保存したファイルを Excel で開いてデータポイントを選択し切り離すか、強調したい項目を別のグラフで補うことを検討してください。
作成した複合円グラフを画像に変換したら、主円グラフが正しく描画されませんでした。
Spire.XLS の Worksheet.ToImage() による画像変換では、複合円グラフの主円グラフが正しく描画されない場合があります(動作確認したバージョンでは、主円グラフが単色で塗りつぶされました)。保存した .xlsx を Excel で開いた場合は補助円も含めて正しく表示されるため、見た目の確認は Excel 上で行ってください。






