Az adatpontok testreszabása a Treemap és Sunburst diagramokban Pythonban

Áttekintés

A Treemap és a Sunburst diagramok ugyanazt a hierarchikus adat típust jelenítik meg, de különböző elrendezéseket használnak. A Treemap a hierarchiát egymásba ágyazott téglalapokkal ábrázolja, melyek területe a levélértékeket mutatja. A Sunburst koncentrikus gyűrűket használ: a legfelső szintű csoportok a középpont közelében vannak, a levélkategóriák pedig a külső gyűrűben.

Az Aspose.Slides for Python via Java esetén minden numerikus érték egy ChartDataPoint. A ChartDataPoint.getDataPointLevels metódusa hozzáférést biztosít a levélhez és annak szülői csoportjaihoz. Ez a cikk bemutatja ezt a leképezést, és megmutatja, hogyan hozhatók létre és formázhatók mindkét diagramtípus ugyanabból a mintából.

Treemap diagram a Fogyasztó és Üzleti ágazatokkal

Sunburst diagram ugyanazzal a Fogyasztó és Üzleti hierarchiával

Kategóriák, adatpontok és szintek megértése

Az alább látható minta három kategória szintet és egy numerikus sorozatot tartalmaz:

Ágazat Ág Levél Bevétel
Fogyasztó Számítógépek Laptopok 12
Fogyasztó Számítógépek Asztali gépek 8
Fogyasztó Mobil Telefonok 15
Fogyasztó Mobil Táblagépek 6
Üzleti Szolgáltatások Tanácsadás 10
Üzleti Szolgáltatások Támogatás 7
Üzleti Szoftver Licenc 11
Üzleti Szoftver Előfizetések 14

Minden sor egy levélkategóriát és egy adatpontot hoz létre. A kategória csoportosítási szintek leírják az útvonalat a levélről a szülői elemekig. Az első sor esetén az útvonal: Consumer > Computers > Laptops.

Az ChartDataPoint.getDataPointLevels által visszaadott indexek a levélről felfelé haladnak:

getDataPointLevels() index Logikai szint Treemap ábrázolás Sunburst ábrázolás
0 Levél Érték téglalap Külső gyűrű szegmens
1 Ág Szülő téglalap vagy fejléce Középső gyűrű szegmens
2 Ágazat Legfelső szintű téglalap vagy fejléce Belső gyűrű szegmens

Ez a sorrend mindkét diagramtípusnál ugyanaz, még ha a vizuális elrendezés eltér is. Egy szülő szegmenst több levél is megoszt. A formázáshoz használja a csoport első adatpontjának megfelelő szintjét. Például a Consumer ágazat a Laptops ponttal kezdődik, míg a Software ág a Licenses ponttal. Az ilyen pontokra mutató hivatkozások tárolása egyértelműbb és biztonságosabb, mint a data_points.get_Item(0) vagy data_points.get_Item(6) formájú magyarázatlan kifejezések használata.

Mindkét diagramtípus létrehozása és testreszabása

Az alábbi teljes példakód az első dián egy Treemap-et, a második dián egy Sunburst-ot hoz létre. Felépíti a hierarchiát, megjeleníti a Tablets értékét, rögzített színeket alkalmaz a kiválasztott szintekre, formáz egy ágazatcímkét, és elmenti a prezentációt.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ChartType, FillType, ParentLabelLayoutType, Presentation, SaveFormat
from java.awt import Color

