Správa datových sérií grafu v prezentacích v .NET
Přehled
Graf ukládá svá vykreslená data do sešitu s daty grafu. IChartSeries představuje jeden soubor souvisejících hodnot a každá IChartDataPoint v sérii odkazuje na jednu nebo více buněk sešitu. Objekty IChartCategory poskytují popisky nebo seskupovací hodnoty sdílené sériemi. Název série, kategorie a hodnoty bodů jsou tedy spojeny s objekty IChartDataCell místo toho, aby byly uloženy jen jako zobrazovaný text.
Pro typický kategoriální graf výchozí sešit používá řádek 0 pro názvy sérií, sloupec 0 pro názvy kategorií a zbývající buňky pro hodnoty sérií. Indexy listu, řádku a sloupce předávané metodě IChartDataWorkbook.GetCell jsou nulové‑založené. Toto uspořádání je užitečné, když vytváříte graf s výchozími daty, ale nepředpokládejte, že ho používá každý existující graf. Pro načtenou prezentaci si před změnou hodnot v sešitu prohlédněte buňky odkazované sériemi, kategoriemi a datovými body.
Nastavení grafu má tři různá rozsahy:
- Nastavení na úrovni série, jako je IChartSeries.Format, poskytuje výchozí vzhled pro všechny body v jedné sérii.
- Nastavení datového bodu, jako je IChartDataPoint.Format, přepíše vzhled série pro jeden bod.
- Nastavení skupiny se vztahuje na kompatibilní série, které patří do stejné IChartSeriesGroup. Přístup ke skupině získáte přes IChartSeries.ParentSeriesGroup, když potřebujete nastavit možnosti jako překrytí nebo šířka mezery.
Když není nastaven explicitní výplň bodu ani série, určuje automatický vzhled styl a motiv grafu. Když jsou přítomny formátování série i bodu, formátování bodu má přednost pro daný bod.

Nastavení překrytí sérií grafu
IChartSeries.Overlap udává, jak moc se překrývají pruhy nebo sloupce ve 2D grafu, v rozmezí od ‑100 % do 100 %. Jedná se o jen‑čtení projekci nastavení na nadřazenou skupinu sérií. Nastavte IChartSeriesGroup.Overlap, aby se aktualizovaly všechny kompatibilní série v této skupině. Tato volba se vztahuje na typy grafů, které zobrazují seskupené pruhy nebo sloupce; neovlivní nesouvisející skupiny sérií v kombinovaném grafu.
Následující příklad nastaví překrytí pro skupinu, která obsahuje první sérii:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const sbyte overlapPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
// Nový graf obsahuje ukázkové série, kategorie a hodnoty.
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.Overlap = overlapPercent;
presentation.Save("series_overlap.pptx", SaveFormat.Pptx);
Výsledek:

Změna barvy výplně série
Použijte IChartSeries.Format, abyste nastavili výchozí výplň pro celou sérii. Pokud má bod již explicitní výplň, jeho nastavení IChartDataPoint.Format přepíše výplň série pro tento bod.
Následující příklad aplikuje jednotnou modrou výplň na první sérii:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = Color.Blue;
presentation.Save("series_color.pptx", SaveFormat.Pptx);
Výsledek:

Změna názvu série
Název série je uložen v sešitu s daty grafu a obvykle se zobrazuje v legendě. Ve výchozím sešitu vytvořeném pro sloupcový graf s seskupením je buňka B1 v řádku 0, sloupci 1 a obsahuje název první série. Pojmenované konstanty v následujícím příkladu tuto strukturu explicitně vyjadřují:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int seriesNameRowIndex = 0;
const int firstSeriesColumnIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var workbook = chart.ChartData.ChartDataWorkbook;
var seriesNameCell = workbook.GetCell(worksheetIndex, seriesNameRowIndex, firstSeriesColumnIndex);
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Můžete také aktualizovat buňku již odkazovanou pomocí IChartSeries.Name. Tento přístup se vyhýbá předpokladu konkrétního řádku a sloupce v existujícím grafu:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int firstNameCellIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var seriesNameCell = series.Name.AsCells[firstNameCellIndex];
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Výsledek:

