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

贾斯金

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

在PowerPoint中,选中类别轴选项中的“类别反转”将解决此问题。我搜索了一段时间,但在Python代码中找不到等效属性。任何帮助或建议,不胜感激。

戴维·泽门斯

如@ Boosted_d16所述,该API尚不直接支持此功能。似乎可以使用变通办法轻松完成此任务。首先,我们需要确定底层XML中的差异,然后相应地操作我们的输出XML。

这是BAR_CLUSTERED图表的相关部分,默认为from pptx,这是指其category_axis

  <c:catAx>
    <c:axId val="-2068027336"/>
    <c:scaling>
      <c:orientation val="maxMin"/>
    </c:scaling>

如果我们在PowerPoint应用程序中以相反的顺序手动将其修改为Categories,它将看起来像这样:

  <c:catAx>
    <c:axId val="-2068027336"/>
    <c:scaling>
      <c:orientation val="minMax"/>
    </c:scaling>

因此,唯一的变化就是对/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')

注意:这也将在视觉上影响带有w / r / t“ Crosses At”的图表,并且水平/值轴现在显示在图表的顶部。您需要单独调整此设置。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}')

示例输出:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 matplotlib 中反转条形图上的刻度顺序?

如何在ggplot2中的群集条形图上对齐文本?

gnuplot:如何在群集直方图的条形图上绘制点?

群集条形图上使用的居中svg图像

如何更改此条形图上条形的顺序?

如何知道在amcharts中堆积的条形图上单击了哪个类别?

堆积条形图:如何更改值/类别的顺序?

在python中的条形图上的条形上方添加值

从数据框在Python / matplotlib中的条形图上绘制线图

如何在matplotlib中获取条形图/堆叠条形图上的标签?

Python:如何使用matplotlib在python中绘制条形图?

如何在 echarts-for-react 背景下动态强调条形图上的特定类别

如何在条形图上的条形上方写文本(Python)?

Python PPTX条形图负值

如何更改 R 中堆积条形图的顺序?

如何在 Pandas 堆积条形图中设置类别的顺序

如何在条形图上正确放置条形图

如何使用Python的Matplotlib在条形图上添加显着性水平?

python-如何在条形图上显示值

如何在条形图上添加图例?

如何使条形图上的xAxis匹配pointWidth

如何在条形图上堆叠图标?

如何获取此条形图上的值?

如何在 Python 中使用 subplot 绘制具有变量类别的多个条形图?

条形图上的 Python matlib 文本

如何使用 Seaborn 在 Matplotlib 条形图上配置标题

如何使用seaborn和twinx在条形图上绘制线图

如何使用ggplot2在条形图上放置标签?

使用plotly在条形图上分布值