在python-pptx中隐藏图表系列

时间:2019-02-13 11:53:44

标签: python-pptx

如何使用python-pptx创建一个由多个数据系列填充的新图表,但只能在图表上显示这些系列中的一些数据?其他系列应在图表的背景数据中,但在显示幻灯片时不可见(有关说明,请参见图1)。

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

我的目的是针对同一张幻灯片进行多种类型的测量(百分比,绝对值,索引)。首先,我只想在图表上显示百分比值。如果图表看起来不太好,我希望能够右键单击图表并选择要显示其他度量的其他列(参见图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)

2 个答案:

答案 0 :(得分:0)

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

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

答案 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 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")