在 python-pptx 中访问图表中的条形位置
Accessing bar shapes positions in charts in python-pptx
我正在寻找一种方法来访问由 python-pptx 库创建的各个条形图的位置。我假设单独的条形图被认为是 'shapes' 并且确实具有左、上、宽、高的属性。我已经成功地使用以下代码创建了图表。
如何引用图表中的各个条形图,以及如何访问它们的属性,因为我需要制作更复杂的图表,即在条形图之间用箭头显示同比增长等。
谢谢。
# CHART
chart_data = ChartData()
chart_data.categories = ['January', 'February', 'March', 'April']
chart_data.add_series('Revenue', monthly_revenue, 3)
chart_data.add_series('Cost', monthly_cost, 3)
graphic_frame = s.placeholders[10].insert_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, chart_data)
chart = graphic_frame.chart
plot = chart.plots[0]
plot.has_data_labels = True
plot.overlap = -10
data_labels = plot.data_labels
data_labels.font.size = Pt(11)
data_labels.font.color.rgb = RGBColor(0,0,0)
data_labels.number_format = "#,##0"
chart.value_axis.has_minor_gridlines = False
chart.value_axis.has_major_gridlines = False
chart.value_axis.tick_labels.font.size = Pt(12)
chart.value_axis.tick_labels.number_format = "#,##0"
chart.category_axis.tick_labels.font.size = Pt(12)
chart.series[1].fill.solid()
chart.series[1].fill.fore_color.rgb = RGBColor(192,80,77)
图表中的柱没有单独的位置和大小信息,至少没有存储在 .pptx 文件的 XML 中。
所以简短的回答是您不能使用 python-pptx 直接执行您要求的操作。
MS API,例如可以使用 VBA 访问,但也可以使用 Iron Python,确实提供了 Point.left、.top、.width 和 .高度。因此,如果您能够忍受困难,您也许可以在那种环境中做一些事情:) 请注意,这样的代码直接操作 PowerPoint 应用程序实例,并且如果我没记错的话,只在 Windows 中。因此,如果您尝试 运行 它在服务器端,则存在相当大的问题。
图表的元素(例如条形图)不是形状。整个图表是一个独立的对象,包含在所谓的 "graphics frame" 形状中,table 也是如此。图表本身是一个 DrawingML 对象(与 PresentationML 对象相对),一个在 Word、Excel 和 PowerPoint 之间共享的 XML 词汇表。这就是为什么您可以在这三者之间移植图表。不管怎样,背景可能比你想要的要多,但简而言之,它们的处理方式与矩形形状的处理方式截然不同,矩形形状肯定具有明确的位置和大小。
我正在寻找一种方法来访问由 python-pptx 库创建的各个条形图的位置。我假设单独的条形图被认为是 'shapes' 并且确实具有左、上、宽、高的属性。我已经成功地使用以下代码创建了图表。
如何引用图表中的各个条形图,以及如何访问它们的属性,因为我需要制作更复杂的图表,即在条形图之间用箭头显示同比增长等。
谢谢。
# CHART
chart_data = ChartData()
chart_data.categories = ['January', 'February', 'March', 'April']
chart_data.add_series('Revenue', monthly_revenue, 3)
chart_data.add_series('Cost', monthly_cost, 3)
graphic_frame = s.placeholders[10].insert_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, chart_data)
chart = graphic_frame.chart
plot = chart.plots[0]
plot.has_data_labels = True
plot.overlap = -10
data_labels = plot.data_labels
data_labels.font.size = Pt(11)
data_labels.font.color.rgb = RGBColor(0,0,0)
data_labels.number_format = "#,##0"
chart.value_axis.has_minor_gridlines = False
chart.value_axis.has_major_gridlines = False
chart.value_axis.tick_labels.font.size = Pt(12)
chart.value_axis.tick_labels.number_format = "#,##0"
chart.category_axis.tick_labels.font.size = Pt(12)
chart.series[1].fill.solid()
chart.series[1].fill.fore_color.rgb = RGBColor(192,80,77)
图表中的柱没有单独的位置和大小信息,至少没有存储在 .pptx 文件的 XML 中。
所以简短的回答是您不能使用 python-pptx 直接执行您要求的操作。
MS API,例如可以使用 VBA 访问,但也可以使用 Iron Python,确实提供了 Point.left、.top、.width 和 .高度。因此,如果您能够忍受困难,您也许可以在那种环境中做一些事情:) 请注意,这样的代码直接操作 PowerPoint 应用程序实例,并且如果我没记错的话,只在 Windows 中。因此,如果您尝试 运行 它在服务器端,则存在相当大的问题。
图表的元素(例如条形图)不是形状。整个图表是一个独立的对象,包含在所谓的 "graphics frame" 形状中,table 也是如此。图表本身是一个 DrawingML 对象(与 PresentationML 对象相对),一个在 Word、Excel 和 PowerPoint 之间共享的 XML 词汇表。这就是为什么您可以在这三者之间移植图表。不管怎样,背景可能比你想要的要多,但简而言之,它们的处理方式与矩形形状的处理方式截然不同,矩形形状肯定具有明确的位置和大小。