Gestionar etiquetas de datos de gráficos en presentaciones usando Python
Introducción
Las etiquetas de datos en un gráfico muestran detalles sobre las series de datos del gráfico o puntos de datos individuales. Permiten a los lectores identificar rápidamente las series de datos y también hacen que los gráficos sean más fáciles de entender.
Establecer la precisión de los datos en las etiquetas de los gráficos
Este código Python le muestra cómo establecer la precisión de los datos en una etiqueta de gráfico:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
presentation = Presentation()
try:
chart = presentation.getSlides().get_Item(0).getShapes().addChart(ChartType.Line, 50, 50, 450, 300)
chart.setDataTable(True)
chart.getChartData().getSeries().get_Item(0).setNumberFormatOfValues("#,##0.00")
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Mostrar porcentaje como etiquetas
Aspose.Slides para Python a través de Java le permite establecer etiquetas de porcentaje en los gráficos mostrados. Este código Python muestra la operación:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Portion, Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.StackedColumn, 20, 20, 400, 400)
chart_series = chart.getChartData().getSeries()
category_totals = [0.0] * chart.getChartData().getCategories().size()
for category_index in range(len(category_totals)):
for series_index in range(chart_series.size()):
data_point = chart_series.get_Item(series_index).getDataPoints().get_Item(category_index)
category_totals[category_index] += float(data_point.getValue().getData())
for series_index in range(chart_series.size()):
series = chart_series.get_Item(series_index)
series.getLabels().getDefaultDataLabelFormat().setShowLegendKey(False)
for point_index in range(series.getDataPoints().size()):
data_point = series.getDataPoints().get_Item(point_index)
label = data_point.getLabel()
if category_totals[point_index] == 0:
print(f"Cannot calculate a percentage for category {point_index}: the total is zero.")
continue
point_percentage = float(data_point.getValue().getData()) / category_totals[point_index] * 100
portion = Portion()
portion.setText(f"{point_percentage:.2f} %")
portion.getPortionFormat().setFontHeight(8)
label.getTextFrameForOverriding().setText("")
paragraph = label.getTextFrameForOverriding().getParagraphs().get_Item(0)
paragraph.getPortions().add(portion)
label_format = label.getDataLabelFormat()
label_format.setShowSeriesName(False)
label_format.setShowPercentage(False)
label_format.setShowLegendKey(False)
label_format.setShowCategoryName(False)
label_format.setShowBubbleSize(False)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Establecer el signo de porcentaje en las etiquetas de datos del gráfico
Este código Python le muestra cómo establecer el signo de porcentaje para una etiqueta de datos del gráfico:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, FillType, Presentation, SaveFormat
Color = jpype.JClass("java.awt.Color")
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.PercentsStackedColumn, 20, 20, 500, 400)
chart.getAxes().getVerticalAxis().setNumberFormatLinkedToSource(False)
chart.getAxes().getVerticalAxis().setNumberFormat("0.00%")
chart.getChartData().getSeries().clear()
worksheet_index = 0
workbook = chart.getChartData().getChartDataWorkbook()
# Añadir la serie roja.
series_cell = workbook.getCell(worksheet_index, 0, 1, "Reds")
red_series = chart.getChartData().getSeries().add(series_cell, chart.getType())
for row_index, value in enumerate([0.30, 0.50, 0.80, 0.65], start=1):
data_cell = workbook.getCell(worksheet_index, row_index, 1, jpype.JDouble(value))
red_series.getDataPoints().addDataPointForBarSeries(data_cell)
red_series.getFormat().getFill().setFillType(FillType.Solid)
red_series.getFormat().getFill().getSolidFillColor().setColor(Color.RED)
red_label_format = red_series.getLabels().getDefaultDataLabelFormat()
red_label_format.setShowValue(True)
red_label_format.setNumberFormatLinkedToSource(False)
red_label_format.setNumberFormat("0.0%")
red_portion_format = red_label_format.getTextFormat().getPortionFormat()
red_portion_format.setFontHeight(10)
red_portion_format.getFillFormat().setFillType(FillType.Solid)
red_portion_format.getFillFormat().getSolidFillColor().setColor(Color.WHITE)
# Añadir la serie azul.
series_cell = workbook.getCell(worksheet_index, 0, 2, "Blues")
blue_series = chart.getChartData().getSeries().add(series_cell, chart.getType())
for row_index, value in enumerate([0.70, 0.50, 0.20, 0.35], start=1):
data_cell = workbook.getCell(worksheet_index, row_index, 2, jpype.JDouble(value))
blue_series.getDataPoints().addDataPointForBarSeries(data_cell)
blue_series.getFormat().getFill().setFillType(FillType.Solid)
blue_series.getFormat().getFill().getSolidFillColor().setColor(Color.BLUE)
blue_label_format = blue_series.getLabels().getDefaultDataLabelFormat()
blue_label_format.setShowValue(True)
blue_label_format.setNumberFormatLinkedToSource(False)
blue_label_format.setNumberFormat("0.0%")
blue_portion_format = blue_label_format.getTextFormat().getPortionFormat()
blue_portion_format.setFontHeight(10)
blue_portion_format.getFillFormat().setFillType(FillType.Solid)
blue_portion_format.getFillFormat().getSolidFillColor().setColor(Color.WHITE)
presentation.save("SetDataLabelsPercentageSign_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Establecer la distancia de la etiqueta desde un eje
Este código Python le muestra cómo establecer la distancia de la etiqueta desde un eje de categorías cuando trabaja con un gráfico trazado a partir de ejes:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 300)
chart.getAxes().getHorizontalAxis().setLabelOffset(500)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Ajustar la ubicación de la etiqueta
Cuando crea un gráfico que no depende de ningún eje, como un gráfico circular, las etiquetas de datos del gráfico pueden quedar demasiado cerca de su borde. En tal caso, debe ajustar la ubicación de la etiqueta de datos para que las líneas de guía se muestren claramente.
Este código Python le muestra cómo ajustar la ubicación de la etiqueta en un gráfico circular:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, LegendDataLabelPosition, Presentation, SaveFormat
presentation = Presentation()
try:
chart = presentation.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 200, 200)
series = chart.getChartData().getSeries()
label = series.get_Item(0).getLabels().get_Item(0)
label.getDataLabelFormat().setShowValue(True)
label.getDataLabelFormat().setPosition(LegendDataLabelPosition.OutsideEnd)
label.setX(0.71)
label.setY(0.04)
presentation.save("pres.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()

Preguntas frecuentes
¿Cómo puedo evitar que las etiquetas de datos se superpongan en gráficos densos?
Combine la colocación automática de etiquetas, líneas de guía y un tamaño de fuente reducido; si es necesario, oculte algunos campos (por ejemplo, la categoría) o muestre etiquetas solo para los puntos extremos o clave.
¿Cómo puedo desactivar las etiquetas solo para valores cero, negativos o vacíos?
Filtre los puntos de datos antes de habilitar las etiquetas y desactive la visualización para valores de 0, valores negativos o valores ausentes según una regla definida.
¿Cómo puedo garantizar un estilo de etiqueta coherente al exportar a PDF/imagenes?
Establezca explícitamente las tipografías (familia, tamaño) y verifique que la fuente esté disponible en el entorno de renderizado para evitar sustituciones.