使用python-pptx自定义图例位置

时间:2018-01-18 16:21:00

标签: python python-pptx

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

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

我在文档中读到可以像这样设置图例:

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

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

2 个答案:

答案 0 :(得分:1)

.CUSTOM的{​​{1}}成员仅为报告成员(大致类似于“只读”)。当手动调整图例(使用UI拖放鼠标)时,它用作XL_LEGEND_POSITION属性的值。与该枚举的其他成员不同,它不是“可分配的”,当然也不能将位置设置到您想要的位置。

Legend.position API尚不支持图例的自定义展示位置。如果您想这样做,则必须使用低级python-pptx调用来操作底层XML。您需要了解相关的XML模式和语义,以了解如何处理该XML以生成您所追求的结果。这种事情在lxmlpython-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))