ปรับแต่งจุดข้อมูลในแผนภูมิ Treemap และ Sunburst ด้วย Python

ภาพรวม

Treemap และ Sunburst แสดงข้อมูลเชิงลำดับชั้นในรูปแบบเดียวกัน แต่ใช้การจัดวางที่แตกต่างกัน Treemap วาดโครงสร้างเป็นสี่เหลี่ยมซ้อนกันโดยพื้นที่ของแต่ละสี่เหลี่ยมแทนค่าของใบข้อมูล Sunburst วาดเป็นวงวงศ์ศูนย์: กลุ่มระดับบนจะอยู่ใกล้ศูนย์กลาง และหมวดหมู่ใบจะอยู่บนวงนอก

ใน Aspose.Slides for Python via Java ค่าตัวเลขแต่ละค่าจะเป็น ChartDataPoint. วิธีการ ChartDataPoint.getDataPointLevels ให้เข้าถึงใบข้อมูลและกลุ่มพ่อแม่ของมัน บทความนี้อธิบายการแมปเหล่านั้นและแสดงวิธีสร้างและจัดรูปแบบแผนภูมิทั้งสองประเภทจากข้อมูลตัวอย่างเดียวกัน

แผนภูมิ Treemap ที่มีสาขา Consumer และ Business

แผนภูมิ Sunburst ที่มีโครงสร้างลำดับชั้น Consumer และ Business เดียวกัน

ทำความเข้าใจหมวดหมู่, จุดข้อมูล, และระดับ

ตัวอย่างที่ใช้ด้านล่างมีระดับหมวดหมู่สามระดับและชุดตัวเลขหนึ่งชุด:

สาขา ส่วน ใบ รายได้
ผู้บริโภค คอมพิวเตอร์ แล็ปท็อป 12
ผู้บริโภค คอมพิวเตอร์ เดสก์ท็อป 8
ผู้บริโภค มือถือ โทรศัพท์ 15
ผู้บริโภค มือถือ แท็บเล็ต 6
ธุรกิจ บริการ ให้คำปรึกษา 10
ธุรกิจ บริการ สนับสนุน 7
ธุรกิจ ซอฟต์แวร์ ใบอนุญาต 11
ธุรกิจ ซอฟต์แวร์ การสมัครสมาชิก 14

แต่ละแถวสร้างหมวดหมู่ใบหนึ่งและจุดข้อมูลหนึ่ง ระดับการจัดกลุ่มหมวดหมู่อธิบายเส้นทางจากใบนั้นไปยังพ่อแม่ของมัน สำหรับแถวแรก เส้นทางคือ Consumer > Computers > Laptops.

ดัชนีที่ส่งกลับโดย ChartDataPoint.getDataPointLevels เริ่มจากใบขึ้นไปบน:

getDataPointLevels() index ระดับตรรกะ การแสดงผล Treemap การแสดงผล Sunburst
0 ใบ สี่เหลี่ยมค่าที่แทน ส่วนของวงแหวนด้านนอก
1 ส่วน สี่เหลี่ยมพ่อแม่หรือหัวเรื่อง ส่วนของวงแหวนกลาง
2 สาขา สี่เหลี่ยมระดับบนหรือหัวเรื่อง ส่วนของวงแหวนใน

ลำดับนี้เหมือนกันสำหรับทั้งสองประเภทแผนภูมิแม้การจัดวางภาพจะแตกต่างกัน ส่วนพ่อแม่จะถูกใช้ร่วมกันโดยหลายใบ เพื่อจัดรูปแบบให้ใช้ระดับที่สอดคล้องของจุดข้อมูลแรกในกลุ่มนั้น ตัวอย่างเช่น สาขา Consumer เริ่มจากจุด Laptops ในขณะที่ส่วน Software เริ่มจากจุด Licenses การเก็บอ้างอิงถึงจุดเหล่านั้นทำให้ชัดเจนและปลอดภัยกว่าการใช้คำสั่งที่ไม่อธิบายเช่น data_points.get_Item(0) หรือ data_points.get_Item(6).

สร้างและปรับแต่งแผนภูมิทั้งสองประเภท

