使用python pptx自定义图例位置

使用python pptx自定义图例位置,python,python-pptx,Python,Python Pptx,我想将图例设置在自定义的自定义位置 我的最终目标是获取现有图表的设置,并对新图表使用相同的设置 我在文档中看到,可以这样设置图例: () 但我得到一个错误: ValueError: CUSTOM (-4161) not a member of XL_LEGEND_POSITION enumeration 我是否遗漏了任何内容,或者如何在自定义位置设置图例?该位置的XL\u legend\u位置的自定义成员仅为报告成员(大致类似于“只读”)。手动调整图例(使用UI用鼠标拖放)后,它将用作图例.p

我想将图例设置在自定义的自定义位置

我的最终目标是获取现有图表的设置,并对新图表使用相同的设置

我在文档中看到,可以这样设置图例:

()

但我得到一个错误:

ValueError: CUSTOM (-4161) not a member of XL_LEGEND_POSITION enumeration

我是否遗漏了任何内容,或者如何在自定义位置设置图例?

位置的
XL\u legend\u位置的自定义
成员仅为报告成员(大致类似于“只读”)。手动调整图例(使用UI用鼠标拖放)后,它将用作
图例.position
属性的值。与该枚举的其他成员不同,它不是“可分配”的,当然也不能自行将位置设置为所需的位置


python pptx
API尚不支持图例的自定义放置。如果您想这样做,就必须通过低级别的
lxml
调用来操作底层XML。您需要了解相关的XML模式和语义,才能知道如何使用该XML来生成所需的结果。这类功能在
pythonpptx
pythondocx
中通常被称为“变通功能”(它们的工作原理非常相似,都基于相同的体系结构)。谷歌搜索“python pptx”或“python docx”变通方法功能会发现一些用于其他目的的示例,如果您决定采用这种方法,这些示例可能会有所帮助。

我找不到完整的答案,因此我认为值得发布我使用的变通方法:

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))

谢谢你的详细解释!我将看看变通解决方案
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))