Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python-PPTX : Data Label Positions not working for Doughnut Chart

I have a Chart Placeholder, into which I have inserted a chart of chart_type 'DOUGHNUT'. I've added data labels to it and want to change their positions. For some reason, the method given in the documentation has no effect on my chart.

Here is my code, please help if I'm doing something wrong -

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE, XL_LABEL_POSITION, XL_DATA_LABEL_POSITION, XL_TICK_MARK, XL_TICK_LABEL_POSITION 

chart_data = ChartData()
chart_data.add_series('', tuple(input_chart_data[x] for x in input_chart_data))

graphic_frame = content_placeholder.insert_chart(XL_CHART_TYPE.DOUGHNUT, chart_data)
chart = graphic_frame.chart

chart.has_legend = False

#Adding Data-Labels with custom text
chart.plots[0].has_data_labels = True
data_labels = chart.plots[0].data_labels

i = 0
series = chart.series[0]
for point in series.points:
    fill = point.format.fill
    fill.solid()
    fill.fore_color.rgb = RGBColor(<color_code>)
    point.data_label.has_text_frame = True

    #Assigning custom text for data label associated with each data-point
    point.data_label.text_frame.text = str(chart_data.categories[i].label) + "\n" + str(float(chart.series[0].values[i])) + "%"

    for run in point.data_label.text_frame.paragraphs[0].runs:
        run.font.size = Pt(10)

    i+=1

data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
like image 382
Utkarsh Sinha Avatar asked Jan 21 '26 04:01

Utkarsh Sinha


1 Answers

PowerPoint is finicky about where you place certain chart attributes and feels free to ignore them when it wants (although it does so consistently).

A quick option worth trying is to set the value individually, point-by-point in the series. So something like:

for point in series.points:
    point.data_label.position = XL_LABEL_POSITION.OUTSIDE_END

The most reliable method is to start by producing the effect you want by hand, using PowerPoint itself on an example chart, then inspecting the XML PowerPoint produces in the saved file, perhaps using opc-diag. Once you've identified what XML produces the desired effect (or discovered PowerPoint won't let you do it), then you can proceed to working out how to get the XML generated by python-pptx. That might make a good second question if you're able to get that far.

like image 66
scanny Avatar answered Jan 23 '26 19:01

scanny