left property
ChartDataLabel.left property
Gets or sets the distance of the data label in points from the left edge of the chart or from the position specified by its ChartDataLabel.position property, depending on the value of the ChartDataLabel.left_mode property.
@property
def left(self) -> float:
...
@left.setter
def left(self, value: float):
...
Remarks
The value of the property changes proportionally if the chart shape is resized.
The property cannot be set in a Word 2016 chart.
Examples
Shows how to place data labels of doughnut chart outside doughnut.
doc = aw.Document()
builder = aw.DocumentBuilder(doc=doc)
chart_width = 432
chart_height = 252
shape = builder.insert_chart(chart_type=aw.drawing.charts.ChartType.DOUGHNUT, width=chart_width, height=chart_height)
chart = shape.chart
series_coll = chart.series
# Delete default generated series.
series_coll.clear()
# Hide the legend.
chart.legend.position = aw.drawing.charts.LegendPosition.NONE
# Generate data.
data_length = 20
total_value = 0
categories = [None for i in range(0, data_length)]
values = [None for i in range(0, data_length)]
i = 0
while i < data_length:
categories[i] = f'Category {i}'
values[i] = data_length - i
total_value = total_value + values[i]
i += 1
series = series_coll.add(series_name='Series 1', categories=categories, values=values)
series.has_data_labels = True
data_labels = series.data_labels
data_labels.show_value = True
data_labels.show_leader_lines = True
# The Position property cannot be used for doughnut charts. Let's place data labels using the Left and Top
# properties around a circle outside of the chart doughnut.
# The origin is in the upper left corner of the chart.
title_area_height = 25.5 # This can be calculated using title text and font.
doughnut_center_y = title_area_height + (chart_height - title_area_height) / 2
doughnut_center_x = chart_width / 2
label_height = 16.5 # This can be calculated using label font.
one_char_label_width = 12.75 # This can be calculated for each label using its text and font.
two_char_label_width = 17.25 # This can be calculated for each label using its text and font.
y_margin = 0.75
label_margin = 1.5
label_circle_radius = chart_height - doughnut_center_y - y_margin - label_height / 2
# Because the data points start at the top, the X coordinates used in the Left and Top properties of
# the data labels point to the right and the Y coordinates point down, the starting angle is -PI/2.
total_angle = -math.pi / 2
previous_label = None
i = 0
while i < series.y_values.count:
data_label = data_labels[i]
value = series.y_values[i].double_value
label_width = None
if value < 10:
label_width = one_char_label_width
else:
label_width = two_char_label_width
label_segment_angle = value / total_value * 2 * math.pi
label_angle = label_segment_angle / 2 + total_angle
label_center_x = label_circle_radius * math.cos(label_angle) + doughnut_center_x
label_center_y = label_circle_radius * math.sin(label_angle) + doughnut_center_y
label_left = label_center_x - label_width / 2
label_top = label_center_y - label_height / 2
# If the current data label overlaps other labels, move it horizontally.
if previous_label != None and math.fabs(previous_label.top - label_top) < label_height and (math.fabs(previous_label.left - label_left) < label_width):
# Move right on the top, left on the bottom.
is_on_top = total_angle < 0 or total_angle >= math.pi
factor = None
if is_on_top:
factor = 1
else:
factor = -1
label_left = previous_label.left + label_width * factor + label_margin
data_label.left = label_left
data_label.left_mode = aw.drawing.charts.ChartDataLabelLocationMode.ABSOLUTE
data_label.top = label_top
data_label.top_mode = aw.drawing.charts.ChartDataLabelLocationMode.ABSOLUTE
total_angle = total_angle + label_segment_angle
previous_label = data_label
i += 1
doc.save(file_name=ARTIFACTS_DIR + 'Charts.DoughnutChartLabelPosition.docx')
See Also
- module aspose.words.drawing.charts
- class ChartDataLabel