Python-PPTX:数据标签位置不适用于圆环图
Python-PPTX : Data Label Positions not working for Doughnut Chart
我有一个图表占位符,我在其中插入了 chart_type '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 对放置某些图表属性的位置很挑剔,并且可以在需要时随意忽略它们(尽管它一直这样做)。
一个值得尝试的快速选项是单独设置值,point-by-point 在系列中。所以像:
for point in series.points:
point.data_label.position = XL_LABEL_POSITION.OUTSIDE_END
最可靠的方法是从手工制作您想要的效果开始,在示例图表上使用 PowerPoint 本身,然后在保存的文件中检查 XML PowerPoint 制作的效果,也许使用 opc-diag
.一旦您确定了 XML 产生所需效果的内容(或者发现 PowerPoint 不允许您这样做),您就可以继续研究如何获得 [=12= 生成的 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
我有一个图表占位符,我在其中插入了 chart_type '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 对放置某些图表属性的位置很挑剔,并且可以在需要时随意忽略它们(尽管它一直这样做)。
一个值得尝试的快速选项是单独设置值,point-by-point 在系列中。所以像:
for point in series.points:
point.data_label.position = XL_LABEL_POSITION.OUTSIDE_END
最可靠的方法是从手工制作您想要的效果开始,在示例图表上使用 PowerPoint 本身,然后在保存的文件中检查 XML PowerPoint 制作的效果,也许使用 opc-diag
.一旦您确定了 XML 产生所需效果的内容(或者发现 PowerPoint 不允许您这样做),您就可以继续研究如何获得 [=12= 生成的 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