Přizpůsobení os grafu v prezentacích pomocí Pythonu

Přehled

Tento článek vysvětluje, jak přizpůsobit osy grafu pomocí Aspose.Slides pro Python prostřednictvím Javy. Pokrývá vypočítané hodnoty os, přepínání řádků a sloupců grafu, viditelnost os, intervaly popisků kategorií a značek dělení, datumové kategorie a formátování, rotaci názvu, umístění os a jednotky zobrazení.

Získání maximálních hodnot na svislé ose grafu

Vytvořte Presentation a přidejte plošný graf s výchozími daty. Zavolejte validateChartLayout před načtením vypočítaných hodnot os, aby byl rozvržení grafu aktuální.

Čtěte getActualMaxValue a getActualMinValue pro limity osy a getActualMajorUnit a getActualMinorUnit pro intervaly značek. getActualMajorUnitScale a getActualMinorUnitScale poskytují měřítka časových jednotek, která jsou relevantní pro datumové osy. Příklad ukládá tyto hodnoty do lokálních proměnných a ukládá graf.

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

Prohození dat mezi osami

Použijte switchRowColumn k výměně rolí řad a kategorií v datech grafu. Každá bývalá kategorie se stane řadou a každá bývalá řada se stane kategorií. Tím se změní způsob seskupení dat; neprohazuje to vodorovnou a svislou osu. Příklad používá setRange k přiřazení výchozích dat do Sheet1!A1:D5, včetně řádku záhlaví a sloupce kategorií, před výměnou řádků a sloupců. Uloží graf se čtyřmi řadami a třemi kategoriemi.

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

Zakázání svislé osy pro čárové grafy

Zavolejte setVisible s False na svislé ose, aby byla skryta. Příklad vytváří čárový graf s výchozími daty a ukládá jej se skrytou svislou osou.

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

Zakázání vodorovné osy pro čárové grafy

Zavolejte setVisible s False na vodorovné ose, aby byla skryta. Příklad vytváří čárový graf s výchozími daty a ukládá jej se skrytou vodorovnou osou.

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

Změna osy kategorií

Použijte setCategoryAxisType k výběru datumové nebo textové osy kategorií. Tento příklad vyžaduje ExistingChart.pptx, kde je graf první tvarem na první snímku a buňky kategorií obsahují číselné datumové hodnoty Excelu. Změní vodorovnou osu na datumovou osu. Volání setAutomaticMajorUnit s False, setMajorUnit s 1 a setMajorUnitScale s TimeUnitType.Months umístí hlavní značky v jednomměsíčních intervalech.

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

Řízení intervalů popisků osy kategorií

Když má graf mnoho kategorií, můžete snížit počet viditelných popisků osy, aniž byste odstraňovali kategorie nebo datové body. Zavolejte setAutomaticTickLabelSpacing s False a pak předáte požadovaný interval kategorií do setTickLabelSpacing. Pro textové kategorie v jejich normálním pořadí se číslování začíná od první kategorie:

Interval Popisky zobrazené v příkladu
1 Kategorie 1, Kategorie 2, Kategorie 3, … Kategorie 24
2 Kategorie 1, Kategorie 3, Kategorie 5, … Kategorie 23
3 Kategorie 1, Kategorie 4, Kategorie 7, … Kategorie 22

Interval 3 zobrazí každou třetí značku, mezi zobrazenými značkami zůstane dvě skryté. Neodstraňuje to odpovídající sloupce. Automatické rozestupy vybírají interval na základě dostupného prostoru; nemusí nutně zobrazovat každou značku.

Značky mají samostatné ovládání. Zavolejte setAutomaticTickMarksSpacing s False a použijte setTickMarksSpacing k nastavení jejich intervalu. Například 1 zachová značku na každém intervalu kategorie, zatímco popisky se objeví jen každou třetí kategorii. Použijte setMajorTickMark s viditelným stylem, aby byl výsledek patrný. Opětovné volání libovolného nastavení automatického rozestupu s True nechá graf zvolit tento interval znovu.

