Gérer les séries de données de graphiques dans les présentations en Python
Vue d’ensemble
Un graphique stocke ses données tracées dans un classeur de données de graphique. Un ChartSeries représente un ensemble de valeurs liées, et chaque ChartDataPoint de la série fait référence à une ou plusieurs cellules du classeur. Les objets ChartCategory fournissent les libellés ou les valeurs de regroupement partagés par les séries. Le nom de la série, les catégories et les valeurs des points sont donc reliés à des objets ChartDataCell plutôt que stockés uniquement sous forme de texte affiché.
Pour un graphique de type catégorie typique, le classeur par défaut utilise la ligne 0 pour les noms de séries, la colonne 0 pour les noms de catégories, et les cellules restantes pour les valeurs des séries. Les index de feuille, de ligne et de colonne transmis à ChartDataWorkbook.get_cell sont basés sur zéro. Cette disposition est utile lorsque vous créez un graphique avec des données par défaut, mais ne supposez pas que chaque graphique existant l’utilise. Pour une présentation chargée, examinez les cellules référencées par les séries, les catégories et les points de données avant de modifier les valeurs du classeur.
Les paramètres du graphique ont trois portées différentes :
- Paramètres au niveau de la série, tels que ChartSeries.format, fournissent l’apparence par défaut pour tous les points d’une série.
- Paramètres au niveau du point de donnée, tels que ChartDataPoint.format, remplacent l’apparence de la série pour un point.
- Les paramètres de groupe s’appliquent aux séries compatibles qui appartiennent au même ChartSeriesGroup. Accédez au groupe via ChartSeries.parent_series_group lorsque vous devez définir des options telles que le chevauchement ou la largeur d’écart.
Lorsqu’aucun remplissage explicite de point ou de série n’est défini, le style et le thème du graphique déterminent l’apparence automatique. Lorsque les formats de série et de point sont tous deux présents, le format du point prend le pas pour ce point.

Définir le chevauchement des séries du graphique
ChartSeries.overlap indique de combien les barres ou colonnes se chevauchent dans un graphique 2D, de -100 à 100 %. C’est une projection en lecture seule du paramètre du groupe de séries parent. Définissez ChartSeriesGroup.overlap pour mettre à jour toutes les séries compatibles de ce groupe. Cette option s’applique aux types de graphiques affichant des barres ou colonnes groupées ; elle n’affecte pas les groupes de séries non liés dans un graphique combiné.
L’exemple suivant définit le chevauchement pour le groupe contenant la première série :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
overlap_percent = 30
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
# Le nouveau graphique contient des séries d'exemple, des catégories et des valeurs.
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
series.parent_series_group.overlap = overlap_percent
presentation.save("series_overlap.pptx", slides.export.SaveFormat.PPTX)
Le résultat :

Modifier la couleur de remplissage de la série
Utilisez ChartSeries.format pour définir le remplissage par défaut d’une série entière. Si un point possède déjà un remplissage explicite, son paramètre ChartDataPoint.format remplace le remplissage de la série pour ce point.
L’exemple suivant applique un remplissage bleu uni à la première série :
import aspose.pydrawing as drawing
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
series.format.fill.fill_type = slides.FillType.SOLID
series.format.fill.solid_fill_color.color = drawing.Color.blue
presentation.save("series_color.pptx", slides.export.SaveFormat.PPTX)
Le résultat :

Modifier le nom de la série
Le nom d’une série est stocké dans le classeur de données du graphique et apparaît normalement dans la légende. Dans le classeur par défaut créé pour un graphique à colonnes groupées, la cellule B1 se trouve à la ligne 0, colonne 1 et contient le nom de la première série. Les constantes nommées de l’exemple suivant rendent cette structure explicite :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
worksheet_index = 0
series_name_row_index = 0
first_series_column_index = 1
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
workbook = chart.chart_data.chart_data_workbook
series_name_cell = workbook.get_cell(worksheet_index, series_name_row_index, first_series_column_index)
series_name_cell.value = "Revenue"
presentation.save("series_name.pptx", slides.export.SaveFormat.PPTX)
Vous pouvez également mettre à jour la cellule déjà référencée par ChartSeries.name. Cette approche évite de supposer une ligne ou une colonne particulière dans un graphique existant :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
first_name_cell_index = 0
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
series_name_cell = series.name.as_cells[first_name_cell_index]
series_name_cell.value = "Revenue"
presentation.save("series_name.pptx", slides.export.SaveFormat.PPTX)
Le résultat :

