我想将图例设置为自定义的自定义位置。
我的最终目标是获取现有图表的设置,并对新图表使用相同的设置。
我在文档中读到可以像这样设置图例:
(http://python-pptx.readthedocs.io/en/latest/api/enum/XlLegendPosition.html#xllegendposition)
from pptx.enum.chart import XL_LEGEND_POSITION
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.CUSTOM
但是我得到了一个ValueError:
ValueError: CUSTOM (-4161) not a member of XL_LEGEND_POSITION enumeration
我是否遗漏了任何内容或如何在自定义位置设置图例?
答案 0 :(得分:1)
.CUSTOM
的{{1}}成员仅为报告成员(大致类似于“只读”)。当手动调整图例(使用UI拖放鼠标)时,它用作XL_LEGEND_POSITION
属性的值。与该枚举的其他成员不同,它不是“可分配的”,当然也不能将位置设置到您想要的位置。
Legend.position
API尚不支持图例的自定义展示位置。如果您想这样做,则必须使用低级python-pptx
调用来操作底层XML。您需要了解相关的XML模式和语义,以了解如何处理该XML以生成您所追求的结果。这种事情在lxml
和python-pptx
中通常称为“变通办法”(它们的工作方式非常相似,基于相同的架构)。 Google搜索“python-pptx”或“python-docx”变通办法功能会找到一些用于其他目的的示例,如果您决定采用这种方法,可能会对此有所帮助。
答案 1 :(得分:0)
我找不到对此的完整答案,因此我认为值得发布我使用的解决方法:
from pptx.oxml.xmlchemy import OxmlElement
def SubElement(parent, tagname, **kwargs):
element = OxmlElement(tagname)
element.attrib.update(kwargs)
parent.append(element)
return element
def manuallySetLegendPosition(
chart,
x,
y,
w,
h
):
## Inside layout, add manualLayout
L = chart.legend._element.get_or_add_layout()
mL = L.get_or_add_manualLayout()
## Add xMode and yMode and set vals to edge
xM = SubElement(mL, 'c:xMode', val="edge")
xY = SubElement(mL, 'c:yMode', val="edge")
## Add x, value is between -1 and 1 as a proportion of the chart width
## point of reference on the legend is its centre, not top left
xE = SubElement(mL, 'c:x', val=str(x))
## Add y, same concept as above
yE = SubElement(mL, 'c:y', val=str(y))
## Add w, legend height as a proportion of chart height
wE = SubElement(mL, 'c:w', val=str(w))
## Add h, same concept as above
hE = SubElement(mL, 'c:h', val=str(h))