Diagramtengelyek testreszabása prezentációkban Python használatával

Áttekintés

Ez a cikk bemutatja, hogyan lehet testreszabni a diagram tengelyeit az Aspose.Slides for Python via Java segítségével. Tárgyalja a számított tengelyértékeket, a diagram sorainak és oszlopainak felcserélését, a tengely láthatóságát, a kategória címke- és jelöltív távokat, a dátumkategóriákat és formázást, a cím forgatását, a tengely pozícionálását és a megjelenítési egységeket.

A diagram függőleges tengelyének legnagyobb értékeinek lekérése

Hozzon létre egy Prezentáció objektumot, és adjon hozzá egy területdiagramot alapértelmezett adatokkal. Hívja meg a validateChartLayout metódust, mielőtt a számított tengelyértékeket olvasná, hogy a diagram elrendezése naprakész legyen.

Olvassa ki a getActualMaxValue és a getActualMinValue értékeket a tengelyhatárokhoz, valamint a getActualMajorUnit és a getActualMinorUnit értékeket a jelölőtávolságokhoz. A getActualMajorUnitScale és a getActualMinorUnitScale időegység skálákat adnak vissza, amelyek dátumtengelyek esetén relevánsak. A példa ezeket az értékeket helyi változókba menti, majd elmenti a diagramot.

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()

Adatok cseréje a tengelyek között

Használja a switchRowColumn metódust a sorozatok és a kategóriák szerepének felcserélésére a diagram adatainál. Minden korábbi kategória sorozattá, minden korábbi sorozat pedig kategóriává válik. Ez megváltoztatja az adatok csoportosítását; nem cseréli fel a vízszintes és függőleges tengelyeket. A példa a setRange metódust használja, hogy a alapértelmezett adatokat a Sheet1!A1:D5 tartományra kötse, beleértve a fejlécsort és a kategóriaoszlopot, mielőtt a sorokat és oszlopokat felcserélné. Egy négy sorozatos és három kategóriás diagramot ment.

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()

Függőleges tengely letiltása vonaldiagramoknál

Hívja meg a setVisible metódust False értékkel a függőleges tengelyen, hogy elrejtse azt. A példa egy alapértelmezett adatokkal rendelkező vonaldiagramot hoz létre, és a függőleges tengely letiltásával menti el.

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()

Vízszintes tengely letiltása vonaldiagramoknál

Hívja meg a setVisible metódust False értékkel a vízszintes tengelyen, hogy elrejtse azt. A példa egy alapértelmezett adatokkal rendelkező vonaldiagramot hoz létre, és a vízszintes tengely letiltásával menti el.

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()

Kategóriatengely módosítása

Használja a setCategoryAxisType metódust, hogy dátum- vagy szöveges kategóriatengelyt válasszon. Ez a példa az ExistingChart.pptx fájlt igényli, amelyben a diagram az első dián az első alakzat, a kategória cellák numerikus Excel dátumértékeket tartalmaznak. A vízszintes tengelyt dátumtengelyre állítja. A setAutomaticMajorUnit False, a setMajorUnit 1, és a setMajorUnitScale TimeUnitType.Months használata egyhónapos fő jelölőket helyez el.

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()

Kategóriatengely címkeintervallumok szabályozása

Ha egy diagram sok kategóriát tartalmaz, csökkentheti a látható tengelycímkék számát a kategóriák vagy adatpontok eltávolítása nélkül. Hívja meg a setAutomaticTickLabelSpacing metódust False értékkel, majd adja meg a kívánt kategóriaintervallumot a setTickLabelSpacing metódusnak. Szöveges kategóriák esetén a normál sorrendben a számlálás az első kategóriától indul:

Intervallum Példában megjelenített feliratok
1 Kategória 1, Kategória 2, Kategória 3, … Kategória 24
2 Kategória 1, Kategória 3, Kategória 5, … Kategória 23
3 Kategória 1, Kategória 4, Kategória 7, … Kategória 22

A 3 intervallum minden harmadik feliratot jelenít meg, a megjelenő feliratok között két felirat rejtve marad. Nem törli a megfelelő oszlopokat. Az automatikus távolság az elérhető hely alapján választ intervallumot; nem feltétlenül jeleníti meg az összes feliratot.

A jelölőjeleknek külön vezérlői vannak. Hívja meg a setAutomaticTickMarksSpacing False értékkel, és a setTickMarksSpacing metódussal állítsa be az intervallumukat. Például a 1 minden kategóriaintervallumnál hagy egy jelölőt, míg a címkék csak minden harmadik kategórián jelennek meg. Használja a setMajorTickMark látható stílusát, hogy lássa az eredményt. Bármelyik automatikus távolságbeállítót újra True-ra állítva a diagram újra a saját intervallumát választja.