Obtenir la couleur de remplissage automatique de la série
ChartSeries.get_automatic_series_color renvoie la couleur calculée à partir de l’indice de la série et du style du graphique. C’est la couleur utilisée lorsque le remplissage de la série n’est pas explicitement défini. L’appel de la méthode lit la couleur calculée ; il n’assigne pas un nouveau remplissage.
L’exemple suivant affiche la couleur automatique de chaque série par défaut :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series_count = len(chart.chart_data.series)
for series_index in range(series_count):
series = chart.chart_data.series[series_index]
automatic_color = series.get_automatic_series_color()
print(f"Series {series_index}: {automatic_color.name}")
Sortie d’exemple pour le style de graphique par défaut :
Series 0: ff4f81bd
Series 1: ffc0504d
Series 2: ff9bbb59
Les couleurs exactes dépendent du style et du thème du graphique.
Définir la couleur de remplissage inversée pour une série du graphique
Pour les séries en barres, colonnes et bulles, ChartSeries.invert_if_negative peut afficher les valeurs négatives avec un remplissage différent. Définissez le remplissage normal de la série sur uni, activez l’inversion, et attribuez la couleur des valeurs négatives via ChartSeries.inverted_solid_fill_color. Les nombres négatifs restent inchangés dans le classeur ; seule leur couleur d’affichage change.
L’exemple suivant remplace les données de graphique par défaut par une série. La ligne 0 de la feuille contient le nom de la série, la colonne 0 les noms de catégories, et la colonne 1 les valeurs :
import aspose.pydrawing as drawing
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
worksheet_index = 0
header_row_index = 0
category_column_index = 0
first_series_column_index = 1
first_data_row_index = 1
category_names = ["Category 1", "Category 2", "Category 3"]
series_values = [-20, 50, -30]
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
chart_data = chart.chart_data
workbook = chart_data.chart_data_workbook
chart_data.series.clear()
chart_data.categories.clear()
series_name_cell = workbook.get_cell(worksheet_index, header_row_index, first_series_column_index, "Series 1")
series = chart_data.series.add(series_name_cell, chart.type)
category_count = len(category_names)
for category_index in range(category_count):
data_row_index = first_data_row_index + category_index
category_name = category_names[category_index]
series_value = series_values[category_index]
category_cell = workbook.get_cell(worksheet_index, data_row_index, category_column_index, category_name)
chart_data.categories.add(category_cell)
value_cell = workbook.get_cell(worksheet_index, data_row_index, first_series_column_index, series_value)
series.data_points.add_data_point_for_bar_series(value_cell)
automatic_series_color = series.get_automatic_series_color()
series.format.fill.fill_type = slides.FillType.SOLID
series.format.fill.solid_fill_color.color = automatic_series_color
series.invert_if_negative = True
series.inverted_solid_fill_color.color = drawing.Color.red
presentation.save("inverted_solid_fill_color.pptx", slides.export.SaveFormat.PPTX)
Le résultat :