Vytvoření série s názvem z více buněk
Kompozitní název série je užitečný, když je název produktu a období reportování uloženo v oddělených buňkách sešitu. Například můžete zkombinovat Product A v B1 a 2026 v C1 do jediného názvu série a přitom zachovat oba díly propojené na jejich zdrojové buňky.
Použijte IChartDataWorkbook.GetCellCollection, abyste získali rozsah názvu, a pak předáte tuto kolekci metodě IChartSeriesCollection.Add. Argument skipHiddenCells řídí, zda jsou zahrnuty skryté buňky: true je vyloučí, false zahrne. Tento příklad používá false, aby zahrnul každou buňku v rozsahu názvu.
Následující příklad vytvoří prezentaci s jednou sérií a dvěma datovými body. Buňky B1:C1 poskytují pouze název série; A2:A3 poskytují popisky kategorií a B2:B3 numerické hodnoty.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 620, 180);
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
chart.HasLegend = true;
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
// Tyto dvě buňky dodávají název série.
workbook.GetCell(0, 0, 1, "Product A");
workbook.GetCell(0, 0, 2, "2026");
var nameCells = workbook.GetCellCollection("Sheet1!$B$1:$C$1", skipHiddenCells: false);
var series = chart.ChartData.Series.Add(nameCells, ChartType.ClusteredColumn);
// Samostatné buňky dodávají kategorie a číselné datové body.
var northCategory = workbook.GetCell(0, 1, 0, "North");
var southCategory = workbook.GetCell(0, 2, 0, "South");
chart.ChartData.Categories.Add(northCategory);
chart.ChartData.Categories.Add(southCategory);
var northValue = workbook.GetCell(0, 1, 1, 120);
var southValue = workbook.GetCell(0, 2, 1, 150);
series.DataPoints.AddDataPointForBarSeries(northValue);
series.DataPoints.AddDataPointForBarSeries(southValue);
presentation.Save("composite_series_name.pptx", SaveFormat.Pptx);
Výsledný název série je Product A 2026, s mezerou mezi dvěma hodnotami buněk. Legenda jej zobrazuje jako jednu položku pro oba sloupce. Obrázek níže byl vygenerován ze uložené prezentace:

Získání automatické barvy výplně série
IChartSeries.GetAutomaticSeriesColor vrací barvu vypočtenou z indexu série a stylu grafu. Toto je barva použita, když výplň série není explicitně definována. Volání metody načte vypočtenou barvu; nepřiřadí novou výplň.
Následující příklad vytiskne automatickou barvu každé výchozí série:
using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
const int firstSlideIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var seriesCount = chart.ChartData.Series.Count;
for (var seriesIndex = 0; seriesIndex < seriesCount; seriesIndex++)
{
var series = chart.ChartData.Series[seriesIndex];
var automaticColor = series.GetAutomaticSeriesColor();
Console.WriteLine($"Series {seriesIndex}: {automaticColor.Name}");
}
Ukázkový výstup pro výchozí styl grafu:
Series 0: ff4f81bd
Series 1: ffc0504d
Series 2: ff9bbb59
Přesné barvy závisí na stylu a motivu grafu.
Nastavení inverzní barvy výplně pro sérii grafu
U sérií pruhových, sloupcových a bublinových grafů může IChartSeries.InvertIfNegative zobrazit záporné hodnoty s jinou výplní. Nastavte běžnou výplň série na jednotnou, povolte inverzi a přiřaďte barvu záporné hodnoty pomocí IChartSeries.InvertedSolidFillColor. Záporná čísla zůstávají v sešitu nezměněna; mění se jen jejich zobrazovaná barva.
Následující příklad nahradí výchozí data grafu jednou sérií. List řádku 0 obsahuje název série, sloupec 0 názvy kategorií a sloupec 1 hodnoty:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int headerRowIndex = 0;
const int categoryColumnIndex = 0;
const int firstSeriesColumnIndex = 1;
const int firstDataRowIndex = 1;
var categoryNames = new[] { "Category 1", "Category 2", "Category 3" };
var seriesValues = new[] { -20, 50, -30 };
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(worksheetIndex, headerRowIndex, firstSeriesColumnIndex, "Series 1");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
for (var categoryIndex = 0; categoryIndex < categoryNames.Length; categoryIndex++)
{
var dataRowIndex = firstDataRowIndex + categoryIndex;
var categoryName = categoryNames[categoryIndex];
var seriesValue = seriesValues[categoryIndex];
var categoryCell = workbook.GetCell(worksheetIndex, dataRowIndex, categoryColumnIndex, categoryName);
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(worksheetIndex, dataRowIndex, firstSeriesColumnIndex, seriesValue);
series.DataPoints.AddDataPointForBarSeries(valueCell);
}
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertIfNegative = true;
series.InvertedSolidFillColor.Color = Color.Red;
presentation.Save("inverted_solid_fill_color.pptx", SaveFormat.Pptx);
Výsledek:

