Pythonでプレゼンテーションのチャート データ ラベルを管理する
概要
データ ラベルはチャートの系列や個々のデータ ポイントに関する情報を表示し、読者が値を識別しチャートを理解できるようにします。この記事では、値の書式設定、パーセンテージの表示、ラベル テキストの取得、軸の最大値を超えるラベルの制御、カテゴリ 軸ラベルの間隔調整、円グラフラベルの位置設定方法について説明します。
可視データ ラベルのカウント
プレゼンテーションを公開する前に、どれだけのデータ ラベルが表示対象になっているかを確認するには、count_of_visible_data_labels を使用します。len(labels) がコレクション内のラベル総数を返すのとは異なり、系列のデフォルト設定と個別ラベル設定の両方を考慮します。
この例は 1 つの系列と 3 つのデータ ポイントを持つ縦棒グラフを作成します。系列のlabels コレクションにアクセスし、設定の変更に伴う可視カウントを 0, 3, 2, 3 の順に出力します。総数は 3 のままです。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 50, 50, 500, 300)
chart.chart_data.series.clear()
chart.chart_data.categories.clear()
workbook = chart.chart_data.chart_data_workbook
series_cell = workbook.get_cell(0, 0, 1, "Values")
series = chart.chart_data.series.add(series_cell, chart.type)
for i in range(3):
category_cell = workbook.get_cell(0, i + 1, 0, f"Category {i + 1}")
chart.chart_data.categories.add(category_cell)
value_cell = workbook.get_cell(0, i + 1, 1, (i + 1) * 10)
series.data_points.add_data_point_for_bar_series(value_cell)
labels = series.labels
print(f"Total: {len(labels)}; visible: {labels.count_of_visible_data_labels}") # 合計: 3; 可視: 0
labels.default_data_label_format.show_value = True
print(f"Visible: {labels.count_of_visible_data_labels}") # 可視: 3
labels[1].data_label_format.show_value = False
print(f"Visible: {labels.count_of_visible_data_labels}") # 可視: 2
labels[1].data_label_format.show_legend_key = True
print(f"Visible: {labels.count_of_visible_data_labels}") # 可視: 3
系列のdefault_data_label_format がデフォルト設定を提供します。そこでshow_value を有効にすると、3 つのラベルすべてに値が表示されます。1 つのラベルのdata_label_format で False に設定すると、そのラベルだけ設定が上書きされます。show_legend_key を有効にすると、そのラベルは再び可視としてカウントされます(値は非表示のままです)。
可視カウントは可視性設定を反映します。ラベルが重なっているか、切り取られているか、描画されたチャートで読めるかどうかは測定しません。
チャート データ ラベルの数値精度設定
シリーズの値を書式設定するには、number_format_of_values を使用します。この例は既定データの折れ線グラフを作成し、データ テーブルを表示し、最初の系列に値ラベルを有効にします。書式 #,##0.00 は千位区切りと小数点以下 2 桁を表示しますが、基になる値は変更しません。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.LINE, 50, 50, 450, 300)
chart.has_data_table = True
series = chart.chart_data.series[0]
series.number_format_of_values = "#,##0.00"
series.labels.default_data_label_format.show_value = True
presentation.save("PrecisionOfDatalabels_out.pptx", slides.export.SaveFormat.PPTX)
チャートに埋め込まれたブックの数値セルを書式設定するには、Set Custom Number Formats for Workbook Cells を参照してください。この例は、元のセル書式に従った値ラベルを表示しつつ、格納された数値はそのまま保持します。
ラベルとしてパーセンテージを表示
積み上げ縦棒グラフの場合、各値をカテゴリ合計に対するパーセンテージとして計算し、text_frame_for_overriding にテキストを割り当てます。この例は既定チャート データを使用し、8 ポイントのフォントで小数点以下 2 桁のパーセンテージを表示します。合計が 0 のカテゴリは除外して除算エラーを回避します。チャート データが変更された場合は、カスタム ラベル テキストを再計算してください。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.STACKED_COLUMN, 20, 20, 400, 400)
category_totals = [0.0] * len(chart.chart_data.categories)
for k in range(len(chart.chart_data.categories)):
for series in chart.chart_data.series:
point_value = float(series.data_points[k].value.data)
category_totals[k] += point_value
for series in chart.chart_data.series:
series.labels.default_data_label_format.show_legend_key = False
for j in range(len(series.data_points)):
label = series.data_points[j].label
if category_totals[j] == 0:
continue
point_value = float(series.data_points[j].value.data)
data_point_percent = point_value / category_totals[j] * 100
portion = slides.Portion()
portion.text = f"{data_point_percent:.2f} %"
portion.portion_format.font_height = 8
label.text_frame_for_overriding.text = ""
paragraph = label.text_frame_for_overriding.paragraphs[0]
paragraph.portions.add(portion)
label.data_label_format.show_value = True
label.data_label_format.show_series_name = False
label.data_label_format.show_percentage = False
label.data_label_format.show_legend_key = False
label.data_label_format.show_category_name = False
label.data_label_format.show_bubble_size = False
presentation.save("DisplayPercentageAsLabels_out.pptx", slides.export.SaveFormat.PPTX)
チャート データ ラベルにパーセンテージ記号を設定
値が分数で格納されている場合、number_format を使用してパーセンテージ表示します。is_number_format_linked_to_source を False に設定すると、ラベル書式が元セルとは独立して適用されます。
この例は 100% 積み上げ縦棒グラフを作成し、4 つのカテゴリに赤と青の系列を配置します。各ペアの合計は 1 になります。ラベル書式 0.0% は 0.30 を 30.0% と表示し、垂直軸は小数点以下 2 桁で表示します。両系列とも白色の 10 ポイント ラベル テキストを使用します。
import aspose.slides as slides
import aspose.slides.charts as charts
import aspose.pydrawing as drawing
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.PERCENTS_STACKED_COLUMN, 20, 20, 500, 400)
chart.axes.vertical_axis.is_number_format_linked_to_source = False
chart.axes.vertical_axis.number_format = "0.00%"
chart.chart_data.series.clear()
chart.chart_data.categories.clear()
workbook = chart.chart_data.chart_data_workbook
worksheet_index = 0
for i in range(4):
category_cell = workbook.get_cell(worksheet_index, i + 1, 0, f"Category {i + 1}")
chart.chart_data.categories.add(category_cell)
series_names = ["Reds", "Blues"]
series_colors = [drawing.Color.red, drawing.Color.blue]
values = [[0.30, 0.50, 0.80, 0.65], [0.70, 0.50, 0.20, 0.35]]
for i in range(len(series_names)):
series_cell = workbook.get_cell(worksheet_index, 0, i + 1, series_names[i])
series = chart.chart_data.series.add(series_cell, chart.type)
for j in range(4):
value_cell = workbook.get_cell(worksheet_index, j + 1, i + 1, values[i][j])
series.data_points.add_data_point_for_bar_series(value_cell)
series.format.fill.fill_type = slides.FillType.SOLID
series.format.fill.solid_fill_color.color = series_colors[i]
label_format = series.labels.default_data_label_format
label_format.show_value = True
label_format.is_number_format_linked_to_source = False
label_format.number_format = "0.0%"
label_format.text_format.portion_format.font_height = 10
label_format.text_format.portion_format.fill_format.fill_type = slides.FillType.SOLID
label_format.text_format.portion_format.fill_format.solid_fill_color.color = drawing.Color.white
presentation.save("SetDataLabelsPercentageSign_out.pptx", slides.export.SaveFormat.PPTX)
データ ラベルの実際のテキスト取得
[data label] の設定から生成されたテキストを取得するには、get_actual_label_text を使用します。これはレポート用ラベル抽出やプレゼンテーション コンテンツ検索、生成されたチャートの検証に便利です。以下の例では、既定のdata label format がカテゴリ名、系列名、値を組み合わせます。あるポイントは値をパーセンテージで書式設定し、別のポイントはtext_frame_for_overriding からカスタム テキストを使用します。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 300)
chart.chart_data.series.clear()
chart.chart_data.categories.clear()
workbook = chart.chart_data.chart_data_workbook
for i, category_name in enumerate(["Q1", "Q2"]):
category_cell = workbook.get_cell(0, i + 1, 0, category_name)
chart.chart_data.categories.add(category_cell)
north_cell = workbook.get_cell(0, 0, 1, "North")
north = chart.chart_data.series.add(north_cell, chart.type)
for i, value in enumerate([0.25, 0.75]):
value_cell = workbook.get_cell(0, i + 1, 1, value)
north.data_points.add_data_point_for_bar_series(value_cell)
south_cell = workbook.get_cell(0, 0, 2, "South")
south = chart.chart_data.series.add(south_cell, chart.type)
for i, value in enumerate([0.40, 0.60]):
value_cell = workbook.get_cell(0, i + 1, 2, value)
south.data_points.add_data_point_for_bar_series(value_cell)
for series in chart.chart_data.series:
label_format = series.labels.default_data_label_format
label_format.show_category_name = True
label_format.show_series_name = True
label_format.show_value = True
north.labels[1].data_label_format.is_number_format_linked_to_source = False
north.labels[1].data_label_format.number_format = "0%"
south.labels[0].text_frame_for_overriding.text = "Reviewed"
for series in chart.chart_data.series:
for point in series.data_points:
label = point.label
if not label.is_visible:
continue
label_text = label.get_actual_label_text()
print(f"Value: {point.value.data}; label: {label_text}")
データ ポイントに格納されている数値は 0.75 のままで、ラベルが 75% とカテゴリ・系列名を併せて表示していても同様です。カスタム テキストは生成されたラベル テキストを置き換えます。get_actual_label_text はどちらの場合でも結果のラベル文字列を返します。可視ラベルのみを抽出したい場合は、上記のように is_visible を別途確認してください。
軸の最大値を超えるデータ ラベルの制御
軸範囲を手動で制限すると、一部のデータ ポイントが最大値を超えることがあります。その場合、show_data_labels_over_maximum を使用してラベルの表示を制御します。この設定はラベルの可視性のみを変更し、軸範囲や基になるデータ値は変更しません。
以下の例は、値が 60 と 120 の 2D クラスタ化縦棒グラフを作成します。縦軸のis_automatic_max_value を False、max_value を 100 に設定します。最初のスライドは最大値を超えるラベルを表示し、コピーしたスライドはそれを無効にします。両スライドは DataLabelsOverMaximum.pptx として保存されます。
[value] ラベルはshow_value で有効化します。チャート レベルの設定だけでは個別ラベルの非表示設定を上書きせず、値表示は自動的に有効になりません。この例では系列全体の値を有効にし、position を使用して各列の外側端にラベルを配置します。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 50, 50, 600, 400)
chart.has_legend = False
chart.chart_data.series.clear()
chart.chart_data.categories.clear()
workbook = chart.chart_data.chart_data_workbook
first_category = workbook.get_cell(0, 1, 0, "Within range")
second_category = workbook.get_cell(0, 2, 0, "Above maximum")
chart.chart_data.categories.add(first_category)
chart.chart_data.categories.add(second_category)
series_name = workbook.get_cell(0, 0, 1, "Values")
series = chart.chart_data.series.add(series_name, chart.type)
first_value = workbook.get_cell(0, 1, 1, 60)
second_value = workbook.get_cell(0, 2, 1, 120)
series.data_points.add_data_point_for_bar_series(first_value)
series.data_points.add_data_point_for_bar_series(second_value)
series.labels.default_data_label_format.show_value = True
series.labels.default_data_label_format.position = charts.LegendDataLabelPosition.OUTSIDE_END
chart.axes.vertical_axis.is_automatic_max_value = False
chart.axes.vertical_axis.max_value = 100
chart.show_data_labels_over_maximum = True
second_slide = presentation.slides.add_clone(slide)
second_chart = second_slide.shapes[0]
second_chart.show_data_labels_over_maximum = False
presentation.save("DataLabelsOverMaximum.pptx", slides.export.SaveFormat.PPTX)
以下の画像は Microsoft PowerPoint でレンダリングした保存スライドを示しています。True の場合、ラベル 120 が上端の境界に表示され、False の場合は非表示になります。ラベル 60 は常に表示され、軸最大は 100 のままで、2 番目のデータ ポイントは両ケースで 120 のままです。
| show_data_labels_over_maximum = True | show_data_labels_over_maximum = False |
|---|---|
![]() |
![]() |
Chart Type
この例は値軸を持つ 2D 縦棒グラフを使用しています。円グラフやドーナツ グラフなど値軸を持たないチャートには、今回のように軸最大を制限する概念はありません。軸からのラベル距離設定
label_offset を使用して、カテゴリ軸ラベルと軸間の距離を制御します。値は軸ラベルの最大フォント サイズのパーセンテージです。この例はクラスタ化縦棒グラフを作成し、水平軸ラベルのオフセットを 500 に設定します。この設定は個々のデータ ポイントに付随するラベルではなく、カテゴリ軸ラベルに影響します。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 300)
chart.axes.horizontal_axis.label_offset = 500
presentation.save("SetCategoryAxisLabelDistance_out.pptx", slides.export.SaveFormat.PPTX)
ラベル位置の調整
円グラフでは、データ ラベルの位置を調整して間隔を広げ、リーダー ライン用の余白を確保します。
この例は最初のデータ ポイントの値を表示し、ラベルをスライスの外側に配置し、x と y オフセットを調整します。これらのオフセットはそれぞれチャートの幅と高さの割合です。
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.PIE, 50, 50, 200, 200)
series = chart.chart_data.series
label = series[0].labels[0]
label.data_label_format.show_value = True
label.data_label_format.position = charts.LegendDataLabelPosition.OUTSIDE_END
label.x = 0.71
label.y = 0.04
presentation.save("presentation.pptx", slides.export.SaveFormat.PPTX)

