Utkarsh Sinha
Utkarsh Sinha

Reputation: 971

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

Upvotes: 3

Views: 2483

Answers (3)

Maxime V
Maxime V

Reputation: 1

To add on Vibhanshu's response, I could get the formatting (font type, font color, size etc) to work using the following code:

for idx, point in enumerate(chart.series[0].points):
    # set position
    point.data_label.position = XL_LABEL_POSITION.OUTSIDE_END

    # set text
    point.data_label.has_text_frame = True
    point.data_label.text_frame.text = "This is an example"

    # set formatting
    for paragraph_idx, paragraph in enumerate(point.data_label.text_frame.paragraphs):
        paragraph.line_spacing = 0.6 # set paragraph line spacing

        for run in paragraph.runs:
            run.font.size = Pt(30) #set font size 
            run.font.name = 'Poppins Medium' #set font name
            run.font.color.rgb = RGBColor.from_string("FF0000") #set font color

Upvotes: 0

Vibhanshu Biswas
Vibhanshu Biswas

Reputation: 379

I made it work by writing the below code.

def apply_data_labels(self, chart):
        plot = chart.plots[0]
        plot.has_data_labels = True
        for series in plot.series:
            values = series.values
            counter = 0
            for point in series.points:
                data_label = point.data_label
                data_label.has_text_frame = True
                data_label.text_frame.text = str(values[counter])
                counter = counter + 1
  • the cause of error is setting the label position. no matter what you set it asks to repair the PPT. will have to drill down more to see why is it so.
  • Also to save some more time the formatting doesn't works(font color, size)
  • If anybody has any leads then please help.

Upvotes: 0

scanny
scanny

Reputation: 28933

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.

Upvotes: 4

Related Questions