Vous pouvez activer l’inversion pour un point via ChartDataPoint.invert_if_negative. Dans l’exemple suivant, l’inversion est désactivée pour la série et activée uniquement pour le point sélectionné. Le point reçoit également une valeur négative afin que l’effet soit visible :
import aspose.pydrawing as drawing
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
target_data_point_index = 2
negative_value = -30
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
automatic_series_color = series.get_automatic_series_color()
series.format.fill.fill_type = slides.FillType.SOLID
series.format.fill.solid_fill_color.color = automatic_series_color
series.inverted_solid_fill_color.color = drawing.Color.red
series.invert_if_negative = False
data_point = series.data_points[target_data_point_index]
data_point.value.as_cell.value = negative_value
data_point.invert_if_negative = True
presentation.save("data_point_invert_color_if_negative.pptx", slides.export.SaveFormat.PPTX)
Effacer la valeur d’un point de donnée spécifique
Pour rendre un point vide sans supprimer les autres points, définissez sa cellule de classeur sous-jacente sur None. Pour un graphique à colonnes, la valeur tracée est disponible via ChartDataPoint.value. Le point de donnée reste à la même position de catégorie, mais le graphique considère sa valeur comme vide selon les paramètres de valeur vide du graphique.
L’exemple suivant efface uniquement le deuxième point de la première série :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
target_data_point_index = 1
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
data_point = series.data_points[target_data_point_index]
data_point.value.as_cell.value = None
presentation.save("clear_data_point_value.pptx", slides.export.SaveFormat.PPTX)
Les graphiques en nuage utilisent des cellules X et Y séparées, et les graphiques à bulles utilisent également une cellule de taille. Effacez uniquement la cellule qui représente la valeur que vous souhaitez supprimer. N’appeler pas ChartDataPointCollection.clear lorsque vous voulez conserver les autres points, car cette méthode supprime tous les points de donnée de la collection.
Contrôler l’affichage des cellules vides
Une cellule de classeur vide représente des données manquantes ; une cellule contenant 0 représente une valeur numérique connue. Définissez ChartDataCell.value sur None pour rendre la cellule vide. Un zéro numérique reste zéro quel que soit le paramètre de cellule vide.
Utilisez Chart.display_blanks_as pour choisir comment le graphique affiche les cellules vides. Ce paramètre s’applique à l’ensemble du graphique. Il modifie la façon dont les vides sont tracés, sans remplir la cellule vide avec zéro ou une valeur interpolée.
L’exemple autonome suivant crée un graphique en courbes avec une série, efface la valeur du Jour 3, et enregistre le même graphique avec chaque mode. Aucun fichier d’entrée n’est requis. Le ChartDataWorkbook utilise la feuille 0, la colonne 0 pour les libellés de catégorie, et la colonne 1 pour les valeurs ; la ligne 0 contient le nom de la série. Les données finales sont 10, 20, empty, 30, 40.
import aspose.slides as slides
import aspose.slides.charts as charts
with slides.Presentation() as presentation:
slide = presentation.slides[0]
chart = slide.shapes.add_chart(charts.ChartType.LINE_WITH_MARKERS, 40, 40, 640, 400)
chart_data = chart.chart_data
workbook = chart_data.chart_data_workbook
chart_data.series.clear()
chart_data.categories.clear()
series_name_cell = workbook.get_cell(0, 0, 1, "Measurements")
series = chart_data.series.add(series_name_cell, chart.type)
values = [10, 20, 25, 30, 40]
for i, value in enumerate(values):
category_cell = workbook.get_cell(0, i + 1, 0, f"Day {i + 1}")
chart_data.categories.add(category_cell)
value_cell = workbook.get_cell(0, i + 1, 1, value)
series.data_points.add_data_point_for_line_series(value_cell)
# Laisser le jour 3 réellement vide, tout en conservant sa catégorie et son point de donnée.
workbook.get_cell(0, 3, 1).value = None
modes = [("Gap", charts.DisplayBlanksAsType.GAP), ("Zero", charts.DisplayBlanksAsType.ZERO), ("Span", charts.DisplayBlanksAsType.SPAN)]
for mode_name, mode in modes:
chart.display_blanks_as = mode
presentation.save(f"empty_cells_{mode_name}.pptx", slides.export.SaveFormat.PPTX)
Chaque fichier de sortie stocke le mode assigné avant l’enregistrement : empty_cells_Gap.pptx, empty_cells_Zero.pptx et empty_cells_Span.pptx. Pour n’enregistrer qu’une version, assignez le mode souhaité et enregistrez la présentation une seule fois au lieu d’itérer sur les modes.
La comparaison ci‑dessous montre les mêmes données dans les trois fichiers. Le Jour 3 est vide dans le classeur dans chaque cas :

L’effet visible dépend du type de graphique. Un graphique en courbes rend les trois modes faciles à comparer. Les graphiques à barres et à colonnes n’ont pas de ligne à connecter à travers une catégorie manquante, de sorte que SPAN ne peut pas produire le segment de connexion montré ci‑dessus ; une colonne manquante et une colonne de hauteur zéro peuvent également se ressembler. De même, un nuage de points avec uniquement des marqueurs n’a pas de ligne de connexion. N’attendez pas trois résultats distincts pour chaque type de graphique ; vérifiez le résultat pour le type que vous utilisez.
Définir la largeur d’écart des séries
La largeur d’écart est l’espace entre les clusters de barres ou de colonnes adjacents, exprimé en pourcentage de la largeur de la barre ou de la colonne. Comme le chevauchement, elle appartient au groupe de séries parent plutôt qu’à une série individuelle. Définissez ChartSeriesGroup.gap_width une fois pour le groupe. Une valeur plus grande crée plus d’espace entre les clusters ; une valeur plus petite les rend plus denses.
L’exemple suivant modifie la largeur d’écart et enregistre uniquement la présentation finale :
import aspose.slides as slides
import aspose.slides.charts as charts
first_slide_index = 0
first_series_index = 0
gap_width_percent = 30
with slides.Presentation() as presentation:
slide = presentation.slides[first_slide_index]
chart = slide.shapes.add_chart(charts.ChartType.STACKED_COLUMN, 20, 20, 500, 200)
series = chart.chart_data.series[first_series_index]
series.parent_series_group.gap_width = gap_width_percent
presentation.save("gap_width_30.pptx", slides.export.SaveFormat.PPTX)
Le résultat :

