Zarządzaj etykietami danych wykresu w prezentacjach przy użyciu JavaScript
Wprowadzenie
Etykiety danych wyświetlają informacje o seriach wykresu i pojedynczych punktach danych, pomagając czytelnym zidentyfikować wartości i zrozumieć wykres. Ten artykuł wyjaśnia, jak formatować wartości, wyświetlać procenty, odczytywać tekst etykiety, kontrolować etykiety poza maksymalnym zakresem osi, regulować odstępy etykiet osi kategorii oraz pozycjonować etykiety wykresów kołowych.
Ustaw precyzję danych w etykietach danych wykresu
Użyj setNumberFormatOfValues, aby sformatować wartości serii. Ten przykład tworzy wykres liniowy z domyślnymi danymi, wyświetla jego tabelę danych i włącza etykiety wartości dla pierwszej serii. Format #,##0.00 wyświetla separator tysięcy oraz dwie miejsca po przecinku, nie zmieniając wartości bazowych.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Line, 50, 50, 450, 300);
chart.setDataTable(true);
const series = chart.getChartData().getSeries().get_Item(0);
series.setNumberFormatOfValues("#,##0.00");
series.getLabels().getDefaultDataLabelFormat().setShowValue(true);
presentation.save("PrecisionOfDatalabels_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Wyświetl procent jako etykiety
Dla wykresu słupkowego skumulowanego oblicz każdą wartość jako procent całkowitej sumy jej kategorii i przypisz tekst do ramki tekstowej zwróconej przez getTextFrameForOverriding. Ten przykład używa domyślnych danych wykresu i wyświetla procenty z dwoma miejscami po przecinku w czcionce 8‑punktowej. Kategorie o sumie zerowej są pomijane, aby uniknąć dzielenia przez zero. Przelicz ponownie niestandardowy tekst etykiety, jeśli dane wykresu ulegną zmianie.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.StackedColumn, 20, 20, 400, 400);
const categoryTotals = new Array(chart.getChartData().getCategories().size()).fill(0);
for (let k = 0; k < chart.getChartData().getCategories().size(); k++) {
for (let i = 0; i < chart.getChartData().getSeries().size(); i++) {
const series = chart.getChartData().getSeries().get_Item(i);
const pointValue = series.getDataPoints().get_Item(k).getValue().getData();
categoryTotals[k] += Number(pointValue);
}
}
for (let x = 0; x < chart.getChartData().getSeries().size(); x++) {
const series = chart.getChartData().getSeries().get_Item(x);
series.getLabels().getDefaultDataLabelFormat().setShowLegendKey(false);
for (let j = 0; j < series.getDataPoints().size(); j++) {
const label = series.getDataPoints().get_Item(j).getLabel();
if (categoryTotals[j] == 0) {
continue;
}
const pointValue = series.getDataPoints().get_Item(j).getValue().getData();
const dataPointPercent = (Number(pointValue) / categoryTotals[j]) * 100;
const portion = new aspose.slides.Portion();
portion.setText(dataPointPercent.toFixed(2) + " %");
portion.getPortionFormat().setFontHeight(8);
label.getTextFrameForOverriding().setText("");
const paragraph = label.getTextFrameForOverriding().getParagraphs().get_Item(0);
paragraph.getPortions().add(portion);
label.getDataLabelFormat().setShowValue(true);
label.getDataLabelFormat().setShowSeriesName(false);
label.getDataLabelFormat().setShowPercentage(false);
label.getDataLabelFormat().setShowLegendKey(false);
label.getDataLabelFormat().setShowCategoryName(false);
label.getDataLabelFormat().setShowBubbleSize(false);
}
}
presentation.save("DisplayPercentageAsLabels_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Ustaw znak procenta w etykietach danych wykresu
Gdy wartości są przechowywane jako ułamki, użyj setNumberFormat, aby wyświetlić procenty. Przekaż false do setNumberFormatLinkedToSource, aby zastosować format etykiety niezależnie od komórek źródłowych.
Ten przykład tworzy wykres słupkowy skumulowany 100% z serią czerwoną i niebieską w czterech kategoriach. Każda para wartości sumuje się do 1. Format etykiety 0.0% wyświetla 0,30 jako 30,0%, podczas gdy oś pionowa używa dwóch miejsc po przecinku. Obie serie używają białego tekstu etykiety o rozmiarze 10 punktów.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.PercentsStackedColumn, 20, 20, 500, 400);
chart.getAxes().getVerticalAxis().setNumberFormatLinkedToSource(false);
chart.getAxes().getVerticalAxis().setNumberFormat("0.00%");
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
const workbook = chart.getChartData().getChartDataWorkbook();
const worksheetIndex = 0;
for (let i = 0; i < 4; i++) {
const categoryCell = workbook.getCell(worksheetIndex, i + 1, 0, "Category " + (i + 1));
chart.getChartData().getCategories().add(categoryCell);
}
const seriesNames = ["Reds", "Blues"];
const white = java.getStaticFieldValue("java.awt.Color", "WHITE");
const seriesColors = [java.getStaticFieldValue("java.awt.Color", "RED"), java.getStaticFieldValue("java.awt.Color", "BLUE")];
const values = [[0.30, 0.50, 0.80, 0.65], [0.70, 0.50, 0.20, 0.35]];
for (let i = 0; i < seriesNames.length; i++) {
const seriesCell = workbook.getCell(worksheetIndex, 0, i + 1, seriesNames[i]);
const series = chart.getChartData().getSeries().add(seriesCell, chart.getType());
for (let j = 0; j < 4; j++) {
const valueCell = workbook.getCell(worksheetIndex, j + 1, i + 1, values[i][j]);
series.getDataPoints().addDataPointForBarSeries(valueCell);
}
series.getFormat().getFill().setFillType(java.newByte(aspose.slides.FillType.Solid));
series.getFormat().getFill().getSolidFillColor().setColor(seriesColors[i]);
const labelFormat = series.getLabels().getDefaultDataLabelFormat();
labelFormat.setShowValue(true);
labelFormat.setNumberFormatLinkedToSource(false);
labelFormat.setNumberFormat("0.0%");
labelFormat.getTextFormat().getPortionFormat().setFontHeight(10);
labelFormat.getTextFormat().getPortionFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
labelFormat.getTextFormat().getPortionFormat().getFillFormat().getSolidFillColor().setColor(white);
}
presentation.save("SetDataLabelsPercentageSign_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Odczytaj rzeczywisty tekst etykiet danych
Użyj getActualLabelText, aby pobrać tekst wygenerowany na podstawie ustawień etykiety danych. Jest to przydatne przy wyodrębnianiu etykiet do raportów, przeszukiwaniu zawartości prezentacji lub weryfikacji wygenerowanych wykresów. W poniższym przykładzie domyślny format etykiet danych łączy nazwę każdej kategorii, nazwę serii oraz wartość. Jeden punkt formatuje swoją wartość jako procent, a inny używa niestandardowego tekstu z getTextFrameForOverriding.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.ClusteredColumn, 20, 20, 500, 300);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
const workbook = chart.getChartData().getChartDataWorkbook();
const firstCategoryCell = workbook.getCell(0, 1, 0, "Q1");
chart.getChartData().getCategories().add(firstCategoryCell);
const secondCategoryCell = workbook.getCell(0, 2, 0, "Q2");
chart.getChartData().getCategories().add(secondCategoryCell);
const northSeriesCell = workbook.getCell(0, 0, 1, "North");
const north = chart.getChartData().getSeries().add(northSeriesCell, chart.getType());
const northFirstValueCell = workbook.getCell(0, 1, 1, 0.25);
north.getDataPoints().addDataPointForBarSeries(northFirstValueCell);
const northSecondValueCell = workbook.getCell(0, 2, 1, 0.75);
north.getDataPoints().addDataPointForBarSeries(northSecondValueCell);
const southSeriesCell = workbook.getCell(0, 0, 2, "South");
const south = chart.getChartData().getSeries().add(southSeriesCell, chart.getType());
const southFirstValueCell = workbook.getCell(0, 1, 2, 0.40);
south.getDataPoints().addDataPointForBarSeries(southFirstValueCell);
const southSecondValueCell = workbook.getCell(0, 2, 2, 0.60);
south.getDataPoints().addDataPointForBarSeries(southSecondValueCell);
for (let i = 0; i < chart.getChartData().getSeries().size(); i++) {
const series = chart.getChartData().getSeries().get_Item(i);
const format = series.getLabels().getDefaultDataLabelFormat();
format.setShowCategoryName(true);
format.setShowSeriesName(true);
format.setShowValue(true);
}
north.getLabels().get_Item(1).getDataLabelFormat().setNumberFormatLinkedToSource(false);
north.getLabels().get_Item(1).getDataLabelFormat().setNumberFormat("0%");
south.getLabels().get_Item(0).getTextFrameForOverriding().setText("Reviewed");
for (let i = 0; i < chart.getChartData().getSeries().size(); i++) {
const series = chart.getChartData().getSeries().get_Item(i);
for (let j = 0; j < series.getDataPoints().size(); j++) {
const point = series.getDataPoints().get_Item(j);
const label = point.getLabel();
if (!label.isVisible()) {
continue;
}
console.log("Value: " + point.getValue().getData() + "; label: " + label.getActualLabelText());
}
}
} finally {
presentation.dispose();
}
Liczba przechowywana w punkcie danych pozostaje 0.75, nawet jeśli jego etykieta wyświetla 75% wraz z nazwą kategorii i serii. Niestandardowy tekst zastępuje wygenerowany tekst etykiety. getActualLabelText zwraca wynikowy ciąg etykiety w obu przypadkach. Sprawdź isVisible osobno, jak pokazano powyżej, gdy chcesz wyodrębnić tylko widoczne etykiety.
Kontroluj etykiety danych poza maksymalnym zakresem osi
Gdy ograniczasz zakres osi ręcznie, niektóre punkty danych mogą przekraczać jej maksymalną wartość. Użyj setShowDataLabelsOverMaximum, aby kontrolować, czy ich etykiety danych są wyświetlane. To ustawienie zmienia widoczność etykiet; nie zmienia zakresu osi ani wartości bazowych danych.
Poniższy przykład tworzy dwuwymiarowy wykres słupkowy zgrupowany z wartościami 60 i 120. Przekazuje false do setAutomaticMaxValue i ustawia maksymalną wartość na 100 za pomocą setMaxValue na osi pionowej. Na pierwszym slajdzie etykiety są dopuszczone poza maksimum; kopia tego slajdu wyłącza je. Oba slajdy są zapisane w pliku DataLabelsOverMaximum.pptx.
Włącz etykiety wartości za pomocą setShowValue. Ustawienie na poziomie wykresu nie włącza wyświetlania wartości samo w sobie ani nie nadpisuje wyłączonego wyświetlania wartości w pojedynczej etykiecie. Ten przykład włącza wartości dla całej serii i używa setPosition, aby umieścić etykiety na zewnętrznej końcówce każdego słupka.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.ClusteredColumn, 50, 50, 600, 400);
chart.setLegend(false);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
const workbook = chart.getChartData().getChartDataWorkbook();
const firstCategory = workbook.getCell(0, 1, 0, "Within range");
const secondCategory = workbook.getCell(0, 2, 0, "Above maximum");
chart.getChartData().getCategories().add(firstCategory);
chart.getChartData().getCategories().add(secondCategory);
const seriesName = workbook.getCell(0, 0, 1, "Values");
const series = chart.getChartData().getSeries().add(seriesName, chart.getType());
const firstValue = workbook.getCell(0, 1, 1, 60);
const secondValue = workbook.getCell(0, 2, 1, 120);
series.getDataPoints().addDataPointForBarSeries(firstValue);
series.getDataPoints().addDataPointForBarSeries(secondValue);
series.getLabels().getDefaultDataLabelFormat().setShowValue(true);
series.getLabels().getDefaultDataLabelFormat().setPosition(aspose.slides.LegendDataLabelPosition.OutsideEnd);
chart.getAxes().getVerticalAxis().setAutomaticMaxValue(false);
chart.getAxes().getVerticalAxis().setMaxValue(100);
chart.setShowDataLabelsOverMaximum(true);
const secondSlide = presentation.getSlides().addClone(slide);
const secondChart = secondSlide.getShapes().get_Item(0);
secondChart.setShowDataLabelsOverMaximum(false);
presentation.save("DataLabelsOverMaximum.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Poniższe obrazy przedstawiają zapisane slajdy renderowane w programie Microsoft PowerPoint. Przy ustawieniu true etykieta 120 jest widoczna na górnej granicy; przy false jest ukryta. Etykieta 60 pozostaje widoczna, maksymalna wartość osi pozostaje 100, a drugi punkt danych pozostaje 120 w obu przypadkach.
| setShowDataLabelsOverMaximum(true) | setShowDataLabelsOverMaximum(false) |
|---|---|
![]() |
![]() |
Chart Type
Ten przykład używa dwuwymiarowego wykresu słupkowego z osią wartości. Wykresy bez osi wartości, takie jak wykresy kołowe i pierścieniowe, nie posiadają maksymalnej wartości osi, którą można w ten sposób ograniczyć.Ustaw odległość etykiety od osi
Użyj setLabelOffset, aby kontrolować odległość między etykietami osi kategorii a samą osią. Wartość jest wyrażona jako procent maksymalnego rozmiaru czcionki etykiet osi. Ten przykład tworzy wykres słupkowy zgrupowany i ustawia offset etykiet osi poziomej na 500. To ustawienie wpływa na etykiety osi kategorii, a nie na etykiety przypisane do poszczególnych punktów danych.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.ClusteredColumn, 20, 20, 500, 300);
chart.getAxes().getHorizontalAxis().setLabelOffset(500);
presentation.save("SetCategoryAxisLabelDistance_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Dostosuj położenie etykiety
W wykresie kołowym dostosuj pozycje etykiet danych, aby poprawić rozmieszczenie i zrobić miejsce na linie pomocnicze.
Ten przykład wyświetla wartość pierwszego punktu danych, umieszcza jego etykietę poza fragmentem i dostosowuje poziomy oraz pionowy offset przy użyciu setX i setY. Te offsety są względne względem szerokości i wysokości wykresu, odpowiednio.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 200, 200);
const series = chart.getChartData().getSeries();
const label = series.get_Item(0).getLabels().get_Item(0);
label.getDataLabelFormat().setShowValue(true);
label.getDataLabelFormat().setPosition(aspose.slides.LegendDataLabelPosition.OutsideEnd);
label.setX(java.newFloat(0.71));
label.setY(java.newFloat(0.04));
presentation.save("presentation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}

FAQ
Jak mogę zapobiec nakładaniu się etykiet danych na gęstych wykresach?
Połącz automatyczne rozmieszczanie etykiet, linie pomocnicze i zmniejszenie rozmiaru czcionki; w razie potrzeby ukryj niektóre pola (na przykład kategorię) lub wyświetlaj etykiety tylko dla wartości skrajnych lub kluczowych punktów.
Jak mogę wyłączyć etykiety tylko dla wartości zerowych, ujemnych lub pustych?
Przefiltruj punkty danych przed włączeniem etykiet i wyłącz wyświetlanie dla wartości równych 0, wartości ujemnych lub brakujących, zgodnie z określoną regułą.
Jak zapewnić spójny styl etykiet przy eksportowaniu do PDF/obrazów?
Jawnie ustaw rodzinę i rozmiar czcionki oraz sprawdź, czy czcionka jest dostępna w środowisku renderującym, aby uniknąć zastępowania.