Inverzi můžete povolit jen pro jeden bod pomocí IChartDataPoint.InvertIfNegative. V následujícím příkladu je inverze vypnutá pro sérii a zapnutá pouze pro vybraný bod. Bod má také přiřazenou zápornou hodnotu, aby byl efekt viditelný:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 2;
const int negativeValue = -30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertedSolidFillColor.Color = Color.Red;
series.InvertIfNegative = false;
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = negativeValue;
dataPoint.InvertIfNegative = true;
presentation.Save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx);
Vymazání konkrétní hodnoty datového bodu
Aby byl jeden bod prázdný, aniž byste odstranili ostatní body, nastavte jeho buňku v sešitu na null. U sloupcového grafu je vykreslená hodnota dostupná přes IChartDataPoint.YValue. Datový bod zůstává na stejném místě kategorie, ale graf ho podle nastavení prázdných hodnot považuje za prázdný.
Následující příklad vymaže pouze druhý bod v první sérii:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = null;
presentation.Save("clear_data_point_value.pptx", SaveFormat.Pptx);
Rozptylové grafy používají samostatné buňky X a Y a bublinové grafy také buňku velikosti. Vymažte jen buňku, která představuje hodnotu, kterou chcete odstranit. Nevolajte IChartDataPointCollection.Clear, pokud chcete zachovat ostatní body, protože tato metoda odstraní všechny datové body ze sbírky.
Ovládání zobrazení prázdných buněk
Skryté buňky, které obsahují hodnoty, jsou odlišný případ od prázdných buněk. Pro zahrnutí nebo vyloučení dat ze skrytých řádků a sloupců listu viz Include Data from Hidden Rows and Columns.
Prázdná buňka sešitu představuje chybějící data; buňka obsahující 0 představuje známou číselnou hodnotu. Nastavte IChartDataCell.Value na null, aby buňka byla prázdná. Číselná nula zůstává nulou bez ohledu na nastavení prázdných buněk.
Použijte IChart.DisplayBlanksAs, abyste zvolili, jak graf zobrazuje prázdné buňky. Toto nastavení se vztahuje na celý graf. Mění způsob, jakým jsou prázdná místa vykreslena, aniž by se prázdná buňka sešitu vyplňovala nulou nebo interpolovanou hodnotou.
Následující samostatný příklad vytvoří spojnicový graf s jednou sérií, vymaže hodnotu pro den 3 a uloží graf ve všech třech režimech. Vstupní soubor není potřeba. IChartDataWorkbook používá list 0, sloupec 0 pro popisky kategorií a sloupec 1 pro hodnoty; řádek 0 obsahuje název série. Konečná data jsou 10, 20, empty, 30, 40.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.LineWithMarkers, 40, 40, 640, 400);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(0, 0, 1, "Measurements");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
var values = new[] { 10, 20, 25, 30, 40 };
for (var i = 0; i < values.Length; i++)
{
var categoryCell = workbook.GetCell(0, i + 1, 0, $"Day {i + 1}");
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(0, i + 1, 1, values[i]);
series.DataPoints.AddDataPointForLineSeries(valueCell);
}
// Nechte den 3 skutečně prázdný, přičemž zachováte jeho kategorii a datový bod.
workbook.GetCell(0, 3, 1).Value = null;
var modes = new[] { DisplayBlanksAsType.Gap, DisplayBlanksAsType.Zero, DisplayBlanksAsType.Span };
foreach (var mode in modes)
{
chart.DisplayBlanksAs = mode;
presentation.Save($"empty_cells_{mode}.pptx", SaveFormat.Pptx);
}
Každý výstupní soubor ukládá režim přiřazený před uložením: empty_cells_Gap.pptx, empty_cells_Zero.pptx a empty_cells_Span.pptx. Pro uložení jen jedné verze nastavte požadovaný režim a prezentaci uložte jednou místo iterace přes režimy.
Srovnání níže ukazuje stejná data ve všech třech souborech. Den 3 je v sešitu v každém případě prázdný:

