مدیریت برچسبهای داده نمودار در ارائهها با پایتون
معرفی
برچسبهای داده اطلاعاتی درباره مجموعههای نمودار و نقاط دادهٔ جداگانه نمایش میدهند و به خوانندگان کمک میکنند مقادیر را شناسایی و نمودار را درک کنند. این مقاله توضیح میدهد چگونه مقادیر را قالببندی کنیم، درصدها را نمایش دهیم، متن برچسب را بخوانیم، برچسبها را فراتر از حداکثر محور کنترل کنیم، فاصلهٔ برچسبهای محور دستهبندی را تنظیم کنیم و موقعیت برچسبهای نمودار دایرهای را تعیین کنیم.
تنظیم دقت دادهها در برچسبهای دادهٔ نمودار
Use number_format_of_values to format series values. این مثال یک نمودار خطی با دادههای پیشفرض ایجاد میکند، جدول داده آن را نمایش میدهد و برچسبهای مقدار را برای اولین مجموعه فعال میکند. قالب #,##0.00 یک جداکنندهٔ هزارگان و دو رقم اعشار نمایش میدهد بدون اینکه مقادیر پایهای تغییر کنند.
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‑نقطهای نمایش میدهد. دستههایی که مجموع آنها صفر است برای جلوگیری از تقسیم بر صفر نادیده گرفته میشوند. در صورت تغییر دادههای نمودار، متن برچسب سفارشی را دوباره محاسبه کنید.
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٪ انباشته با سریهای قرمز و آبی در چهار دسته ایجاد میکند. هر جفت مقدار مجموعاً به 1 میرسد. قالب برچسب 0.0% مقدار 0.30 را به 30.0٪ نمایش میدهد، در حالی که محور عمودی از دو رقم اعشار استفاده میکند. هر دو سری از متن برچسب سفید با اندازه 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)
خواندن متن واقعی برچسبهای داده
Use get_actual_label_text to retrieve the text produced by a data label’s settings. این کار هنگام استخراج برچسبها برای گزارشها، جستجو در محتوای ارائه یا اعتبارسنجی نمودارهای تولید شده مفید است. در مثال زیر، قالب پیشفرض 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 استفاده کنید تا کنترل کنید آیا برچسبهای دادهٔ آنها نمایش داده شوند یا خیر. این تنظیم فقط قابلیت نمایش برچسب را تغییر میدهد؛ محدودهٔ محور یا مقادیر دادهٔ پایه را تغییر نمیدهد.
این مثال یک نمودار ستونی خوشهای 2D با مقادیر 60 و 120 ایجاد میکند. در محور عمودی is_automatic_max_value را روی False و max_value را روی 100 تنظیم میکند. اسلاید اول اجازه میدهد برچسبها فراتر از حداکثر ظاهر شوند؛ نسخهٔ کپی آن این قابلیت را غیرفعال میکند. هر دو اسلاید در DataLabelsOverMaximum.pptx ذخیره میشوند.
با 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 باقی میماند و نقطهٔ دادهٔ دوم در هر دو حالت 120 میماند.
| show_data_labels_over_maximum = True | show_data_labels_over_maximum = False |
|---|---|
![]() |
![]() |
Chart Type
این مثال از یک نمودار ستونی ۲ بعدی با محور مقدار استفاده میکند. نمودارهای بدون محور مقدار، مانند نمودارهای دایرهای و دونات، حداکثر محوری برای محدود کردن به این شکل ندارند.تنظیم فاصله برچسب از محور
Use label_offset to control the distance between category axis labels and the axis. مقدار بهعنوان درصدی از بیشینهٔ اندازهٔ قلم برچسبهای محور محسوب میشود. این مثال یک نمودار ستونی خوشهای ایجاد میکند و فاصلهٔ برچسب محور افقی را روی 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 را فعال میکند. با استفاده از انحرافات 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
# دو برچسب را دورتر از تکههایشان جابجا کنید.
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)
فعالسازی خطوط راهنما تضمین نمیکند که برای هر برچسب یک خط ظاهر شود. قابلیت مشاهده بستگی به موقعیت برچسب و رفتار چیدمان نمودار دارد. در این مثال، دو برچسب جابجا شده خطوط راهنمای قابلمشاهده دارند؛ برچسبهایی که نزدیک به برشهایشان میمانند نیازی به آن ندارند.
تصویر زیر FormattedLeaderLines.pptx ذخیرهشده رندر شده با Aspose.Slides را نشان میدهد:

افزودن چند ردیف برچسب داده بالای نمودار ستونی
این مثال یک نمودار ستونی با دو ردیف برچسب داده بالای ناحیهٔ رسم ایجاد میکند. سری A ستونهای قابل مشاهده را نمایش میدهد، در حالی که سریهای B و C برچسبهای اضافی را فراهم میکنند. ستونهای آنها با حذف پر کردن و خط مرزی مخفی میشوند. ویژگی overlap تمام سه سری را با مراکز دستهای یکسان همترازی میکند.
تنظیمات plot_area فضایی برای ردیفهای برچسب اختصاص میدهد. پس از محاسبهٔ موقعیتهای پیشفرض توسط validate_chart_layout، x و y تراز افقی را حفظ کرده و انحرافات عمودی را اعمال میکنند تا برچسبها در دو ردیف چینش شوند. اعداد همچنان برچسبهای دادهٔ مرتبط با مقادیر سریها هستند؛ فقط سرصفحههای ردیف بهصورت شکلهای متن جداگانهاند.
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
# تمام سه سری را با مراکز دستهای یکسان همتراز کنید.
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
# فضای بالای نمودار را برای دو ردیف برچسب داده رزرو کنید.
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)

سؤالات متداول
چگونه میتوانم از همپوشانی برچسبهای داده در نمودارهای متراکم جلوگیری کنم؟
از قرارگیری خودکار برچسبها، خطوط راهنما و کاهش اندازه قلم ترکیب کنید؛ در صورت لزوم برخی فیلدها (مثلاً دسته) را مخفی کنید یا فقط برای مقادیر افراطی یا نقاط کلیدی برچسب نمایش دهید.
چگونه میتوانم برچسبها را فقط برای مقادیر صفر، منفی یا خالی غیرفعال کنم؟
قبل از فعال کردن برچسبها، نقاط داده را فیلتر کنید و نمایش را برای مقادیر 0، مقادیر منفی یا مقادیر گمشده طبق قانون تعریفشده غیرفعال کنید.
چگونه میتوانم سبک برچسبها را هنگام خروجی به PDF/تصاویر ثابت نگه دارم؟
بهصورت صریح خانواده قلم و اندازه را تنظیم کنید و اطمینان حاصل کنید که قلم در محیط رندرینگ موجود است تا از جایگزینی پیشفرض جلوگیری شود.