リーダー ラインの書式設定
円グラフのラベルがスライスの外側に配置される場合、リーダー ラインは各値と対応するスライスを結び付けるのに役立ちます。コントラストの強い色とやや太めの線にすると見やすくなり、透明度や破線スタイルにすれば視覚的な干渉を抑えられます。
シリーズのデータ ラベル コレクション レベルでリーダー ラインを設定するには、leader_lines_format を使用します。series.labels.leader_lines_format.line の設定は個別ラベルではなくコレクション全体に適用されます。
この例は既定データの円グラフを作成し、スライスの外側に値を表示し、show_leader_lines を有効にします。2 つのラベルをx とy オフセットでスライスから遠ざけます。入力プレゼンテーションは不要です。
線のfill_format はアルファ値 191(255 中の約 25% の透明度)で純粋な青色を設定します。width は太さを 2 ポイントに、dash_style は破線に設定します。
import aspose.slides as slides
import aspose.slides.charts as charts
import aspose.pydrawing as drawing
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.PIE, 80, 50, 560, 400)
chart.has_legend = False
series = chart.chart_data.series[0]
label_format = series.labels.default_data_label_format
label_format.show_value = True
label_format.position = charts.LegendDataLabelPosition.OUTSIDE_END
label_format.show_leader_lines = True
# 2つのラベルをスライスからさらに遠くに移動する。
series.labels[0].x = 0.10
series.labels[0].y = -0.05
series.labels[1].x = -0.10
series.labels[1].y = 0.05
line = series.labels.leader_lines_format.line
line.fill_format.fill_type = slides.FillType.SOLID
line.fill_format.solid_fill_color.color = drawing.Color.from_argb(191, 30, 90, 160)
line.width = 2
line.dash_style = slides.LineDashStyle.DASH
presentation.save("FormattedLeaderLines.pptx", slides.export.SaveFormat.PPTX)
リーダー ラインを有効にしても、すべてのラベルに線が現れる保証はありません。可視性はラベル配置とチャートのレイアウト動作に依存します。この例では、離れた 2 つのラベルにリーダー ラインが表示され、スライスに近いラベルは不要です。
以下の画像は Aspose.Slides でレンダリングした保存ファイル FormattedLeaderLines.pptx を示しています。

