Personnaliser les axes de graphique dans les présentations avec Python

Vue d’ensemble

Cet article explique comment personnaliser les axes des graphiques avec Aspose.Slides pour Python via Java. Il couvre les valeurs d’axe calculées, l’échange des lignes et colonnes du graphique, la visibilité des axes, les intervalles des libellés de catégorie et des marques de graduation, les catégories de dates et leur formatage, la rotation du titre, le positionnement des axes et les unités d’affichage.

Obtenir les valeurs maximales sur l’axe vertical d’un graphique

Créez une Présentation et ajoutez un graphique en aires avec des données par défaut. Appelez validateChartLayout avant de lire les valeurs d’axe calculées afin que la disposition du graphique soit à jour.

Lisez getActualMaxValue et getActualMinValue pour les limites de l’axe, ainsi que getActualMajorUnit et getActualMinorUnit pour les intervalles des graduations. getActualMajorUnitScale et getActualMinorUnitScale fournissent des échelles d’unités de temps, pertinentes pour les axes de date. L’exemple stocke ces valeurs dans des variables locales et enregistre le graphique.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.Area, 100, 100, 500, 350)
    chart.validateChartLayout()

    max_value = chart.getAxes().getVerticalAxis().getActualMaxValue()
    min_value = chart.getAxes().getVerticalAxis().getActualMinValue()

    major_unit = chart.getAxes().getVerticalAxis().getActualMajorUnit()
    minor_unit = chart.getAxes().getVerticalAxis().getActualMinorUnit()

    major_unit_scale = chart.getAxes().getVerticalAxis().getActualMajorUnitScale()
    minor_unit_scale = chart.getAxes().getVerticalAxis().getActualMinorUnitScale()

    presentation.save("AxisValues_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Échanger les données entre les axes

Utilisez switchRowColumn pour échanger les rôles des séries et des catégories dans les données du graphique. Chaque ancienne catégorie devient une série, et chaque ancienne série devient une catégorie. Cela modifie la façon dont les données sont groupées ; cela n’échange pas les axes horizontal et vertical. L’exemple utilise setRange pour lier les données par défaut à Sheet1!A1:D5, incluant la ligne d’en-tête et la colonne de catégorie, avant d’échanger les lignes et colonnes. Il enregistre un graphique avec quatre séries et trois catégories.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 100, 100, 400, 300)
    chart.getChartData().setRange("Sheet1!A1:D5")
    chart.getChartData().switchRowColumn()

    presentation.save("SwitchChartRowColumns_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Désactiver l’axe vertical pour les graphiques linéaires

Appelez setVisible avec False sur l’axe vertical pour le masquer. L’exemple crée un graphique en lignes avec des données par défaut et l’enregistre avec l’axe vertical masqué.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.Line, 100, 100, 400, 300)
    chart.getAxes().getVerticalAxis().setVisible(False)

    presentation.save("HiddenVerticalAxis.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Désactiver l’axe horizontal pour les graphiques linéaires

Appelez setVisible avec False sur l’axe horizontal pour le masquer. L’exemple crée un graphique en lignes avec des données par défaut et l’enregistre avec l’axe horizontal masqué.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.Line, 100, 100, 400, 300)
    chart.getAxes().getHorizontalAxis().setVisible(False)

    presentation.save("HiddenHorizontalAxis.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Modifier un axe de catégorie

Utilisez setCategoryAxisType pour choisir un axe de catégorie date ou texte. Cet exemple nécessite ExistingChart.pptx, avec un graphique comme première forme de la première diapositive et des cellules de catégorie contenant des valeurs de date Excel numériques. Il transforme l’axe horizontal en axe de date. En appelant setAutomaticMajorUnit avec False, setMajorUnit avec 1, et setMajorUnitScale avec TimeUnitType.Months, les graduations majeures sont placées à des intervalles d’un mois.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, CategoryAxisType, TimeUnitType

presentation = Presentation("ExistingChart.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().get_Item(0)
    chart.getAxes().getHorizontalAxis().setCategoryAxisType(CategoryAxisType.Date)
    chart.getAxes().getHorizontalAxis().setAutomaticMajorUnit(False)
    chart.getAxes().getHorizontalAxis().setMajorUnit(1)
    chart.getAxes().getHorizontalAxis().setMajorUnitScale(TimeUnitType.Months)

    presentation.save("ChangeChartCategoryAxis_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Contrôler les intervalles des libellés d’axe de catégorie

Lorsqu’un graphique possède de nombreuses catégories, réduisez le nombre de libellés d’axe visibles sans supprimer les catégories ni les points de données. Appelez setAutomaticTickLabelSpacing avec False, puis transmettez l’intervalle de catégorie souhaité à setTickLabelSpacing. Pour des catégories texte dans leur ordre normal, le comptage commence à la première catégorie :

Intervalle Libellés affichés dans l’exemple
1 Catégorie 1, Catégorie 2, Catégorie 3, … Catégorie 24
2 Catégorie 1, Catégorie 3, Catégorie 5, … Catégorie 23
3 Catégorie 1, Catégorie 4, Catégorie 7, … Catégorie 22

Un intervalle de 3 affiche chaque troisième libellé, laissant deux libellés masqués entre les libellés affichés. Cela ne supprime pas les colonnes correspondantes. L’espacement automatique choisit un intervalle en fonction de l’espace disponible ; il n’affiche pas nécessairement chaque libellé.

Les marques de graduation ont des contrôles séparés. Appelez setAutomaticTickMarksSpacing avec False et utilisez setTickMarksSpacing pour définir leur intervalle. Par exemple, 1 conserve une marque de graduation à chaque intervalle de catégorie tandis que les libellés n’apparaissent que toutes les trois catégories. Utilisez setMajorTickMark avec un style visible afin de voir le résultat. Repasser l’un des deux réglages d’espacement automatique à True laisse le graphique choisir à nouveau cet intervalle.

L’exemple autonome suivant crée 24 catégories et une série, puis enregistre trois diapositives dans CategoryAxisIntervals.pptx : espacement automatique, espacement manuel des libellés avec marques de graduation indépendantes, et restauration de l’espacement automatique. Les deux copies conservent les données d’origine du graphique. Aucun fichier de présentation d’entrée n’est requis. Le texte des libellés horizontaux rend la différence de densité facile à voir.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat, CategoryAxisType, TickMarkType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 30, 40, 660, 320)

    chart.setLegend(False)
    chart.getChartData().getCategories().clear()
    chart.getChartData().getSeries().clear()

    workbook = chart.getChartData().getChartDataWorkbook()
    workbook.clear(0)

    series = chart.getChartData().getSeries().add(ChartType.ClusteredColumn)
    for i in range(24):
        category_cell = workbook.getCell(0, i + 1, 0, f"Category {i + 1}")
        chart.getChartData().getCategories().add(category_cell)
        value_cell = workbook.getCell(0, i + 1, 1, float(10 + i % 6 * 5))
        series.getDataPoints().addDataPointForBarSeries(value_cell)

    axis = chart.getAxes().getHorizontalAxis()
    axis.setCategoryAxisType(CategoryAxisType.Text)
    axis.getTextFormat().getTextBlockFormat().setRotationAngle(0)
    axis.getTextFormat().getPortionFormat().setFontHeight(12)
    axis.setMajorTickMark(TickMarkType.Outside)
    axis.setAutomaticTickLabelSpacing(True)
    axis.setAutomaticTickMarksSpacing(True)

    # Diapositive 2 : afficher chaque troisième libellé, mais conserver une marque de graduation pour chaque catégorie.
    manual_slide = presentation.getSlides().addClone(slide)
    manual_chart = manual_slide.getShapes().get_Item(0)
    manual_axis = manual_chart.getAxes().getHorizontalAxis()
    manual_axis.setAutomaticTickLabelSpacing(False)
    manual_axis.setTickLabelSpacing(3)
    manual_axis.setAutomaticTickMarksSpacing(False)
    manual_axis.setTickMarksSpacing(1)

    # Diapositive 3 : laisser le graphique choisir à nouveau les deux intervalles.
    restored_slide = presentation.getSlides().addClone(manual_slide)
    restored_chart = restored_slide.getShapes().get_Item(0)
    restored_chart.getAxes().getHorizontalAxis().setAutomaticTickLabelSpacing(True)
    restored_chart.getAxes().getHorizontalAxis().setAutomaticTickMarksSpacing(True)

    presentation.save("CategoryAxisIntervals.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Espacement automatique (diapositive 1) : dans ce rendu, chaque deuxième libellé de catégorie est affiché et se replie sur deux lignes. Le résultat automatique peut varier selon la taille du graphique, les polices et le rendu.

Espacement automatique des libellés de catégorie avec les 24 colonnes visibles

Espacement manuel (diapositive 2) : chaque troisième libellé est affiché sur une ligne, tandis que les marques de graduation restent à chaque intervalle de catégorie. Les 24 colonnes, y compris celles sans libellé, restent visibles avec les mêmes valeurs. La diapositive 3 restaure l’apparence automatique montrée ci‑dessus.

Intervalle manuel des libellés de catégorie de trois avec les 24 colonnes visibles

Choisir l’axe et l’intervalle corrects

Utilisez cet intervalle de comptage de catégorie pour un axe de catégorie texte, tel que l’axe de catégorie d’un graphique à colonnes, en lignes, en aires ou à barres. Dans un graphique à colonnes, il s’agit de l’axe horizontal. Dans un graphique à barres horizontal, l’axe de catégorie est vertical, ainsi appliquez ces réglages à l’axe retourné par getVerticalAxis. L’espacement des marques de graduation s’applique également à un axe de série dans les graphiques qui en possèdent un.

N’utilisez pas l’espacement des libellés de catégorie pour définir l’échelle numérique d’un axe de valeur. Sur un axe de valeur, setMajorUnit spécifie une différence de valeurs : par exemple, une unité majeure de 10 produit des graduations à 0, 10, 20, etc. lorsqu’un axe démarre à zéro. Un intervalle de libellé de catégorie de 3 compte simplement les positions de catégorie, indépendamment de leurs valeurs de données. Les graphiques à dispersion et à bulles utilisent des axes de valeur plutôt qu’un axe de catégorie texte. Pour un axe de date, utilisez des unités majeures et des échelles basées sur le temps comme décrit dans Modifier un axe de catégorie.

Définir le format de date pour les valeurs d’axe de catégorie

L’exemple remplace les données du graphique par défaut par quatre valeurs annuelles. Les dates sont stockées comme nombres de série OLE Automation dans la première feuille de calcul (index 0), calculées comme le nombre de jours depuis le 30 décembre 1899 pour ces dates. Utilisez setCategoryAxisType avec CategoryAxisType.Date, appelez setNumberFormatLinkedToSource avec False, et transmettez yyyy à setNumberFormat afin que les libellés de catégorie affichent des années à quatre chiffres indépendamment du format de la cellule.

from datetime import date

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat, CategoryAxisType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.Line, 50, 50, 450, 300)

    chart.getChartData().getCategories().clear()
    chart.getChartData().getSeries().clear()

    workbook = chart.getChartData().getChartDataWorkbook()
    workbook.clear(0)

    base_date = date(1899, 12, 30)

    series = chart.getChartData().getSeries().add(ChartType.Line)
    for i in range(4):
        category_date = date(2015 + i, 1, 1)
        category_value = float((category_date - base_date).days)
        category_cell = workbook.getCell(0, i + 1, 0, category_value)
        chart.getChartData().getCategories().add(category_cell)

        value_cell = workbook.getCell(0, i + 1, 1, float(i + 1))
        series.getDataPoints().addDataPointForLineSeries(value_cell)

    chart.getAxes().getHorizontalAxis().setCategoryAxisType(CategoryAxisType.Date)
    chart.getAxes().getHorizontalAxis().setNumberFormatLinkedToSource(False)
    chart.getAxes().getHorizontalAxis().setNumberFormat("yyyy")

    presentation.save("DateAxisFormat.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Définir un angle de rotation pour le titre d’un axe de graphique

Appelez setTitle avec True sur l’axe vertical, fournissez le texte du titre et définissez l’angle de rotation dans le formatage du bloc de texte du titre. L’angle est mesuré en degrés ; cet exemple enregistre un graphique à colonnes avec le titre de l’axe de valeur tourné de 90 degrés.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300)
    chart.getAxes().getVerticalAxis().setTitle(True)
    chart.getAxes().getVerticalAxis().getTitle().addTextFrameForOverriding("Value")
    chart.getAxes().getVerticalAxis().getTitle().getTextFormat().getTextBlockFormat().setRotationAngle(90)

    presentation.save("RotatedAxisTitle.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Définir la position de l’axe sur un axe de catégorie ou de valeur

Utilisez setAxisBetweenCategories pour contrôler si l’axe de valeur croise l’axe de catégorie entre les catégories ou sur les marques de graduation de catégorie. Ce réglage s’applique aux axes de catégorie. L’exemple le définit sur True pour l’axe de catégorie horizontal d’un graphique à colonnes et enregistre le résultat.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300)
    chart.getAxes().getHorizontalAxis().setAxisBetweenCategories(True)

    presentation.save("AxisBetweenCategories.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Définir l’unité d’affichage sur un axe de valeur de graphique

Utilisez setDisplayUnit pour mettre à l’échelle les libellés d’un axe de valeur sans modifier les données sous‑jacentes. Avec DisplayUnitType réglé sur Millions, une valeur de 60 000 000 est affichée comme 60. L’exemple crée un graphique à colonnes et applique l’unité d’affichage “millions” à son axe vertical.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ChartType, SaveFormat, DisplayUnitType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300)
    chart.getAxes().getVerticalAxis().setDisplayUnit(DisplayUnitType.Millions)

    presentation.save("Result.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

FAQ

Comment définir la valeur à laquelle un axe croise l’autre (croisement d’axe) ?

Utilisez setCrossType pour sélectionner le comportement du croisement. Pour spécifier une valeur de croisement numérique, utilisez setCrossAt. Ces réglages vous permettent de déplacer le croisement de l’axe à une ligne de base appropriée.

Comment positionner les libellés de graduation par rapport à l’axe ?

Appelez setTickLabelPosition en utilisant TickLabelPositionType : Low, High, NextTo ou None. Pour contrôler les marques de graduation elles‑mêmes, utilisez setMajorTickMark ou setMinorTickMark ; ils sont séparés du positionnement des libellés.