Treemap ve Sunburst Grafiklerinde Python ile Veri Noktalarını Özelleştirme
Genel Bakış
Treemap ve Sunburst grafikler aynı türde hiyerarşik veriyi gösterir, ancak farklı düzenler kullanır. Bir Treemap, hiyerarşiyi yaprak değerlerini temsil eden iç içe dikdörtgenler olarak çizer. Bir Sunburst ise bunu konsantrik halkalar olarak çizer: üst düzey gruplar merkeze yakın, yaprak kategoriler dış halkada yer alır.
In Aspose.Slides for Python via Java, her sayısal değer bir ChartDataPoint. Its ChartDataPoint.getDataPointLevels metodu, yaprak ve üst grup erişimini sağlar. Bu makale bu eşlemeyi açıklar ve aynı örnek veriden her iki grafik türünü nasıl oluşturup biçimlendireceğinizi gösterir.


Kategorileri, Veri Noktalarını ve Seviyeleri Anlamak
Aşağıda kullanılan örnek üç kategori seviyesine ve bir sayısal seriye sahiptir:
| Şube | Kök | Yaprak | Gelir |
|---|---|---|---|
| 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 |
Her satır bir yaprak kategorisi ve bir veri noktası oluşturur. Kategori gruplama seviyeleri, o yapraktan üstlerine giden yolu tanımlar. İlk satır için yol Consumer > Computers > Laptops.
ChartDataPoint.getDataPointLevels tarafından döndürülen indeksler, yapraktan yukarı doğru çalışır:
getDataPointLevels() indeksi |
Mantıksal seviye | Treemap temsili | Sunburst temsili |
|---|---|---|---|
0 |
Yaprak | Değer dikdörtgeni | Dış halka segmenti |
1 |
Kök | Üst dikdörtgen ya da başlık | Orta halka segmenti |
2 |
Şube | Üst düzey dikdörtgen ya da başlık | İç halka segmenti |
Bu sıralama, görsel düzenleri farklı olsa da her iki grafik türü için de aynıdır. Bir üst segment, birkaç yaprak tarafından paylaşılır. Bunu biçimlendirmek için, o gruptaki ilk veri noktasının ilgili seviyesini kullanın. Örneğin, Consumer şubesi Laptops noktasından başlarken, Software kökü Licenses noktasından başlar. Bu noktalara referans tutmak, data_points.get_Item(0) veya data_points.get_Item(6) gibi açıklanmamış ifadeler kullanmaktan daha net ve güvenlidir.
Her iki Grafik Türünü de Oluşturma ve Özelleştirme
Aşağıdaki tam örnek ilk slaytta bir Treemap ve ikinci slaytta bir Sunburst oluşturur. Hiyerarşiyi oluşturur, Tablets değeri gösterir, seçili seviyelere sabit renkler uygular, bir şube etiketini biçimler ve sunumu kaydeder.
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)
# Yaprak kategorileri ekle. Yeni bir grup başladığında bir gruplama öğesi ayarlanır;
# sonraki kategoriler başka bir öğe ayarlanana kadar bu grup içinde kalır.
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 yaprağında kategori ve değeri göster.
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 şubesini o şubedeki ilk yaprak aracılığıyla biçimlendir.
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 kökünü o koldaki ilk yaprak aracılığıyla biçimlendir.
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 üst etiketlerini etkiler; Sunburst halka segmentlerini kullanır.
if chart_type == ChartType.Treemap:
series.setParentLabelLayout(ParentLabelLayoutType.Overlapping)
presentation.save("hierarchical-charts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Kategori hücreleri ve değer hücreleri aynı çalışma sayfası satırını kullanır, böylece koleksiyon konumları hizalı kalır. Varolan bir grafikle çalışırken yeni bir grafik oluşturmaktan ziyade, önce kategori satırlarını inceleyin ve biçimlendirmeyi planladığınız veri noktalarına ve seviyelere adlandırılmış referanslar saklayın.
Davranış ve Pratik Hususlar
Treemap ve Sunburst Farklılıkları
- Bir Treemap, değeri iletmek için alanı ve hiyerarşiyi iletmek için iç içe dikdörtgenleri kullanır. ChartSeries.setParentLabelLayout metodu, bu grafik türünde üst etiketlerin nasıl görüneceğini kontrol eder.
- Bir Sunburst, değeri iletmek için açıyı ve hiyerarşiyi iletmek için halka derinliğini kullanır. ChartSeries.setParentLabelLayout halka etiketlerini kontrol etmez.
- Her iki grafik türü de aynı kategori gruplama seviyelerini ve ChartDataPoint.getDataPointLevels tarafından döndürülen aynı yaprak‑üst sırasını kullanır, bu yüzden veri oluşturma ve seviye biçimlendirme kodu paylaşılabilir.
- Üst değerler, alt yapraklardan hesaplanır. Şubeler veya kökler için ayrı sayısal noktalar eklemeyin.
Sıralama ve Segment Sırası
Grafik yerleşim motoru, dikdörtgenlerin ve halka segmentlerinin nihai konumunu belirler. İlgili kategori satırlarını eklemeden önce bir araya getirin, ancak belirli bir dikdörtgen konumuna veya başlangıç açısına güvenmeyin. Eğer sıra anlam taşıyorsa, bunu etiketlerde gösterin veya açık bir kategori ekseni olan bir grafik türü kullanın.
Tema ve Sabit Renkler
Biçimlendirilmemiş grafik seviyeleri, sunum temasından renkleri devralır. Örnek, öngörülebilir çıktı için açık RGB doldurulmaları kullanır. Grafik temanın değişimini takip etmesi gerekiyorsa, sabit RGB değerleri yerine şema renkleri kullanın ve her seviyeyi geçersiz kılmaktan kaçının. Ayrıca bir şube veya kök doldurması değiştirdikten sonra etiket kontrastını kontrol edin.
Etiketler ve Mevcut Alan
PowerPoint, bir segment çok küçük olduğunda etiketleri gizleyebilir veya kırpabilir. Grafik boyutunu artırmak, kategori adlarını kısaltmak veya daha az etiket alanı göstermek genellikle daha net bir sonuç verir. Bir etiket, kategori adı, seri adı ve değeri DataLabelFormat aracılığıyla birleştirebilir, ancak tüm alanları etkinleştirmek hiyerarşik grafiklerin okunmasını zorlaştırabilir.
Dışa Aktarma ve Oluşturma
PPTX olarak kaydetmek, grafiği düzenlenebilir tutar. Aspose.Slides, sunumu PDF veya görüntüye render ettiğinde, desteklenen doldurmalar ve etiket ayarları grafik ile birlikte işlenir. Yazı tipi ikamesi ve mevcut düzen alanındaki küçük farklar satır kaydırma veya etiket görünürlüğünü değiştirebilir; bu yüzden gerekli yazı tiplerini kurun ve önemli dışa aktarma hedeflerini doğrulayın.
SSS
Bir üst seviyeyi değiştirmek neden birkaç yaprağı etkiler?
Bir şube veya kök, paylaşılan bir görsel segmenttir. ChartDataPointLevel bir alt yaprağa üzerinden ulaşılabilir, ancak biçimlendirme yalnızca o yaprağa değil, paylaşılan üst segmente uygulanır.
Bir veri etiketi neden eksik?
Öncelikle etiketin DataLabelFormat nesnesinde gerekli alanları etkinleştirin. Ardından segmentin yeterli alana sahip olup olmadığını kontrol edin. Treemap üst‑etiket düzeni, grafik boyutları, etiket uzunluğu, yazı tipi boyutu ve etkin alan sayısı bir etiketin gösterilip gösterilemeyeceğini etkiler.
Segmentlerin kesin sırasını veya koordinatlarını ayarlayabilir miyim?
Kaynak‑satır sırasını kontrol edebilir ve her grubu ardışık tutabilirsiniz, ancak kesin Treemap dikdörtgenlerini veya Sunburst açılarını atayamazsınız. Grafik yerleşim motoru bunları hiyerarşi, değerler ve mevcut alana göre hesaplar.
Sunum teması değiştiğinde renkler neden değişir?
Tema‑tabanlı doldurmalar, sunum paletini takip edecek şekilde tasarlanmıştır. Sabit kalması gereken seviyelere açık RGB renkleri uygulayın veya yeni bir temaya uyum sağlanması tercih ediliyorsa şema renklerini koruyun.
Özel biçimlendirme PDF ve görüntü dışa aktarmalarında korunur mu?
Evet, desteklenen grafik doldurmaları ve etiket ayarları render sırasında dahil edilir. Sistemler arasında tutarlı sonuçlar elde etmek için gerekli yazı tiplerini sağlamak ve etiket sığdırmanın düzen bağımlı olduğunu test ederek son dışa aktarma boyutunu kontrol etmek önemlidir.