presentation = Presentation()
try:
    worksheet_index = 0
    leaf_level_index = 0
    stem_level_index = 1
    branch_level_index = 2

    branch_names = [
        "Consumer", "Consumer", "Consumer", "Consumer",
        "Business", "Business", "Business", "Business"
    ]
    stem_names = [
        "Computers", "Computers", "Mobile", "Mobile",
        "Services", "Services", "Software", "Software"
    ]
    leaf_names = [
        "Laptops", "Desktops", "Phones", "Tablets",
        "Consulting", "Support", "Licenses", "Subscriptions"
    ]
    revenues = [12, 8, 15, 6, 10, 7, 11, 14]
    data_point_count = len(leaf_names)

    chart_types = [ChartType.Treemap, ChartType.Sunburst]
    layout_slide = presentation.getLayoutSlides().get_Item(0)

    for chart_index, chart_type in enumerate(chart_types):
        if chart_index == 0:
            slide = presentation.getSlides().get_Item(0)
        else:
            slide = presentation.getSlides().addEmptySlide(layout_slide)

        chart = slide.getShapes().addChart(chart_type, 40, 40, 640, 440)
        chart.setTitle(False)
        chart.setLegend(False)

        chart_data = chart.getChartData()
        chart_data.getCategories().clear()
        chart_data.getSeries().clear()

        workbook = chart_data.getChartDataWorkbook()
        workbook.clear(worksheet_index)

        # Adja hozzá a levélkategóriákat. Csoportosítási elemet csak akkor állítanak be, amikor új csoport kezdődik;
        # a következő kategóriák ebben a csoportban maradnak, amíg egy másik elem nincs beállítva.
        for data_index in range(data_point_count):
            row_index = data_index + 1
            leaf_name = leaf_names[data_index]
            category_cell = workbook.getCell(worksheet_index, row_index, 2, leaf_name)
            category = chart_data.getCategories().add(category_cell)

            stem_name = stem_names[data_index]
            starts_new_stem = data_index == 0
            if data_index > 0:
                previous_stem_name = stem_names[data_index - 1]
                starts_new_stem = stem_name != previous_stem_name
            if starts_new_stem:
                category.getGroupingLevels().setGroupingItem(stem_level_index, stem_name)

            branch_name = branch_names[data_index]
            starts_new_branch = data_index == 0
            if data_index > 0:
                previous_branch_name = branch_names[data_index - 1]
                starts_new_branch = branch_name != previous_branch_name
            if starts_new_branch:
                category.getGroupingLevels().setGroupingItem(branch_level_index, branch_name)

        series_name_cell = workbook.getCell(worksheet_index, 0, 3, "Revenue")
        series = chart_data.getSeries().add(series_name_cell, chart_type)
        series.getLabels().getDefaultDataLabelFormat().setShowCategoryName(True)

        laptops_data_point = None
        tablets_data_point = None
        licenses_data_point = None

        for data_index in range(data_point_count):
            row_index = data_index + 1
            leaf_name = leaf_names[data_index]
            revenue = revenues[data_index]
            value_cell = workbook.getCell(worksheet_index, row_index, 3, jpype.JDouble(revenue))

            if chart_type == ChartType.Treemap:
                data_point = series.getDataPoints().addDataPointForTreemapSeries(value_cell)
            else:
                data_point = series.getDataPoints().addDataPointForSunburstSeries(value_cell)

            if leaf_name == "Laptops":
                laptops_data_point = data_point
            elif leaf_name == "Tablets":
                tablets_data_point = data_point
            elif leaf_name == "Licenses":
                licenses_data_point = data_point

        # Mutassa a kategóriát és az értéket a Tabletek levélén.
        tablets_leaf_level = tablets_data_point.getDataPointLevels().get_Item(leaf_level_index)
        tablets_label_format = tablets_leaf_level.getLabel().getDataLabelFormat()
        tablets_label_format.setShowCategoryName(True)
        tablets_label_format.setShowValue(True)
        tablets_label_format.setSeparator("\n")
        tablets_label_format.setNumberFormat("$0")

        # Formázza a Consumer ágat az ágon lévő első levél útján.
        consumer_branch_level = laptops_data_point.getDataPointLevels().get_Item(branch_level_index)
        consumer_branch_fill = consumer_branch_level.getFormat().getFill()
        consumer_branch_color = Color(31, 78, 121)
        consumer_branch_fill.setFillType(FillType.Solid)
        consumer_branch_fill.getSolidFillColor().setColor(consumer_branch_color)

        consumer_label_format = consumer_branch_level.getLabel().getDataLabelFormat()
        consumer_label_format.setShowCategoryName(True)
        consumer_label_format.setShowSeriesName(False)
        consumer_label_text_fill = consumer_label_format.getTextFormat().getPortionFormat().getFillFormat()
        consumer_label_text_fill.setFillType(FillType.Solid)
        consumer_label_text_fill.getSolidFillColor().setColor(Color.WHITE)

        # Formázza a Software ágat az ágon lévő első levél útján.
        software_stem_level = licenses_data_point.getDataPointLevels().get_Item(stem_level_index)
        software_stem_fill = software_stem_level.getFormat().getFill()
        software_stem_color = Color(112, 173, 71)
        software_stem_fill.setFillType(FillType.Solid)
        software_stem_fill.getSolidFillColor().setColor(software_stem_color)

        # A ParentLabelLayout befolyásolja a Treemap szülőcímkéket; a Sunburst gyűrűszegmenseket használ.
        if chart_type == ChartType.Treemap:
            series.setParentLabelLayout(ParentLabelLayoutType.Overlapping)

    presentation.save("hierarchical-charts.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

A kategória- és értéktcellák ugyanazt a munkalap sort használják, ezért a gyűjteménypozícióik továbbra is összehangoltak. Ha egy már létező diagramot módosít, először vizsgálja meg a kategória sorokat, és tárolja a formázni kívánt adatpontokra és szintekre mutató neveket.

Viselkedés és gyakorlati megfontolások

Treemap és Sunburst különbségek

  • A Treemap a területet használja az érték, a beágyazott téglalapok pedig a hierarchia közlésére. A ChartSeries.setParentLabelLayout metódus szabályozza, hogyan jelennek meg a szülőcímkék ebben a diagramtípusban.
  • A Sunburst a szöget használja az érték, a gyűrűmélység pedig a hierarchia közlésére. A ChartSeries.setParentLabelLayout nem befolyásolja a gyűrűcímkéket.
  • Mindkét diagramtípus ugyanazt a kategória csoportosítási szintet és ugyanazt a levél‑szülő sorrendet használja, amelyet a ChartDataPoint.getDataPointLevels visszaad, ezért az adatépítő és szint‑formázó kód megosztható.
  • A szülő értékeket a descendant (leszármazott) levelek alapján számítják ki. Ne adjon meg külön numerikus pontot az ágazatokhoz vagy ágakhoz.

Rendezés és szegmens sorrend

A diagram elrendező motorja határozza meg a téglalapok és gyűrűszegmensek végső elhelyezését. Csoportosítsa a kapcsolódó kategória sorokat együtt, mielőtt hozzáadná őket, de ne számítson egy konkrét téglalappozícióra vagy kiindulási szögre. Ha a sorrend jelentéssel bír, tüntesse fel a címkékben, vagy használjon olyan diagramtípust, amely kifejezett kategória‑tengelyt biztosít.

Téma és rögzített színek

A formázatlan diagramszintek az előadás témájától öröklik a színeket. A példa meghatározott RGB kitöltéseket alkalmaz a kiszámítható kimenet érdekében. Ha a diagramnak a téma‑változásokhoz kell igazodnia, használjon séma‑színeket rögzített RGB‑értékek helyett, és kerüljön minden szint felülírását. Ellenőrizze a címke kontrasztját egy ágazat vagy ág kitöltésének módosítása után is.

Címkék és rendelkezésre álló hely

A PowerPoint elrejtheti vagy csonkolhatja a címkéket, ha egy szegmens túl kicsi. A diagram méretének növelése, a kategória nevek rövidítése vagy a megjelenített címkefields számainak csökkentése általában tisztább eredményt ad. Egy címke kombinálhatja a kategória nevét, a sorozat nevét és az értéket a DataLabelFormat segítségével, de minden mező engedélyezése gyakran nehezíti a hierarchikus diagramok olvasását.

Exportálás és renderelés

A PPTX formátumba mentés szerkeszthető diagramot eredményez. Amikor az Aspose.Slides PDF‑re vagy képre rendereli a prezentációt, a támogatott kitöltések és címke‑beállítások a diagram részeként kerülnek megjelenítésre. A betűtípus‑helyettesítés és a rendelkezésre álló elrendezési tér kisebb eltérései megváltoztathatják a sortörést vagy a címke láthatóságát, ezért telepítse a szükséges betűtípusokat, és ellenőrizze a fontos exportcélokat.

Gyakran Ismételt Kérdések

Miért befolyásolja egy szülő szint módosítása több levél pontot?

Egy ágazat vagy ág megosztott vizuális szegmens. A ChartDataPointLevel ezen a szinten egy levél‑leszármazotton keresztül érhető el, de a formázás a megosztott szülő szegmenshez tartozik, nem csak az adott levélhez.

Miért hiányzik egy adatcímke?

Először engedélyezze a szükséges mezőket a címke DataLabelFormat objektumán. Ezután ellenőrizze, hogy a szegmensnek elegendő helye van‑e. A Treemap szülő‑címke‑elrendezés, a diagram mérete, a címke hossza, a betűméret és az engedélyezett mezők száma mind hatással van arra, hogy a címke megjeleníthető‑e.

Beállíthatom a szegmensek pontos sorrendjét vagy koordinátáit?

A forrás‑sorok sorrendjét és a csoportok összevonását irányíthatja, de a pontos Treemap téglalapok vagy Sunburst szögek meghatározása nem lehetséges. Az elrendező motor a hierarchiából, az értékekből és a rendelkezésre álló térből számítja ki ezeket.

Miért változnak a színek a prezentáció téma módosítása után?

A téma‑alapú kitöltések a prezentáció palettájához igazodnak. Alkalmazzon kifejezett RGB színeket azoknál a szinteknél, amelyeknek rögzítve kell maradniuk, vagy használja a séma‑színeket, ha a téma‑váltás preferált.

Megmarad a saját formázás a PDF és képek exportálásakor?

Igen, a támogatott diagram‑kitöltések és címke‑beállítások a renderelés során beépülnek. Az egységes eredmény érdekében biztosítsa a szükséges betűtípusok elérhetőségét, és tesztelje a végső export méretét, mivel a címke‑illesztés a layouttól függ.

Lásd még