在 python-pptx 中隐藏图表系列

Hiding a chart series in python-pptx

如何使用 python-pptx 创建一个包含多个数据系列的新图表,但只在图表上显示其中的一些系列?其他系列应位于图表的背景数据中,但在显示幻灯片时不可见(请参见图 1 进行说明)。

Image 1: Selection of columns that are to be shown initially

目的是我对同一张幻灯片进行多种类型的测量(百分比、绝对值、指数)。起初我只想在图表上显示百分比值。如果图表看起来不太好,我希望能够右键单击图表并 select 其他列以及要显示的其他测量值(见图 2)。

Image 2: Newly selected columns that were previously hidden

解决方法是为每个额外的测量创建隐藏的幻灯片,然后在需要时激活它们。但这对我的情况不起作用 - 数据必须像示例中那样全部放在一张幻灯片中。

期待阅读您的答案! :)

当前测试代码:

prs = Presentation("MyPPTX.pptx")
chart_layout = prs.slide_layouts[11]
chart_placeholder = prs.slides.add_slide(chart_layout).placeholders[15]

# define chart data ---------------------
chart_data_prz = ChartData()
chart_data_prz.categories = ['Male', 'Female']
chart_data_prz.add_series('Age_18-34_in_%', (51,49))
chart_data_prz.add_series('Video-Streaming_in_%', (58, 42))
chart_data_prz.add_series('Age_18-34_in_Mio', (105, 96))
chart_data_prz.add_series('Video-Streaming_in_Mio', (118, 83))
prz_chart = chart_placeholder.insert_chart(XL_CHART_TYPE.BAR_CLUSTERED,chart_data_prz)

当前版本 python-pptx (v0.6.17) 中没有 API 对此的支持。

提供图表数据的嵌入式 Excel 工作簿派生自与图表相同的 ChartData 对象;也就是说,使用 python-pptx 将数据放入图表的 Excel 工作簿中的唯一方法是将其放入用于创建图表的 ChartData 对象中,然后 python-pptx 添加所有图表中的那些系列(这使它们可见)。

我的解决方案:

from pptx.oxml.xmlchemy import OxmlElement

def SubElement(parent, tagname, **kwargs):
        element = OxmlElement(tagname)
        element.attrib.update(kwargs)
        parent.append(element)
        return element

def hideSeriesAndRemoveFromLegend(chart,
                                  seriesIndex):
    """Data labels (if they exist) are not hidden"""
    ## Set series to no fill
    chart.chart.series[seriesIndex].format._element.get_or_add_spPr().get_or_change_to_noFill()
    ## # Remove entry from legend
    ## Get legend
    legend = chart.chart.legend._element
    ## Add legendEntry
    lE = SubElement(legend, "c:legendEntry")
    ## Add idx of the series, index order is reversed
    seriesCount = len(chart.chart.series)
    seriesIndexToDelete = seriesCount - 1 - seriesIndex
    _ = SubElement(lE, "c:idx", val=str(seriesIndexToDelete))
    ## Add delete 
    _ = SubElement(lE, "c:delete", val="1")