月ごとの売上や使用量の推移を見るとき、数字を並べた表だけでは「いつ増えて、いつ減ったか」がつかみにくいことがあります。折れ線グラフにすれば、時系列の変化、ピーク、谷がひと目で伝わります。 本記事では、Spire.XLS for Python を使って Python で Excel に折れ線グラフを作成する方法 を紹介します。基本の折れ線グラフに加えて、マーカーとスムージングで読みやすくしたグラフ、系列を積み上げて累積の推移を見る積み上げ折れ線グラフの 3 つを作ります。 最後に、折れ線・積み上げ折れ線・棒グラフの使い分けも整理します。 クイックナビゲーション 実行環境とサンプルデータ 折れ線グラフの構成要素 シンプルな折れ線グラフを作成する マーカーとスムージングで読みやすくする 積み上げ折れ線グラフで累積を比較する 折れ線・積み上げ・棒グラフの使い分け まとめ FAQ 実行環境とサンプルデータ 本記事のコードは Spire.XLS for Python(動作確認は 16.8.2)と plum-dispatch v1.7.4 で検証しています。Excel 本体は必要なく、次の pip コマンドだけで環境が整います。 pip install Spire.XLS スクリプトでは、次の 2 行をインポートします。 from spire.xls import * from spire.xls.common import * サンプルは、文具・洗剤・備品の 3 品目について、1 月から 6 月までの使用量を記録した表です。A1 に「品目」、B1:G1 に月、A2:A4 に品目名、B2:G4 に数値が入ります。 品目 1月 2月 3月 4月 5月 6月 文具 180 210 190 175 160 200 洗剤 140 160 220 120 180 170 備品 100 90 150 110 200 140 「1月」のような文字列は、CellRange.Text で入力すると、文字列のまま項目軸に表示されます。CellRange.Value は日付として解釈されることがあるため、月名には Text を使います。 Workbook() は既定で 3 枚のシートを持つため、グラフ用の 1 枚だけに絞るには Workbook.CreateEmptySheets(1) を先に呼びます。不要なシートが残らず、配布しやすいファイルになります。あわせて Workbook.Version に ExcelVersion.Version2016 を設定し、保存形式を新しくしておきます。 折れ線グラフの構成要素 折れ線グラフは、次の要素で構成されます。どのプロパティを設定すればよいかを押さえておくと、コードの見通しがよくなります。 要素 役割 主なプロパティ 系列 線 1 本分。ここでは文具・洗剤・備品 Chart.Series 項目軸(横軸) 時間の目盛り。ここでは 1月〜6月 Chart.PrimaryCategoryAxis 数値軸(縦軸) 使用量の目盛り Chart.PrimaryValueAxis 凡例 線の色と系列名の対応 Chart.Legend データラベル 各点の値 Series.DataPoints.DefaultDataPoint.DataLabels Chart.DataRange に A1:G4 を指定すると、1 行目の月が項目軸、A 列の品目が系列名として自動的に使われます。系列は行単位で並んでいるため、SeriesDataFromRange には True を設定します。 chart.DataRange = sheet.Range["A1:G4"] chart.SeriesDataFromRange = True 系列を列方向に並べた表(1 列目が月、2 列目以降が品目)の場合は False になります。表の向きに合わせて切り替えてください。 シンプルな折れ線グラフを作成する まずは基本の折れ線グラフです。Worksheet.Charts.Add(ExcelChartType.Line) にグラフの種類を渡すと、Chart オブジェクトが返ります。このオブジェクトにデータ範囲やタイトル、軸、データラベル、凡例を設定していきます。 作成手順は次のとおりです。 Workbook オブジェクトを作成し、シートを 1 枚にする A1:G4 にグラフの元データを入力する 表の見出しと数値の書式を整える Worksheet.Charts.Add(ExcelChartType.Line) でグラフを追加する Chart.DataRange と SeriesDataFromRange を設定する グラフの位置、タイトル、項目軸、数値軸を設定する データラベルと凡例を設定して保存する from spire.xls import * from spire.xls.common import * MONTHS = ["1月", "2月", "3月", "4月", "5月", "6月"] SERIES = { "文具": [180, 210, 190, 175, 160, 200], "洗剤": [140, 160, 220, 120, 180, 170], "備品": [100, 90, 150, 110, 200, 140], } # Workbook オブジェクトを作成し、シートを 1 枚にする workbook = Workbook() workbook.Version = ExcelVersion.Version2016 workbook.CreateEmptySheets(1) sheet = workbook.Worksheets[0] sheet.Name = "LineChart" # グラフの元データを入力 sheet.Range["A1"].Text = "品目" for j, month in enumerate(MONTHS, start=2): sheet.Range[1, j].Text = month # 「1月」を日付にしないため Text で入力 for i, (label, values) in enumerate(SERIES.items(), start=2): sheet.Range[i, 1].Text = label for j, value in enumerate(values, start=2): sheet.Range[i, j].NumberValue = value # 表の書式を整える sheet.Range["A1:G1"].RowHeight = 20 sheet.Range["A1:G1"].Style.Color = Color.get_Black() sheet.Range["A1:G1"].Style.Font.Color = Color.get_White() sheet.Range["A1:G1"].Style.Font.IsBold = True sheet.Range["A1:G1"].Style.HorizontalAlignment = HorizontalAlignType.Center sheet.Range["A1:G1"].Style.VerticalAlignment = VerticalAlignType.Center sheet.Range["B2:G4"].Style.NumberFormat = "#,##0" sheet.AutoFitColumn(1) # 折れ線グラフを追加 chart = sheet.Charts.Add(ExcelChartType.Line) chart.DataRange = sheet.Range["A1:G4"] chart.SeriesDataFromRange = True # グラフの位置を指定(A6:L28 付近) chart.LeftColumn = 1 chart.TopRow = 6 chart.RightColumn = 12 chart.BottomRow = 28 # グラフタイトルと項目軸を設定 chart.ChartTitle = "消耗品の月別使用量" chart.ChartTitleArea.IsBold = True chart.ChartTitleArea.Size = 12 chart.PrimaryCategoryAxis.Title = "月" chart.PrimaryCategoryAxis.Font.IsBold = True chart.PrimaryCategoryAxis.TitleArea.IsBold = True # 数値軸を設定 chart.PrimaryValueAxis.Title = "使用量" chart.PrimaryValueAxis.HasMajorGridLines = True chart.PrimaryValueAxis.MinValue = 80 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("SimpleLineChart.xlsx", ExcelVersion.Version2016) workbook.Dispose() グラフの大きさと位置は、LeftColumn・TopRow・RightColumn・BottomRow の 4 つの行・列番号で決まります。セル範囲を指定するのと同じ感覚で、「A6 から L28 に置く」と考えると調整しやすいでしょう。 PrimaryValueAxis.MinValue を 80 にしているのは、使用量が 90〜220 の範囲に収まっているためです。下限を 0 のままにすると上下の余白が大きくなり、線の起伏が読み取りにくくなります。データの最小値に合わせて下限を調整すると、変化が伝わりやすくなります。 Chart.DataRange は、系列名の行と項目名の列を含めた範囲を渡します。これにより、凡例の「文具・洗剤・備品」と項目軸の「1月〜6月」が自動的に設定されます。 マーカーとスムージングで読みやすくする 基本の折れ線グラフは線が細いため、どの月の値なのかが分かりにくいことがあります。各データ点にマーカーを付けると、測定位置が明確になります。系列ごとにマーカーの形と色を変えれば、白黒印刷や色覚特性のある読者にも識別しやすくなります。 シンプル版のコードをベースに、グラフ追加後の系列設定だけを次のように置き換えます。 # 補助線を消して、線とマーカーを目立たせる chart.PrimaryValueAxis.HasMajorGridLines = False colors = [Color.get_RoyalBlue(), Color.get_OrangeRed(), Color.get_SeaGreen()] markers = [ChartMarkerType.Circle, ChartMarkerType.Triangle, ChartMarkerType.Square] for idx, raw in enumerate(chart.Series): cs = ChartSerie(raw) cs.Format.Options.IsVaryColor = False cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True cs.DataFormat.MarkerStyle = markers[idx] cs.DataFormat.MarkerSize = 7 cs.DataFormat.MarkerBackgroundColor = colors[idx] cs.DataFormat.MarkerForegroundColor = Color.get_White() cs.DataFormat.IsSmoothedLine = True マーカーや線の書式を設定するときは、chart.Series の各要素を ChartSerie(raw) でラップし、DataFormat を使います。ChartSerie は系列の書式を扱うラッパーです。 MarkerStyle には ChartMarkerType.Circle のほか、Triangle、Square、Diamond などを指定できます。MarkerSize はマーカーの大きさ、MarkerBackgroundColor は塗りつぶし色、MarkerForegroundColor は枠線の色です。 IsSmoothedLine = True を設定すると、点と点の間をなめらかな曲線で結びます。実際の測定値を補間して表示するため、月次の実測値では線の膨らみが値の位置とずれて見えることがあります。傾向を説明する用途で使い、必要に応じてデータラベルや元の表を併記すると誤解を避けられます。 なお、マーカーを付けた時点で、Excel 上のグラフ種別は「マーカー付き折れ線グラフ」になります。種類として直接指定したい場合は、ExcelChartType.LineMarkers を使う方法もあります。 保存名を StyledLineChart.xlsx に変えれば、マーカー付きのグラフを出力できます。 積み上げ折れ線グラフで累積を比較する 積み上げ折れ線グラフは、各月の系列値を下から積み上げ、累積の推移を示すグラフです。合計の推移と、どの系列が増減に寄与しているかを同時に見たいときに便利です。 シンプル版のコードで、グラフの種類とデータラベルの設定を次のように変更します。 # グラフの種類を積み上げ折れ線に変更 chart = sheet.Charts.Add(ExcelChartType.LineStacked) chart.DataRange = sheet.Range["A1:G4"] chart.SeriesDataFromRange = True # 位置・タイトル・軸はシンプル版と同じ # ... for cs in chart.Series: cs.Format.Options.IsVaryColor = True # 積み上げでは線の高さが累積値になるため、データラベルは付けない 積み上げ折れ線グラフでは、下から順に系列が積み上がります。たとえば 3 月は、文具の 190 に洗剤の 220 が積み上がって 410、さらに備品の 150 が加わって全体で 560 になります。一番下の線が文具、真ん中の線が文具+洗剤、一番上の線が全体の合計です。 ここで注意したいのがデータラベルの位置です。積み上げ折れ線グラフの線は累積値の位置に描かれますが、DataLabels.HasValue で表示される値は各系列の元の値です。もしデータラベルを付けると、3 月の一番上の線に「150」と表示されます。これは全体の 560 ではなく、備品の 150 です。線の高さとラベルの値が一致しないため、この記事では積み上げ側のデータラベルを外しています。累積値をラベルにしたい場合は、累積値を計算した列を別に用意するか、表と組み合わせて読み取ります。 保存名を StackedLineChart.xlsx に変えれば、積み上げ折れ線グラフを出力できます。 折れ線・積み上げ・棒グラフの使い分け 3 つのグラフは、同じ表からでも伝わる内容が変わります。目的に合わせて選んでください。 目的 折れ線グラフ 積み上げ折れ線グラフ 棒グラフ 時系列の変化を読む ◎ ◎ ○ 系列ごとの実数を比較する ◎ △ ◎ 合計の推移を見る △ ◎ ○ 内訳の変化を見る ○ ◎ ○ 向いている例 前月比、季節変動 総量と構成の推移 項目間の大小比較 ◎ は得意、○ は使える、△ は目的によっては読みにくいことを表します。 系列ごとの増減を素直に比べたいなら、基本の折れ線グラフが適しています。総量の推移と内訳を同時に見たいなら積み上げ折れ線グラフ、項目間の大小を並べて比べたいなら棒グラフを選んでください。 棒グラフで項目間の大小を比べる方法は、Python で Excel に横棒グラフを作成する方法 で解説しています。構成比を円グラフで見せたい場合は、Python で Excel に円グラフを作成する方法 も参考になります。 まとめ 折れ線グラフは、時系列の変化を線の傾きで見せるグラフです。基本の Line、マーカー付きの LineMarkers、積み上げの LineStacked を、データの見せ方に合わせて選びます。 データ範囲 — 系列が行方向に並ぶ表なら SeriesDataFromRange = True、列方向なら False。DataRange には系列名と項目名を含める 線の読みやすさ — マーカーは ChartSerie(raw).DataFormat、スムージングは IsSmoothedLine、補助線は HasMajorGridLines で調整する 積み上げ — 線の高さは累積値、データラベルは各系列の値。ラベルを付けるときは位置の意味を確認する 表の作成からグラフの配置、軸や凡例の設定までをスクリプト 1 本で完結できるので、毎月同じ体裁のレポートを量産する場面に向いています。 Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。なお無償の試用版では、保存したファイルに評価用の警告シートが追加されます。ライセンスを適用するとこれも出力されなくなります。 FAQ 折れ線グラフと散布図はどう使い分けますか? 折れ線グラフは、月や曜日など順序のあるカテゴリに沿って変化を見るのに使います。散布図は、2 つの数値の関係(相関)を見るのに使います。Spire.XLS for Python では、ExcelChartType.Line と ExcelChartType.ScatterLine を使い分けます。 マーカーの形を系列ごとに変えるには? ChartSerie(raw).DataFormat.MarkerStyle に ChartMarkerType.Circle や ChartMarkerType.Triangle などを設定します。あわせて MarkerSize、MarkerBackgroundColor、MarkerForegroundColor を指定すると、形と色を系列ごとに揃えられます。 線をなめらかにできますか? DataFormat.IsSmoothedLine = True を設定します。実際の測定値を補間して表示するため、月次の実測値では点と線の間にずれが出ます。傾向を説明する用途で使い、必要に応じてデータラベルや元の表を併記してください。 積み上げ折れ線グラフで、データラベルの値が線の高さと一致しないのはなぜですか? 積み上げでは各系列の線が累積値の位置に描かれますが、データラベルには各系列の元の値が表示されます。累積値をラベルにしたい場合は、累積値を計算した列を別に用意するか、ラベルを外して表と組み合わせて読み取ります。 系列を行と列のどちらから取るかはどう決めますか? Chart.SeriesDataFromRange で指定します。系列が行方向に並ぶ表なら True、列方向なら False です。Chart.DataRange に系列名と項目名を含めると、凡例と項目軸が自動的に設定されます。 元データを変更したらグラフも更新されますか? Chart.DataRange がセル範囲を参照しているため、セルの値を変更して保存すればグラフも更新されます。系列を増減した場合は、Chart.DataRange を設定し直してください。