ตัวอย่างเต็มต่อไปนี้สร้าง Treemap บนสไลด์แรกและ Sunburst บนสไลด์ที่สอง มันสร้างโครงสร้างลำดับชั้น แสดงค่าของ Tablets ใช้สีคงที่กับระดับที่เลือก จัดรูปแบบป้ายสาขาและบันทึกงานนำเสนอ

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)

        # เพิ่มหมวดหมู่ใบ. รายการจัดกลุ่มจะตั้งค่าเฉพาะเมื่อกลุ่มใหม่เริ่มต้น;
        # หมวดหมู่ต่อไปนี้จะอยู่ในกลุ่มนั้นจนกว่ารายการอื่นจะถูกตั้งค่า.
        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

        # แสดงหมวดหมู่และค่าในใบ Tablets.
        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")

        # จัดรูปแบบสาขา Consumer ผ่านใบแรกในสาขานั้น.
        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)

        # จัดรูปแบบส่วน Software ผ่านใบแรกในส่วนนั้น.
        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)

        # ParentLabelLayout มีผลต่อป้ายพ่อแม่ของ Treemap; Sunburst ใช้ส่วนของวง.
        if chart_type == ChartType.Treemap:
            series.setParentLabelLayout(ParentLabelLayoutType.Overlapping)

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

เซลล์หมวดหมู่และเซลล์ค่าจะใช้แถว Worksheet เดียวกัน ทำให้ตำแหน่งของคอลเลกชันยังคงตรงกัน เมื่อทำงานกับแผนภูมิที่มีอยู่แทนการสร้างใหม่ ให้ตรวจสอบแถวหมวดหมู่ก่อนและเก็บอ้างอิงที่ตั้งชื่อไว้กับจุดข้อมูลและระดับที่ต้องการจัดรูปแบบ

พฤติกรรมและข้อพิจารณาปฏิบัติ

ความแตกต่างระหว่าง Treemap และ Sunburst

  • Treemap ใช้พื้นที่เพื่อสื่อค่าและสี่เหลี่ยมซ้อนกันเพื่อสื่อลำดับชั้น วิธีการ ChartSeries.setParentLabelLayout ควบคุมลักษณะการแสดงป้ายพ่อแม่ในประเภทแผนภูนินี้.
  • Sunburst ใช้มุมเพื่อสื่อค่าและความลึกของวงเพื่อสื่อลำดับชั้น ChartSeries.setParentLabelLayout ไม่ควบคุมป้ายของวงนี้.
  • แผนภูมิทั้งสองประเภทใช้ระดับการจัดกลุ่มหมวดหมู่เดียวกันและลำดับใบไปพ่อแม่เดียวกันที่ส่งกลับโดย ChartDataPoint.getDataPointLevels ดังนั้นโค้ดการสร้างข้อมูลและการจัดรูปแบบระดับสามารถใช้ร่วมกันได้.
  • ค่าของพ่อแม่คำนวณจากใบข้อมูลที่สืบทอด อย่าเพิ่มจุดตัวเลขแยกสำหรับสาขาหรือส่วน

การจัดเรียงและลำดับส่วน

เครื่องมือจัดวางแผนภูมิจะกำหนดตำแหน่งสุดท้ายของสี่เหลี่ยมและส่วนของวง จัดเรียงแถวหมวดหมู่ที่เกี่ยวข้องเข้าด้วยกันก่อนเพิ่มลงไป แต่ไม่ควรพึ่งพาตำแหน่งสี่เหลี่ยมหรือมุมเริ่มต้นที่เจาะจง หากลำดับมีความหมาย ให้รวมไว้ในป้ายหรือใช้ประเภทแผนภูมิที่มีแกนหมวดหมู่ชัดเจน

ธีมและสีคงที่

ระดับแผนภูมิที่ไม่ได้จัดรูปแบบจะรับสีจากธีมของงานนำเสนอ ตัวอย่างใช้การเติมสี RGB อย่างชัดเจนเพื่อให้ผลลัพธ์คาดการณ์ได้ หากต้องการให้แผนภูมิปฏิบัติตามการเปลี่ยนแปลงธีม ให้ใช้สีแบบ scheme แทนค่ารหัส RGB คงที่และหลีกเลี่ยงการเขียนทับทุกระดับ อีกทั้งตรวจสอบความคมชัดของป้ายหลังจากเปลี่ยนสีของสาขาหรือส่วน

