如何使用Python pptx在PowerPoint中反转聚集条形图上的类别顺序?

如何使用Python pptx在PowerPoint中反转聚集条形图上的类别顺序?,python,powerpoint,python-pptx,Python,Powerpoint,Python Pptx,我正在尝试使用Python pptx生成一个聚集条形图。然而,图表上显示的类别顺序与数据表中的顺序相反 在PowerPoint中,选中“类别轴选项”中的“类别顺序相反”可以解决此问题。我已经搜索了一段时间,但在Python代码中找不到等效的属性。非常感谢您的帮助或建议。目前还不支持此功能 repo上有一张这样的票:正如@Boosted\u d16所指出的,API还没有直接支持此功能。这似乎可以通过使用变通功能来实现。首先,我们需要识别底层XML中的差异,然后相应地操作输出XML 以下是pptx中

我正在尝试使用Python pptx生成一个聚集条形图。然而,图表上显示的类别顺序与数据表中的顺序相反


在PowerPoint中,选中“类别轴选项”中的“类别顺序相反”可以解决此问题。我已经搜索了一段时间,但在Python代码中找不到等效的属性。非常感谢您的帮助或建议。

目前还不支持此功能


repo上有一张这样的票:

正如@Boosted\u d16所指出的,API还没有直接支持此功能。这似乎可以通过使用变通功能来实现。首先,我们需要识别底层XML中的差异,然后相应地操作输出XML

以下是
pptx
中默认的
条形图的相关部分,这是指其
类别轴


如果我们在PowerPoint应用程序中手动将其按相反顺序修改为类别,则会显示如下:


因此,唯一的更改是
/c:scaling/c:orientation[0]
元素,它需要指定一个
“minMax”
值,而不是
“maxMin”
。我们可以通过将对轴的引用传递给辅助函数来实现这一点,如下所示:

def set_reverse_categories(axis):
    """
    workaround function that replicates the "Categories in Reverse Order" UI option in PPT
    """
    ele = axis._element.xpath(r'c:scaling/c:orientation')[0]
    ele.set("val", "maxMin")
示例输出 类别轴反转的图表位于左侧,默认输出位于右侧

示例用法 这个程序将创建一个演示文稿,上面的屏幕截图中有两张幻灯片。请注意,您可能需要更改布局索引

from pptx import Presentation
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
from pandas import DataFrame as DF
p = Presentation()
# Create some data to be used in the chart
series_names = ["A","B","C","D"]
cat_names = ["cat 1"]
data = {
        cat_names[0]: [.10, .20, .30, .40]
        }
df = DF(data, series_names, cat_names)
cd = CategoryChartData()
cd.categories = df.index
for name in df.columns:
    data = df[name]
    cd.add_series(name, data, '0%')

layout = p.slide_layouts[6] # MODIFY AS NEEDED, 6 is the index of my "Blank" slide template.

# Create two charts, one reversed and one not reversed on the Category Axis
for reverse in (True, False):
    slide = p.slides.add_slide( layout )
    shape = slide.shapes.add_chart(XL_CHART_TYPE.BAR_CLUSTERED, 0, 0, 9143301, 6158000, cd) 
    cht = shape.chart
    plot = cht.plots[0]
    plot.has_data_labels = False
    if reverse:
        set_reverse_categories(cht.category_axis)

p.save(r'c:\debug\ppt_chart.pptx')
注意:这也会影响图表的视觉效果,即“交叉在”,水平/值轴现在显示在图表的顶部。你需要单独调整这个。pptx API不直接支持此功能,但也可以通过变通功能实现:

def set_axis_crosses_at(cht, index, position_at):
    """
    cht: chart
    index: string 'value' or 'category' -- which axis to be adjusted
    position_at: 'max, 'autoZero', or int representing category index for Crosses At.
    """
    ns = "{http://schemas.openxmlformats.org/drawingml/2006/chart}"
    axes = {'value': cht.value_axis, 'category': cht.category_axis}
    axis = axes.get(index, None)
    if not axis: 
        return
        # probably should throw error here
    ax_ele = axis._element
    crosses = ax_ele.xpath(r'c:crosses')[0]
    scaling = ax_ele.xpath(r'c:scaling')[0]
    if position_at in ('max', 'autoZero'):
        crosses.set('val', f'{position_at}')
        return
    elif isinstance(position_at, int):
        ax_ele.remove(crosses)
        if len(ax_ele.xpath(r'c:auto')) > 0:
            ax_ele.remove(ax_ele.xpath(r'c:auto')[0])
        # crossesAt:
        if len(ax_ele.xpath(r'c:crossesAt')) == 0:
            crossesAt = etree.SubElement(ax_ele, f'{ns}crossesAt')
        else:
            crossesAt = ax_ele.xpath(r'c:crossesAt')[0]
        crossesAt.set('val', f'{position_at}')
示例输出:

我认为这个功能不存在。你能不能把桌子的顺序颠倒一下?这张票开得不错。FWIW我已经在pptx中开发了大约一年了,我的方法正如您在评论中所建议的:只需颠倒表格的顺序。使用此功能将自动颠倒颜色的顺序,然而,颠倒表格的顺序并不能改变颜色。在PPT中实例化图表数据之前,先颠倒数据的顺序。这样,您就不必担心颜色顺序的颠倒。在条形图上,powerpoint将托盘中的第一种颜色指定在底部,如果您希望第一种颜色位于顶部,该怎么办?将reverse categories设置为true可以实现这一点。在将表格插入图表之前反转表格是不可能的。您只需要单独指定颜色。不幸的是,这是目前实现包的方式。也许有解决办法,让我来玩玩。天哪!我现在就来试试:)这个很好用。谢谢你的详细解释!明亮的非常感谢。嘿@david,如果我想让轴在D条之后,即在末端,我需要在
位置上输入什么值?