Viditelný efekt závisí na typu grafu. Spojnicový graf umožňuje snadno porovnat všechny tři režimy. Pruhové a sloupcové grafy nemají čáru, která by se spojila přes chybějící kategorii, takže Span nemůže vytvořit spojovací úsek zobrazený výše; chybějící sloupec a sloupec s nulovou výškou mohou také vypadat podobně. Podobně rozptylový graf s jen značkami nemá spojovací čáru. Neočekávejte tři odlišné výsledky pro každý typ grafu; zkontrolujte výstup pro typ, který používáte.
Nastavení šířky mezery mezi sériemi
Šířka mezery je prostor mezi sousedními seskupeními pruhů nebo sloupců, vyjádřený jako procento šířky pruhu či sloupce. Stejně jako překrytí patří k nadřazené skupině sérií, nikoli k jedné sérii. Nastavte IChartSeriesGroup.GapWidth jednou pro celou skupinu. Větší hodnota vytvoří více prostoru mezi seskupeními; menší hodnota je učiní hustšími.
Následující příklad změní šířku mezery a uloží pouze finální prezentaci:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int gapWidthPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.StackedColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.GapWidth = gapWidthPercent;
presentation.Save("gap_width_30.pptx", SaveFormat.Pptx);
Výsledek:

Často kladené otázky
Které typy grafů podporují datové série?
Všechny typy grafů reprezentované výčtem ChartType používají data grafu, ale jejich série nemají vždy stejnou strukturu hodnot nebo nastavení. Například kategoriální grafy používají kategorie a hodnoty, rozptylové grafy používají X a Y hodnoty a bublinové grafy přidávají velikosti bublin. Použijte metodu pro vytvoření datového bodu, která odpovídá typu série. Možnosti jako překrytí a šířka mezery platí jen pro kompatibilní pruhové nebo sloupcové skupiny.
Co je skupina sérií grafu?
IChartSeriesGroup obsahuje kompatibilní série, které sdílejí nastavení na úrovni skupiny. Kombinovaný graf může obsahovat více než jednu skupinu, takže změna skupiny dosažená přes jednu sérii nemusí nutně změnit všechny série v grafu.
Obsahuje nově vytvořený graf výchozí data?
Ano. Ve výchozím nastavení IShapeCollection.AddChart vytvoří vzorové série, kategorie a hodnoty. Můžete upravit tyto buňky nebo vymazat jak série, tak kolekce kategorií před přidáním zcela vlastního datového souboru. Existuje přetížení, které může vytvořit graf bez výchozích dat.
Jak jsou objekty grafu spojeny s buňkami sešitu?
Názvy sérií, popisky kategorií a hodnoty datových bodů odkazují na buňky v IChartDataWorkbook. Změna odkazované buňky aktualizuje odpovídající prvek grafu. Při vytváření vlastních dat udržujte řádky kategorií a řádky hodnot sérií zarovnané, aby každý bod byl vykreslen pod zamýšlenou kategorií.
Jak vymazat jeden bod místo celé série?
Nastavte příslušnou buňku hodnoty na null, aby bod zůstal na své pozici kategorie jako prázdný bod. Použijte IChartDataPointCollection.Clear jen tehdy, když chcete odstranit všechny body z dané série. Pokud také odstraňujete kategorie, aktualizujte všechny série, aby jejich hodnoty zůstaly zarovnané s kolekcí kategorií.
Jak jsou prázdné body zobrazovány?
Výsledek závisí na typu grafu a na IChart.DisplayBlanksAs. Podporované grafy mohou zobrazovat mezery jako prázdná místa, jako nuly nebo spojením sousedních bodů. Vyberte nastavení, které odpovídá významu chybějících dat ve vaší prezentaci. Viz Ovládání zobrazení prázdných buněk pro kompletní příklad a vizuální srovnání.
Jak jsou formátovány záporné hodnoty?
U podporovaných pruhových, sloupcových a bublinových sérií povolte IChartSeries.InvertIfNegative a nastavte IChartSeries.InvertedSolidFillColor. Chování můžete přepsat pro jednotlivý bod pomocí IChartDataPoint.InvertIfNegative. Tyto vlastnosti ovlivňují formátování, ne uložené číselné hodnoty.
Které formátování má přednost, když je formátována série i bod?
Explicitní formátování datového bodu má přednost pro tento bod. Ostatní body nadále používají explicitní formátování série nebo, pokud není definováno, automatický styl a motiv grafu. Vlastnosti skupiny, jako překrytí a šířka mezery, řídí rozvržení a nejsou překrytím formátování na úrovni bodu.
Existuje limit počtu sérií, které může graf obsahovat?
Aspose.Slides neklade samostatný pevný limit počtu sérií. V praxi omezují souborové limity prezentace, dostupná paměť, čas renderování a čitelnost grafu.
Co změnit, když jsou sloupce příliš blízko nebo příliš daleko od sebe?
Nastavte IChartSeriesGroup.GapWidth na odpovídající nadřazené skupině sérií. Zvýšením hodnoty rozšíříte prostor mezi seskupeními, snížením jej přiblížíte.