ป้ายและพื้นที่ที่ใช้ได้

PowerPoint อาจซ่อนหรือตัดป้ายเมื่อส่วนเล็กเกินไป การเพิ่มขนาดแผนภูมิ, ย่อชื่อหมวดหมู่, หรือแสดงฟิลด์ป้ายให้น้อยลงมักให้ผลลัพธ์ที่ชัดเจนขึ้น ป้ายสามารถรวมชื่อหมวดหมู่, ชื่อชุดข้อมูล, และค่าได้ผ่าน DataLabelFormat แต่การเปิดใช้ทุกฟิลด์มักทำให้แผนภูมิเชิงลำดับชั้นอ่านยาก

การส่งออกและการเรนเดอร์

การบันทึกเป็น PPTX ทำให้แผนภูมิแก้ไขได้ เมื่อ Aspose.Slides เรนเดอร์งานนำเสนอเป็น PDF หรือภาพ การเติมสีและการตั้งค่าป้ายที่รองรับจะถูกเรนเดอร์พร้อมแผนภูมิ การแทนที่ฟอนต์และความแตกต่างเล็กน้อยในพื้นที่จัดวางที่ใช้ได้อาจทำให้การตัดบรรทัดหรือการมองเห็นป้ายเปลี่ยนไป จึงควรติดตั้งฟอนต์ที่จำเป็นและตรวจสอบเป้าหมายการส่งออกที่สำคัญ

คำถามที่พบบ่อย

ทำไมการเปลี่ยนระดับพ่อแม่จึงส่งผลต่อหลายใบ?

สาขาหรือส่วนเป็นส่วนภาพที่ใช้ร่วมกัน สามารถเข้าถึง ChartDataPointLevel ผ่านใบข้อมูลที่สืบทอดได้ แต่การจัดรูปแบบเป็นของส่วนพ่อแม่ที่ใช้ร่วมกัน ไม่ได้เป็นของใบข้อมูลนั้นเท่านั้น.

ทำไมป้ายข้อมูลหายไป?

ขั้นแรกเปิดใช้ฟิลด์ที่ต้องการบนอ็อบเจ็กต์ DataLabelFormat ของป้าย แล้วตรวจสอบว่าส่วนมีพื้นที่พอหรือไม่ การจัดเลย์เอาต์ป้ายพ่อแม่ของ Treemap, ขนาดแผนภูมิ, ความยาวป้าย, ขนาดฟอนต์, และจำนวนฟิลด์ที่เปิดใช้ทั้งหมดมีผลต่อการแสดงป้ายหรือไม่.

ฉันสามารถกำหนดลำดับหรือพิกัดที่แน่นอนของส่วนได้หรือไม่?

คุณสามารถควบคุมลำดับของแถวแหล่งข้อมูลและทำให้แต่ละกลุ่มต่อเนื่องกันได้ แต่ไม่สามารถกำหนดสี่เหลี่ยม Treemap หรือมุม Sunburst อย่างแม่นยำได้ เครื่องมือจัดวางแผนภูมิคำนวณจากโครงสร้างลำดับชั้น, ค่า, และพื้นที่ที่มีอยู่.

ทำไมสีจึงเปลี่ยนหลังจากธีมของงานนำเสนอเปลี่ยน?

การเติมสีตามธีมออกแบบมาให้สอดคล้องกับจานสีของงานนำเสนอ ให้ใช้สี RGB อย่างชัดเจนกับระดับที่ต้องคงที่ หรือใช้สีแบบ scheme เมื่อการปรับให้เข้ากับธีมใหม่เป็นที่ต้องการ.

การจัดรูปแบบที่กำหนดเองจะคงไว้ในการส่งออกเป็น PDF และภาพหรือไม่?

ใช่ การเติมสีแผนภูมิและการตั้งค่าป้ายที่รองรับจะรวมอยู่ในการเรนเดอร์ เพื่อผลลัพธ์ที่สอดคล้องในทุกระบบ ให้เตรียมฟอนต์ที่จำเป็นและทดสอบขนาดการส่งออกขั้นสุดท้าย เนื่องจากการจัดวางป้ายขึ้นกับเลย์เอาต์.

ดูเพิ่มเติม