縦棒グラフ上に複数行のデータ ラベルを追加
この例はプロット領域の上に 2 行のデータ ラベルを持つ縦棒グラフを作成します。Series A は可視列を表示し、Series B と Series C が追加ラベルを提供します。これらの列は塗りつぶしと輪郭を削除して非表示にします。overlap プロパティにより、3 つの系列が同じカテゴリ中心に揃えられます。
plot_area の設定でラベル行のスペースを確保します。validate_chart_layout が既定位置を計算した後、x とy が水平位置を保持しつつ垂直オフセットを適用して 2 行に並べます。数値は系列値にリンクしたデータ ラベルであり、行見出しのみが別個のテキスト シェイプです。
import aspose.slides as slides
import aspose.slides.charts as charts
import aspose.pydrawing as drawing
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 40, 40, 640, 200)
chart.has_title = False
chart.has_legend = False
chart.text_format.portion_format.font_height = 12
chart.chart_data.series.clear()
chart.chart_data.categories.clear()
workbook = chart.chart_data.chart_data_workbook
workbook.clear(0)
categories = ["North", "South", "East", "West"]
series_names = ["Series A", "Series B", "Series C"]
series_values = [
[35, 42, 28, 47],
[22, 31, 19, 26],
[12, 16, 14, 18]
]
for category_index, category_name in enumerate(categories):
category_cell = workbook.get_cell(0, category_index + 1, 0, category_name)
chart.chart_data.categories.add(category_cell)
for series_index, series_name in enumerate(series_names):
series_cell = workbook.get_cell(0, 0, series_index + 1, series_name)
series = chart.chart_data.series.add(series_cell, charts.ChartType.CLUSTERED_COLUMN)
for category_index in range(len(categories)):
value_cell = workbook.get_cell(0, category_index + 1, series_index + 1, series_values[series_index][category_index])
series.data_points.add_data_point_for_bar_series(value_cell)
if series_index > 0:
# B と C の列を非表示にしますが、データ ラベルは残します。
series.format.fill.fill_type = slides.FillType.NO_FILL
series.format.line.fill_format.fill_type = slides.FillType.NO_FILL
label_format = series.labels.default_data_label_format
label_format.show_value = True
label_format.text_format.portion_format.font_height = 12
label_fill = label_format.text_format.portion_format.fill_format
label_fill.fill_type = slides.FillType.SOLID
label_fill.solid_fill_color.color = drawing.Color.black
label_format.position = charts.LegendDataLabelPosition.INSIDE_BASE
# 3 つの系列すべてを同じカテゴリ中心に揃えます。
chart.chart_data.series[0].parent_series_group.overlap = 100
# このコンパクトな例ではグリッド線を減らします。
chart.axes.vertical_axis.is_automatic_major_unit = False
chart.axes.vertical_axis.major_unit = 10
# プロット上部にデータ ラベル用の 2 行分のスペースを確保します。
chart.plot_area.layout_target_type = charts.LayoutTargetType.INNER
chart.plot_area.x = 0.15
chart.plot_area.y = 0.32
chart.plot_area.width = 0.80
chart.plot_area.height = 0.48
chart.validate_chart_layout()
for series_index in range(1, len(series_names)):
series = chart.chart_data.series[series_index]
row_top = 0.15 if series_index == 1 else 0.03
for category_index in range(len(categories)):
data_label = series.data_points[category_index].label
# デフォルトの水平位置を保持します。Y は以下からのオフセットです
# デフォルトのラベル位置からのオフセットで、チャート高さの割合として表されます。
data_label.x = 0
data_label.y = row_top - data_label.actual_y / chart.height
# 行見出しだけが別個のテキスト シェイプです。
row_heading = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, chart.x, chart.y + row_top * chart.height, 85, 18)
row_heading.fill_format.fill_type = slides.FillType.NO_FILL
row_heading.line_format.fill_format.fill_type = slides.FillType.NO_FILL
row_heading.add_text_frame(series_names[series_index])
row_heading.text_frame.text_frame_format.margin_top = 0
row_heading.text_frame.text_frame_format.margin_bottom = 0
heading_format = row_heading.text_frame.paragraphs[0].portions[0].portion_format
heading_format.font_height = 12
heading_format.fill_format.fill_type = slides.FillType.SOLID
heading_format.fill_format.solid_fill_color.color = drawing.Color.black
presentation.save("multiple-rows-of-labels.pptx", slides.export.SaveFormat.PPTX)

FAQ
密集したチャートでデータ ラベルの重なりを防ぐにはどうすればよいですか?
自動ラベル配置、リーダー ライン、フォント サイズの縮小を組み合わせます。必要に応じて一部のフィールド(例:カテゴリ)を非表示にするか、極端な値または重要ポイントにのみラベルを表示します。
ゼロ、負、または空の値に対してラベルだけを無効にするには?
ラベルを有効化する前にデータ ポイントをフィルタリングし、0、負の値、または欠損値に対して表示をオフにするルールを適用します。
PDF/画像にエクスポートしたときにラベルスタイルを一貫させるには?
フォント ファミリとサイズを明示的に設定し、レンダリング環境にフォントが存在することを確認してフォールバックを防ぎます。