Az alábbi önálló példa 24 kategóriát és egy sorozatot hoz létre, majd három diát ment a CategoryAxisIntervals.pptx fájlba: automatikus távolság, manuális címkeintervallum független jelölőkkel, és visszaállított automatikus távolság. A két másolat az eredeti diagramadatokat tartalmazza. Bemutató fájlra nincs szükség. A vízszintes címkeszöveg könnyen láthatóvá teszi a sűrűség különbségét.

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)

    # Dia 2: minden harmadik feliratot jelenítsen meg, de minden kategóriához hagyjon meg egy jelölőt.
    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)

    # Dia 3: hagyja, hogy a diagram újra mindkét intervallumot kiválassza.
    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()

Automatikus távolság (1. dia): Ebben a megjelenítésben minden második kategóriafelirat látható és két sorba törik. Az automatikus eredmény a diagram méretétől, betűtípusától és a renderertől függően változhat.

Automatikus kategóriacímke-távolság, az összes 24 oszlop látható

Manuális távolság (2. dia): Minden harmadik felirat egy sorban jelenik meg, miközben a jelölőjelek minden kategóriaintervallumnál maradnak. Az összes 24 oszlop, beleértve a címke nélküli oszlopokat is, látható marad ugyanazokkal az értékekkel. A 3. dia visszaállítja a fenti automatikus megjelenést.

Manuális kategóriacímke-intervallum háromra állítva, az összes 24 oszlop látható

A megfelelő tengely és intervallum kiválasztása

Használja ezt a kategóriaszám-intervallumot szöveges kategóriatengelyhez, például oszlop-, vonal-, terület- vagy sávdiagram kategóriatengelyéhez. Oszlopdiagram esetén a vízszintes tengelyről van szó. Vízszintes sávdiagramnál a kategóriatengely függőleges, ezért ezeket a beállításokat a getVerticalAxis által visszaadott tengelyre alkalmazza. A jelölőjel‑intervallum sorozattengelyre is vonatkozik azokban a diagramokban, ahol van ilyen.

Ne használja a kategóriacímke‑intervallumot az értéktengely numerikus skálájának beállítására. Értéktengelyen a setMajorUnit egy értékbeli különbséget határoz meg: például a 10 fő egység 0, 10, 20 stb. jelölőket generál, ha a tengely a nulláról indul. A 3 kategóriacímke‑intervallum a kategóriapozíciókat számolja, adatértékük függetlenül. Szórási és buborékdiagramok értéktengelyt használnak, nem szöveges kategóriatengelyt. Dátumtengely esetén időalapú fő egységeket és skálákat használjon, ahogy a Kategóriatengely módosítása részben leírtuk.

A kategória tengely értékeinek dátumformátumának beállítása

A példa lecseréli a diagram alapértelmezett adatait négy éves értékre. A dátumok az első munkalapon (index 0) OLE Automation sorozatszámokként tárolódnak, amely a 1899. december 30. óta eltelt napok számát jelenti. Használja a setCategoryAxisType metódust a CategoryAxisType.Date értékkel, hívja meg a setNumberFormatLinkedToSource metódust False-ra, és adja meg a yyyy formátumot a setNumberFormat metódusnak, hogy a kategóriacímkék a cellaformázástól függetlenül négy számjegyű évként jelenjenek meg.

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()

Diagramtengely címének forgatási szögének beállítása

Hívja meg a setTitle metódust True értékkel a függőleges tengelyen, adja meg a cím szövegét, és állítsa be a forgatási szöget a cím szövegtömb formázásában. A szög fokokban mérődik; ez a példa egy oszlopdiagramot ment, amelynek értéktengely címe 90 fokkal van elforgatva.

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()

A tengely pozíciójának beállítása kategória- vagy értéktengelyen

Használja a setAxisBetweenCategories metódust, hogy szabályozza, az értéktengely a kategóriatengelyet a kategóriák között vagy a kategória‑jelölőknél metssze-e. Ez a beállítás csak kategóriatengelyekre vonatkozik. A példa a vízszintes kategóriatengelyen True‑ra állítja, majd elmenti az eredményt.

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()

Megjelenítési egység beállítása diagram értéktengelyen

Használja a setDisplayUnit metódust, hogy a értéktengely feliratainak skáláját módosítsa anélkül, hogy az alapadatok változnának. A DisplayUnitType Millions értékével a 60 000 000 érték 60‑ként jelenik meg. A példa egy oszlopdiagramot hoz létre, és a függőleges tengelyen a milliókat jelző egységet alkalmazza.

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()

GYIK

Hogyan állítható be az az érték, ahol egy tengely keresztezi a másikat (tengelykeresztezés)?

Használja a setCrossType metódust a keresztelés viselkedésének kiválasztásához. Numerikus keresztelési érték megadásához használja a setCrossAt metódust. Ezek a beállítások lehetővé teszik a tengelykeresztezés pozíciójának egy megfelelő alapvonalra helyezését.

Hogyan helyezhetők el a jelölőcímkék a tengelyhez viszonyítva?

Hívja meg a setTickLabelPosition metódust a TickLabelPositionType használatával: Low, High, NextTo, vagy None. A jelölőjelek vezérléséhez használja a setMajorTickMark vagy a setMinorTickMark metódusokat; ezek különállóak a címkék pozicionálásától.