Sesuaikan Titik Data pada Diagram Treemap dan Sunburst di Python
Gambaran Umum
Treemap dan Sunburst menampilkan jenis data hierarkis yang sama, tetapi menggunakan tata letak yang berbeda. Treemap menggambar hierarki sebagai persegi panjang bersarang yang luasnya mewakili nilai daun. Sunburst menggambarnya sebagai cincin konsentrik: grup tingkat atas berada dekat pusat, dan kategori daun berada pada cincin luar.
Dalam Aspose.Slides for Python via Java, setiap nilai numerik adalah sebuah ChartDataPoint. Metode ChartDataPoint.getDataPointLevels menyediakan akses ke daun dan grup induknya. Artikel ini menjelaskan pemetaan tersebut dan menunjukkan cara membuat serta memformat kedua jenis diagram dari data contoh yang sama.


Memahami Kategori, Titik Data, dan Tingkat
Contoh yang digunakan di bawah memiliki tiga level kategori dan satu seri numerik:
| Cabang | Batang | Daun | Pendapatan |
|---|---|---|---|
| Consumer | Computers | Laptops | 12 |
| Consumer | Computers | Desktops | 8 |
| Consumer | Mobile | Phones | 15 |
| Consumer | Mobile | Tablets | 6 |
| Business | Services | Consulting | 10 |
| Business | Services | Support | 7 |
| Business | Software | Licenses | 11 |
| Business | Software | Subscriptions | 14 |
Setiap baris membuat satu kategori daun dan satu titik data. Level pengelompokan kategori menggambarkan jalur dari daun tersebut ke induknya. Untuk baris pertama, jalurnya adalah Consumer > Computers > Laptops.
Indeks yang dikembalikan oleh ChartDataPoint.getDataPointLevels berjalan dari daun ke atas:
Indeks getDataPointLevels() |
Level logis | Representasi Treemap | Representasi Sunburst |
|---|---|---|---|
0 |
Daun | Persegi nilai | Segmen cincin luar |
1 |
Batang | Persegi induk atau header | Segmen cincin tengah |
2 |
Cabang | Persegi tingkat atas atau header | Segmen cincin dalam |
Urutan ini sama untuk kedua jenis diagram meskipun tata letak visualnya berbeda. Sebuah segmen induk dibagi oleh beberapa daun. Untuk memformatnya, gunakan level yang sesuai dari titik data pertama dalam grup tersebut. Misalnya, cabang Consumer dimulai dengan titik Laptops, sedangkan batang Software dimulai dengan titik Licenses. Menyimpan referensi ke titik‑titik itu lebih jelas dan lebih aman daripada menggunakan ekspresi yang tidak dijelaskan seperti data_points.get_Item(0) atau data_points.get_Item(6).
Membuat dan Menyesuaikan Kedua Jenis Diagram
Contoh lengkap berikut membuat Treemap pada slide pertama dan Sunburst pada slide kedua. Ia membangun hierarki, menampilkan nilai untuk Tablets, menerapkan warna tetap pada level terpilih, memformat label cabang, dan menyimpan presentasi.
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)
# Tambahkan kategori daun. Item pengelompokan hanya disetel ketika grup baru dimulai;
# kategori berikut tetap dalam grup itu sampai item lain disetel.
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
# Tampilkan kategori dan nilai pada daun 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")
# Format cabang Consumer melalui daun pertama dalam cabang tersebut.
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)
# Format batang Software melalui daun pertama dalam batang tersebut.
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 memengaruhi label induk pada Treemap; Sunburst menggunakan segmen cincin.
if chart_type == ChartType.Treemap:
series.setParentLabelLayout(ParentLabelLayoutType.Overlapping)
presentation.save("hierarchical-charts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Sel sel kategori dan sel nilai menggunakan baris worksheet yang sama, sehingga posisi koleksi mereka tetap selaras. Ketika Anda bekerja dengan diagram yang sudah ada daripada membuat yang baru, periksa baris kategori terlebih dahulu dan simpan referensi bernama ke titik data serta level yang ingin Anda format.
Perilaku dan Pertimbangan Praktis
Perbedaan Treemap dan Sunburst
- Treemap menggunakan luas untuk menyampaikan nilai dan persegi panjang bersarang untuk menyampaikan hierarki. Metode ChartSeries.setParentLabelLayout mengontrol cara label induk muncul pada jenis diagram ini.
- Sunburst menggunakan sudut untuk menyampaikan nilai dan kedalaman cincin untuk menyampaikan hierarki. ChartSeries.setParentLabelLayout tidak mengontrol label cincinnya.
- Kedua jenis diagram menggunakan level pengelompokan kategori yang sama dan urutan daun‑ke‑induk yang sama yang dikembalikan oleh ChartDataPoint.getDataPointLevels, sehingga kode pembuatan data dan pemformatan level dapat dipakai bersama.
- Nilai induk dihitung dari daun‑daun turunannya. Jangan menambahkan titik numerik terpisah untuk cabang atau batang.
Pengurutan dan Urutan Segmen
Mesin tata letak diagram menentukan penempatan akhir persegi panjang dan segmen cincin. Atur baris kategori yang terkait bersama sebelum menambahkannya, tetapi jangan bergantung pada posisi persegi panjang atau sudut awal tertentu. Jika urutan memiliki makna, sertakan dalam label atau gunakan jenis diagram dengan sumbu kategori eksplisit.
Tema dan Warna Tetap
Level diagram yang tidak diformat mewarisi warna dari tema presentasi. Contoh ini menggunakan isian RGB eksplisit untuk output yang dapat diprediksi. Jika diagram harus mengikuti perubahan tema, gunakan warna skema alih‑alih nilai RGB tetap dan hindari menimpa setiap level. Periksa kontras label setelah mengubah isian cabang atau batang.
Label dan Ruang Tersedia
PowerPoint dapat menyembunyikan atau memotong label ketika segmen terlalu kecil. Memperbesar ukuran diagram, memendekkan nama kategori, atau menampilkan lebih sedikit bidang label biasanya menghasilkan hasil yang lebih jelas. Sebuah label dapat menggabungkan nama kategori, nama seri, dan nilai melalui DataLabelFormat, tetapi mengaktifkan setiap bidang sering membuat diagram hierarkis sulit dibaca.
Ekspor dan Rendering
Menyimpan ke PPTX membuat diagram dapat diedit. Ketika Aspose.Slides merender presentasi ke PDF atau gambar, isian dan pengaturan label yang didukung dirender bersama diagram. Substitusi font dan perbedaan kecil dalam ruang tata letak yang tersedia dapat mengubah pembungkus baris atau visibilitas label, jadi pasang font yang diperlukan dan verifikasi target ekspor penting.
Tanya Jawab
Mengapa mengubah level induk memengaruhi beberapa daun?
Cabang atau batang adalah segmen visual yang dibagi. ChartDataPointLevel dapat diakses melalui daun turunan, tetapi pemformatannya berlaku untuk segmen induk yang dibagi, bukan hanya daun tersebut.
Mengapa label data tidak muncul?
Pertama aktifkan bidang yang diperlukan pada objek DataLabelFormat label. Kemudian periksa apakah segmen memiliki ruang yang cukup. Tata letak label induk pada Treemap, dimensi diagram, panjang label, ukuran font, dan jumlah bidang yang diaktifkan semuanya memengaruhi apakah label dapat ditampilkan.
Bisakah saya menentukan urutan atau koordinat tepat segmen?
Anda dapat mengontrol urutan baris sumber dan menjaga setiap grup tetap berurutan, tetapi tidak dapat menetapkan persegi panjang Treemap atau sudut Sunburst secara tepat. Mesin tata letak diagram menghitungnya dari hierarki, nilai, dan ruang yang tersedia.
Mengapa warna berubah setelah tema presentasi berubah?
Isian berbasis tema dirancang mengikuti palet presentasi. Terapkan warna RGB eksplisit pada level yang harus tetap tetap, atau pertahankan warna skema ketika menyesuaikan ke tema baru lebih diinginkan.
Apakah pemformatan khusus tetap terjaga pada ekspor PDF dan gambar?
Ya, isian diagram yang didukung dan pengaturan label termasuk selama proses rendering. Untuk hasil konsisten di berbagai sistem, sediakan font yang diperlukan dan uji ukuran ekspor akhir karena penyesuaian label bergantung pada tata letak.