簡體   English   中英

Python-PPTX:數據標簽位置不適用於圓環圖

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

我有一個圖表占位符,我在其中插入了一個圖表類型為“DOUGHNUT”的圖表。 我已經向它添加了數據標簽並想改變它們的位置。 出於某種原因,文檔中給出的方法對我的圖表沒有影響。

這是我的代碼,如果我做錯了什么,請幫助-

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

PowerPoint 對放置某些圖表屬性的位置很挑剔,並且可以在需要時隨意忽略它們(盡管它始終如此)。

一個值得嘗試的快速選項是在系列中逐點單獨設置值。 所以像:

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

最可靠的方法是首先手動生成您想要的效果,在示例圖表上使用 PowerPoint 本身,然后檢查保存的文件中的 XML PowerPoint 生成,可能使用opc-diag 一旦您確定了哪些 XML 會產生所需的效果(或發現 PowerPoint 不允許您這樣做),那么您就可以繼續研究如何獲取由python-pptx生成的 XML。 如果你能做到那么遠,這可能是一個很好的第二個問題。

我通過編寫以下代碼使其工作。

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
  • 錯誤的原因是設置標簽位置。 無論您設置什么,它都會要求修復 PPT。 將不得不深入研究以了解為什么會這樣。
  • 也為了節省更多時間格式不起作用(字體顏色,大小)
  • 如果有人有任何線索,請幫助。

要添加 Vibhanshu 的響應,我可以使用以下代碼獲得格式(字體類型、字體顏色、大小等):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM