「どの部署が」「どの製品が」——順位や大小を並べて見せたいときは、縦棒グラフよりも横棒グラフのほうが読み手に優しいことがあります。項目名が日本語だと、横棒なら文字を寝かせずに済み、項目が増えても高さを足すだけで対応できるからです。 本記事では、Spire.XLS for Python を使用して Python で Excel に横棒グラフを作成する方法 を解説します。集合横棒グラフと積み上げ横棒グラフの 2 種類を取り上げ、グラフの位置、タイトル、項目軸・数値軸、データラベル、凡例までをコードで設定していきます。 クイックナビゲーション 準備:Spire.XLS for Python のインストール 集合横棒グラフを作成する 積み上げ横棒グラフを作成する 集合と積み上げの使い分け グラフ書式でよく使うプロパティ まとめ FAQ 準備: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 スクリプト側では、次の 1 行をインポートします。本記事のコードはセルの書式を色名で指定するため、spire.xls.common は使いません。 from spire.xls import * なお、Workbook() で新規作成したブックには既定で 3 枚のワークシート(Sheet1 ~ Sheet3)が用意されています。グラフ用のシート 1 枚だけにしたい場合は、Workbook.CreateEmptySheets(1) を呼んでから使うと出力ファイルがすっきりします。 集合横棒グラフを作成する 集合横棒グラフ(クラスター)は、同じ項目の中で系列ごとの棒を並べて比較する形式です。Worksheet.Charts.Add() メソッドにグラフの種類を渡して追加し、戻り値の Chart オブジェクトに対してデータ範囲や書式を設定していきます。 作成手順は次のとおりです。 Workbook オブジェクトを作成する Workbook.Worksheets[index] プロパティでワークシートを取得する グラフの元データをセルに入力し、セルの書式を整える Worksheet.Charts.Add(ExcelChartType.BarClustered) メソッドでグラフを追加する Chart.DataRange プロパティでデータ範囲を指定する グラフの位置、タイトル、項目軸、数値軸を設定する Workbook.SaveToFile() メソッドで保存する from spire.xls import * # Workbook オブジェクトを作成 workbook = Workbook() workbook.Version = ExcelVersion.Version2016 # 既定の 3 シートを削除して 1 シートだけにする workbook.CreateEmptySheets(1) sheet = workbook.Worksheets.get_Item(0) sheet.Name = "ClusteredBar" # グラフの元データを入力 data = [ ("四半期", "Aチーム", "Bチーム"), ("第1四半期", 3000, 7000), ("第2四半期", 8000, 2000), ("第3四半期", 9000, 5000), ("第4四半期", 8500, 4200), ] for r, row in enumerate(data, start=1): for c, value in enumerate(row): cell = sheet.Range[r, c + 1] if isinstance(value, str): cell.Text = value else: cell.NumberValue = value # 表の書式を整える sheet.Range["A1:C1"].RowHeight = 18 sheet.Range["A1:C1"].Style.Color = Color.get_Black() sheet.Range["A1:C1"].Style.Font.Color = Color.get_White() sheet.Range["A1:C1"].Style.Font.IsBold = True sheet.Range["A1:C1"].Style.VerticalAlignment = VerticalAlignType.Center sheet.Range["A1:C1"].Style.HorizontalAlignment = HorizontalAlignType.Center sheet.Range["A2:A5"].Style.HorizontalAlignment = HorizontalAlignType.Center sheet.Range["B2:C5"].Style.NumberFormat = '"¥"#,##0' sheet.AutoFitColumn(1) # 集合横棒グラフを追加 chart = sheet.Charts.Add(ExcelChartType.BarClustered) # データ範囲を指定 chart.DataRange = sheet.Range["A1:C5"] chart.SeriesDataFromRange = False # グラフの位置を指定(列番号と行番号で範囲を決める) chart.LeftColumn = 1 chart.TopRow = 6 chart.RightColumn = 11 chart.BottomRow = 29 # グラフタイトルを設定 chart.ChartTitle = "四半期別のチーム売上比較" chart.ChartTitleArea.IsBold = True chart.ChartTitleArea.Size = 12 # 項目軸(縦軸)を設定 chart.PrimaryCategoryAxis.Title = "四半期" chart.PrimaryCategoryAxis.Font.IsBold = True chart.PrimaryCategoryAxis.TitleArea.IsBold = True chart.PrimaryCategoryAxis.TitleArea.TextRotationAngle = 90 # 数値軸(横軸)を設定 chart.PrimaryValueAxis.Title = "売上高(円)" chart.PrimaryValueAxis.HasMajorGridLines = False chart.PrimaryValueAxis.MinValue = 1000 chart.PrimaryValueAxis.TitleArea.IsBold = True # データラベルを表示 for cs in chart.Series: cs.Format.Options.IsVaryColor = True cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True # 凡例を上部に配置 chart.Legend.Position = LegendPositionType.Top # ファイルに保存 workbook.SaveToFile("ClusteredBarChart.xlsx", ExcelVersion.Version2016) workbook.Dispose() グラフの位置は LeftColumn / TopRow / RightColumn / BottomRow の 4 つで指定します。単位はワークシートの列番号・行番号なので、セルの「B6 から K29 の範囲に置く」という感覚で調整できます。 積み上げ横棒グラフを作成する 積み上げ横棒グラフは、系列を 1 本の棒に重ねて合計を示す形式です。コードは集合横棒グラフとほぼ同じで、Worksheet.Charts.Add() に渡すグラフの種類を ExcelChartType.BarStacked に変えるだけです。 from spire.xls import * # Workbook オブジェクトを作成 workbook = Workbook() workbook.Version = ExcelVersion.Version2016 workbook.CreateEmptySheets(1) sheet = workbook.Worksheets.get_Item(0) sheet.Name = "StackedBar" # グラフの元データを入力 data = [ ("四半期", "Aチーム", "Bチーム"), ("第1四半期", 3000, 7000), ("第2四半期", 8000, 2000), ("第3四半期", 9000, 5000), ("第4四半期", 8500, 4200), ] for r, row in enumerate(data, start=1): for c, value in enumerate(row): cell = sheet.Range[r, c + 1] if isinstance(value, str): cell.Text = value else: cell.NumberValue = value # 表の書式を整える sheet.Range["A1:C1"].RowHeight = 18 sheet.Range["A1:C1"].Style.Color = Color.get_Black() sheet.Range["A1:C1"].Style.Font.Color = Color.get_White() sheet.Range["A1:C1"].Style.Font.IsBold = True sheet.Range["A1:C1"].Style.VerticalAlignment = VerticalAlignType.Center sheet.Range["A1:C1"].Style.HorizontalAlignment = HorizontalAlignType.Center sheet.Range["A2:A5"].Style.HorizontalAlignment = HorizontalAlignType.Center sheet.Range["B2:C5"].Style.NumberFormat = '"¥"#,##0' sheet.AutoFitColumn(1) # 積み上げ横棒グラフを追加(種類だけを変える) chart = sheet.Charts.Add(ExcelChartType.BarStacked) chart.DataRange = sheet.Range["A1:C5"] chart.SeriesDataFromRange = False chart.LeftColumn = 1 chart.TopRow = 6 chart.RightColumn = 11 chart.BottomRow = 29 chart.ChartTitle = "四半期別のチーム売上比較" chart.ChartTitleArea.IsBold = True chart.ChartTitleArea.Size = 12 chart.PrimaryCategoryAxis.Title = "四半期" chart.PrimaryCategoryAxis.Font.IsBold = True chart.PrimaryCategoryAxis.TitleArea.IsBold = True chart.PrimaryCategoryAxis.TitleArea.TextRotationAngle = 90 chart.PrimaryValueAxis.Title = "売上高(円)" chart.PrimaryValueAxis.HasMajorGridLines = False chart.PrimaryValueAxis.MinValue = 1000 chart.PrimaryValueAxis.TitleArea.IsBold = True for cs in chart.Series: cs.Format.Options.IsVaryColor = True cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True chart.Legend.Position = LegendPositionType.Top workbook.SaveToFile("StackedBarChart.xlsx", ExcelVersion.Version2016) workbook.Dispose() 同じデータを使っても、棒が並列か積み上がるかで伝わる内容は変わります。系列ごとの大小を見たいなら集合、系列の内訳と合計を同時に見せたいなら積み上げを選んでください。 集合と積み上げの使い分け 集合横棒グラフ(BarClustered) 積み上げ横棒グラフ(BarStacked) 棒の並び 系列ごとに横へ並列 1 本の棒に系列を重ねる 読み取れる値 系列ごとの実数 各系列の内訳と合計 比較のしやすさ 系列間の大小比較がしやすい 項目間の合計比較がしやすい 向いている用途 チーム別・店舗別の実績比較 売上に占める商品カテゴリの内訳 弱点 系列が多いと棒が細くなる 中央の系列は差が読み取りにくい なお、ExcelChartType にはこのほかに Bar100PercentStacked(100% 積み上げ)や Bar3DClustered(3D 集合)も用意されています。構成比を常に 100% で揃えたい場合は Bar100PercentStacked を選んでください。 グラフ書式でよく使うプロパティ 本記事のコードに出てきた設定を、目的別に整理しておきます。 データ範囲 — Chart.DataRange にセル範囲を渡す。系列名や項目名の行を含めて指定すると、凡例と項目軸が自動で設定される 位置とサイズ — Chart.LeftColumn / TopRow / RightColumn / BottomRow タイトル — Chart.ChartTitle に文字列を設定し、書式は Chart.ChartTitleArea(IsBold や Size)で指定する 項目軸 — Chart.PrimaryCategoryAxis。TitleArea.TextRotationAngle を 90 にすると、軸ラベルを縦書きにできる 数値軸 — Chart.PrimaryValueAxis。MinValue で目盛りの下限を、HasMajorGridLines で補助線の有無を制御する データラベル — Chart.Series をループし、cs.DataPoints.DefaultDataPoint.DataLabels.HasValue を True にする 凡例 — Chart.Legend.Position に LegendPositionType の値(Top / Bottom / Left / Right)を指定する とくに MinValue は効果が分かりやすい設定です。売上のように 0 から大きく離れた値を扱うとき、下限を 0 のままにすると棒の長さの差が見えにくくなります。上の例では 1000 を指定して差異を強調しています。 まとめ 本記事では、Spire.XLS for Python を使用して Python で Excel に横棒グラフを作成する方法 を解説しました。Worksheet.Charts.Add() に渡す ExcelChartType を BarClustered と BarStacked で切り替えるだけで、同じデータから用途の異なる 2 種類のグラフを作り分けられます。データの入力からグラフの配置、軸ラベル、データラベル、凡例までをすべてコードで完結できるため、定型の実績レポートを毎月同じ体裁で出力するといった業務の自動化に向いています。 Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。なお無償の試用版では、保存したファイルに評価用の警告シートが追加されます。ライセンスを適用するとこれも出力されなくなります。 FAQ グラフに表示するデータの範囲に、表の見出し行を含めるべきですか? 含めることをおすすめします。Chart.DataRange に系列名の行と項目名の列を含めて指定すると、凡例と項目軸のラベルが自動的に設定されます。含めずに数値だけを範囲指定した場合は、Series[0].CategoryLabels のように系列側で個別にラベルを指定する必要があります。 項目軸のラベルが長くて重なってしまいます。 Chart.PrimaryCategoryAxis.TitleArea.TextRotationAngle = 90 を設定すると、軸ラベルを縦書きにできます。あわせて Chart.LeftColumn を大きくしてグラフ全体の幅を広げるか、Chart.ChartTitleArea.Size を小さくして余白を確保してください。 3D の横棒グラフや 100% 積み上げに変更できますか? はい。Worksheet.Charts.Add() に渡す値を ExcelChartType.Bar3DClustered や ExcelChartType.Bar100PercentStacked に変えるだけで作成できます。既存のグラフの種類を後から変更したい場合は Chart.ChartType プロパティに代入します。 グラフの元データを後から書き換えたら、グラフも更新されますか? はい。Chart.DataRange が指すセルの値を書き換えて保存すれば、グラフはその範囲を参照しているため新しい値で表示されます。系列そのものを増減させたい場合は Chart.Series を操作するか、DataRange を設定し直してください。 出力したファイルに余分なシートが入ってしまいます。 Workbook() で新規作成したブックには既定で 3 枚のワークシートが含まれます。Workbook.CreateEmptySheets(1) を呼ぶか、Workbook.Worksheets.Clear() でいったん空にしてからシートを追加すると、必要なシートだけのファイルになります。