Následující samostatný příklad vytvoří 24 kategorií a jednu řadu, pak uloží tři snímky v CategoryAxisIntervals.pptx: automatický rozestup, ruční rozestup popisků s nezávislými značkami a obnovený automatický rozestup. Obě kopie zachovávají původní data grafu. Vstupní prezentace není vyžadována. Vodorovný text popisků usnadňuje pochopit rozdíl v hustotě.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpime.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)

    # Snímek 2: zobrazit každý třetí popisek, ale zachovat značku pro každou kategorii.
    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)

    # Snímek 3: nechat graf znovu zvolit oba intervaly.
    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()

Automatic spacing (slide 1): V tomto zobrazení je každá druhá značka kategorie zobrazena a zalamuje se do dvou řádků. Automatický výsledek se může lišit podle velikosti grafu, písem a vykreslovacího zařízení.

Automatic category label spacing with all 24 columns visible

Manual spacing (slide 2): Každá třetí značka je zobrazena na jednom řádku, zatímco značky zůstávají na každém intervalu kategorie. Všechny 24 sloupců, včetně těch bez popisků, zůstávají viditelné se stejnými hodnotami. Snímek 3 obnovuje automatický vzhled uvedený výše.

Manual category label interval of three with all 24 columns visible

Vyberte správnou osu a interval

Použijte tento interval počtu kategorií pro textovou osu kategorií, například osu kategorií sloupcového, čárového, plošného nebo pruhového grafu. Ve sloupcovém grafu je to vodorovná osa. Ve vodorovném pruhovém grafu je osa kategorií svislá, takže tato nastavení aplikujte na osu vrácenou metodou getVerticalAxis. Rozestup značek se také vztahuje na osu řady v grafech, které ji mají.

Nebude použít rozestup popisků kategorií k nastavení číselného měřítka hodnotové osy. Na hodnotové ose setMajorUnit určuje rozdíl v hodnotách: například hlavní jednotka 10 vytváří značky při 0, 10, 20 atd., když osa začíná nulou. Interval popisků kategorií 3 místo toho počítá pozice kategorií bez ohledu na jejich hodnoty. Rozptýlené a bublinové grafy používají hodnotové osy místo textové osy kategorií. Pro datumovou osu použijte časové jednotky a měřítka popsaná v Změna osy kategorií.

Nastavení formátu data pro hodnoty osy kategorií

Příklad nahrazuje výchozí data grafu čtyřmi ročními hodnotami. Data jsou uložena jako sériová čísla OLE Automation v první listu (index 0), vypočtená jako počet dnů od 30. prosince 1899 pro tyto datumy. Použijte setCategoryAxisType s CategoryAxisType.Date, zavolejte setNumberFormatLinkedToSource s False a předáte yyyy metodě setNumberFormat, aby popisky kategorií zobrazovaly čtyřciferné roky nezávisle na formátování buněk.

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

Nastavení úhlu otočení pro název osy grafu

Zavolejte setTitle s True na svislé ose, zadejte text názvu a nastavte úhel otočení v formátování textového bloku názvu. Úhel se měří ve stupních; tento příklad ukládá sloupcový graf s názvem hodnotové osy otočeným o 90 stupňů.

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

Nastavení pozice osy na ose kategorií nebo hodnoty

Použijte setAxisBetweenCategories k řízení, zda hodnotová osa protíná osu kategorií mezi kategoriemi nebo na značkách kategorie. Toto nastavení platí pro osy kategorií. Příklad nastaví tuto volbu na True na vodorovné ose kategorií sloupcového grafu a výsledek uloží.

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

Nastavení jednotky zobrazení na hodnotové ose grafu

Použijte setDisplayUnit ke škálování popisků na hodnotové ose bez změny podkladových dat. S DisplayUnitType nastaveným na Millions se hodnota 60 000 000 zobrazí jako 60. Příklad vytvoří sloupcový graf a použije jednotku zobrazení milionů na jeho svislé ose.

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

Často kladené otázky

Jak nastavit hodnotu, při které jedna osa protíná druhou (průsečík os)?

Použijte setCrossType k výběru chování průsečíku. Chcete-li zadat číselnou hodnotu průsečíku, použijte setCrossAt. Tato nastavení vám umožní přesunout průsečík osy na vhodnou základnu.

Jak mohu umístit popisky značek vzhledem k ose?

Zavolejte setTickLabelPosition s použitím TickLabelPositionType: Low, High, NextTo nebo None. Pro řízení samotných značek použijte setMajorTickMark nebo setMinorTickMark; jsou to samostatná nastavení od umístění popisků.