FAQ
Quels types de graphiques prennent en charge les séries de données ?
Tous les types de graphiques représentés par l’énumération ChartType utilisent des données de graphique, mais leurs séries n’ont pas toutes la même structure de valeurs ou les mêmes paramètres. Par exemple, les graphiques de catégorie utilisent des catégories et des valeurs, les graphiques nuage utilisent des valeurs X et Y, et les graphiques à bulles ajoutent des tailles de bulle. Utilisez la méthode de création de point de donnée correspondant au type de série. Les options telles que le chevauchement et la largeur d’écart ne s’appliquent qu’aux groupes de barres ou de colonnes compatibles.
Qu’est‑ce qu’un groupe de séries de graphique ?
Un ChartSeriesGroup contient des séries compatibles qui partagent des paramètres de tracé au niveau du groupe. Un graphique combiné peut contenir plusieurs groupes, de sorte que la modification du groupe atteinte via une série ne change pas nécessairement toutes les séries du graphique.
Un graphique nouvellement créé contient‑il des données par défaut ?
Oui. Par défaut, ShapeCollection.add_chart crée des séries, des catégories et des valeurs d’exemple. Vous pouvez modifier ces cellules ou effacer les collections de séries et de catégories avant d’ajouter un jeu de données complètement personnalisé. Une surcharge peut également créer un graphique sans données par défaut.
Comment les objets de graphique sont‑ils reliés aux cellules du classeur ?
Les noms de séries, les libellés de catégorie et les valeurs des points de donnée référencent des cellules d’un ChartDataWorkbook. Modifier une cellule référencée met à jour l’élément de graphique correspondant. Lorsque vous créez des données personnalisées, maintenez les lignes de catégories et les lignes de valeurs de séries alignées afin que chaque point soit tracé sous la catégorie prévue.
Comment effacer un point au lieu de toute la série ?
Définissez la cellule de valeur concernée sur None pour conserver la position de catégorie du point comme point vide. Utilisez ChartDataPointCollection.clear uniquement lorsque vous avez l’intention de supprimer tous les points de cette série. Si vous supprimez également des catégories, mettez à jour chaque série afin que leurs valeurs restent alignées avec la collection de catégories.
Comment les points vides sont‑ils affichés ?
Le résultat dépend du type de graphique et de Chart.display_blanks_as. Les graphiques pris en charge peuvent afficher les vides comme des écarts, comme des valeurs zéro, ou en reliant les points voisins. Choisissez le paramètre qui correspond à la signification des données manquantes dans votre présentation. Consultez Contrôler l’affichage des cellules vides pour un exemple complet et une comparaison visuelle.
Comment les valeurs négatives sont‑elles formatées ?
Pour les séries de barres, colonnes et bulles prises en charge, activez ChartSeries.invert_if_negative et définissez ChartSeries.inverted_solid_fill_color. Vous pouvez remplacer le comportement pour un point individuel avec ChartDataPoint.invert_if_negative. Ces propriétés affectent le formatage, pas les valeurs numériques stockées.
Quel format l’emporte lorsque la série et le point sont tous deux formatés ?
Le formatage explicite du point de donnée l’emporte pour ce point. Les autres points continuent d’utiliser le format de série explicite ou, si le format de série n’est pas défini, le style et le thème automatiques du graphique. Les propriétés de groupe telles que le chevauchement et la largeur d’écart contrôlent la disposition et ne sont pas des remplacements de formatage au niveau du point.
Existe‑t‑il une limite au nombre de séries qu’un graphique peut contenir ?
Aspose.Slides n’impose pas de limite fixe distincte du nombre de séries. En pratique, les contraintes du fichier de présentation, la mémoire disponible, le temps de rendu et la lisibilité du graphique déterminent une limite utile.
Que faut‑il modifier lorsque les colonnes sont trop rapprochées ou trop espacées ?
Définissez ChartSeriesGroup.gap_width sur le groupe de séries parent approprié. Augmentez la valeur pour élargir l’espace entre les clusters, ou diminuez‑la pour rapprocher les clusters.