Diagram adat sorozatok kezelése prezentációkban Pythonban
Áttekintés
Egy diagram az ábrázolt adatokat egy diagramadat-munkafüzetben tárolja. Egy ChartSeries egy kapcsolódó értékhalmazt képvisel, és a sorozat minden ChartDataPoint egy vagy több munkafüzetcellára hivatkozik. A ChartCategory objektumok a sorozatok által megosztott címkéket vagy csoportosítási értékeket biztosítják. A sorozat neve, kategóriái és pontértékei ezért ChartDataCell objektumokhoz kapcsolódnak, nemcsak megjelenítési szövegként tárolódnak.
Egy tipikus kategória diagram esetén az alapértelmezett munkafüzet a 0. sorban tárolja a sorozatneveket, az 0. oszlopban a kategórianéveket, a többi cella pedig a sorozatértékeket. A ChartDataWorkbook.getCell számára megadott munkalap-, sor- és oszlindexek nullával kezdődnek. Ez a felépítés akkor hasznos, ha alapértelmezett adatokkal hoz létre diagramot, de ne feltételezze, hogy minden meglévő diagram ezt használja. Betöltött prezentáció esetén ellenőrizze a sorozatok, kategóriák és adatpontok által hivatkozott cellákat, mielőtt a munkafüzet értékeit módosítaná.
A diagram beállítások három különböző hatókörrel rendelkeznek:
- Sorozatszintű beállítások, például a ChartSeries.getFormat alapértelmezett megjelenést ad minden pontnak egy sorozaton belül.
- Adatpont beállítások, például a ChartDataPoint.getFormat felülírja a sorozat megjelenését egy adott pontnál.
- Csoport beállítások kompatibilis sorozatokra vonatkoznak, amelyek ugyanahhoz a ChartSeriesGroup tartoznak. A csoportot a ChartSeries.getParentSeriesGroup segítségével érheti el, ha például átfedés vagy részsáv szélesség beállítására van szükség.
Ha nincs kifejezetten megadva pont- vagy sorozattöltés, a diagram stílusa és témája határozza meg az automatikus megjelenést. Ha mind a sorozat, mind a pont formázása jelen van, a pont formázása élvez elsőbbséget az adott pontnál.

A diagram sorozatának átfedésének beállítása
A ChartSeries.getOverlap megadja, hogy a 2D diagramban a sávok vagy oszlopok mennyire fedik egymást, -100 és 100 százalék között. Ez egy csak olvasható leképezés a beállításra a szülő sorozatcsoportban. A ChartSeriesGroup.setOverlap használatával frissítheti az adott csoport minden kompatibilis sorozatát. Ez az opció az összevont sávok vagy oszlopok megjelenítését támogató diagramtípusokra vonatkozik; nem befolyásolja a kombinált diagram nem kapcsolódó sorozatcsoportjait.
A következő példa beállítja az átfedést arra a csoportra, amelyik az első sorozatot tartalmazza:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
first_slide_index = 0
first_series_index = 0
overlap_percent = 30
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
# Az új diagram mintasorozatokat, kategóriákat és értékeket tartalmaz.
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
series.getParentSeriesGroup().setOverlap(overlap_percent)
presentation.save("series_overlap.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az eredmény:

A sorozat kitöltőszínének módosítása
A ChartSeries.getFormat segítségével állítható be az egész sorozatra vonatkozó alapértelmezett kitöltés. Ha egy pont már rendelkezik kifejezett kitöltéssel, annak a ChartDataPoint.getFormat beállítása felülírja a sorozat kitöltését az adott pontnál.
A következő példa szilárd kék kitöltést alkalmaz az első sorozatra:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, FillType, Presentation, SaveFormat
Color = jpype.JClass("java.awt.Color")
first_slide_index = 0
first_series_index = 0
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
series.getFormat().getFill().setFillType(FillType.Solid)
series.getFormat().getFill().getSolidFillColor().setColor(Color.BLUE)
presentation.save("series_color.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az eredmény:

A sorozat nevének módosítása
A sorozat neve a diagramadat-munkafüzetben tárolódik, és általában a jelmagyarázatban jelenik meg. Az alapértelmezett munkafüzet egy halmozott oszlopdiagramhoz a B1 cella (0. sor, 1. oszlop) tartalmazza az első sorozat nevét. Az alábbi példában a változónevek ezt a struktúrát teszik egyértelművé:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
first_slide_index = 0
worksheet_index = 0
series_name_row_index = 0
first_series_column_index = 1
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
workbook = chart.getChartData().getChartDataWorkbook()
series_name_cell = workbook.getCell(worksheet_index, series_name_row_index, first_series_column_index)
series_name_cell.setValue("Revenue")
presentation.save("series_name.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
A cellát, amelyre a ChartSeries.getName már hivatkozik, közvetlenül is frissítheti. Ez a megközelítés nem tesz fel feltételezést egy adott sorra vagy oszlopra egy meglévő diagramon:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
first_slide_index = 0
first_series_index = 0
first_name_cell_index = 0
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
series_name_cell = series.getName().getAsCells().get_Item(first_name_cell_index)
series_name_cell.setValue("Revenue")
presentation.save("series_name.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az eredmény:

Az automatikus sorozatkitöltő szín lekérdezése
A ChartSeries.getAutomaticSeriesColor visszaadja a sorozatindex alapján és a diagramstílusból számított színt. Ez a szín akkor használatos, amikor a sorozat kitöltése nincs kifejezetten meghatározva. A metódus meghívása csak a számított színt olvassa; nem rendeli hozzá új kitöltést.
A következő példa kiírja az alapértelmezett sorozatok automatikus színét:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation
first_slide_index = 0
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series_count = chart.getChartData().getSeries().size()
for series_index in range(series_count):
series = chart.getChartData().getSeries().get_Item(series_index)
automatic_color = series.getAutomaticSeriesColor()
print(f"Series {series_index}: {automatic_color}")
finally:
presentation.dispose()
Példa kimenet az alapértelmezett diagramstílushoz:
Series 0: java.awt.Color[r=79,g=129,b=189]
Series 1: java.awt.Color[r=192,g=80,b=77]
Series 2: java.awt.Color[r=155,g=187,b=89]
A pontos színek a diagramstílustól és a témától függenek.
Invertált kitöltőszín beállítása egy diagram sorozathoz
Sáv-, oszlop- és buboréksorozatok esetén a ChartSeries.setInvertIfNegative lehetővé teszi, hogy a negatív értékek más kitöltéssel jelenjenek meg. Állítsa be a szabályos sorozat kitöltését szilárdra, engedélyezze az invertert, és adja meg a negatív érték színét a ChartSeries.getInvertedSolidFillColor segítségével. A negatív számok a munkafüzetben változatlanok maradnak; csak a megjelenési színük módosul.
A következő példa az alapértelmezett diagramadatot egy sorozatra cseréli. A munkalap 0. sorában a sorozat neve, az 0. oszlopban a kategória nevek, az 1. oszlopban pedig az értékek szerepelnek:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, FillType, Presentation, SaveFormat
Color = jpype.JClass("java.awt.Color")
first_slide_index = 0
worksheet_index = 0
header_row_index = 0
category_column_index = 0
first_series_column_index = 1
first_data_row_index = 1
category_names = ["Category 1", "Category 2", "Category 3"]
series_values = [-20, 50, -30]
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
chart_data = chart.getChartData()
workbook = chart_data.getChartDataWorkbook()
chart_data.getSeries().clear()
chart_data.getCategories().clear()
series_name_cell = workbook.getCell(worksheet_index, header_row_index, first_series_column_index, "Series 1")
chart_type = chart.getType()
series = chart_data.getSeries().add(series_name_cell, chart_type)
for category_index in range(len(category_names)):
data_row_index = first_data_row_index + category_index
category_name = category_names[category_index]
series_value = series_values[category_index]
category_cell = workbook.getCell(worksheet_index, data_row_index, category_column_index, category_name)
chart_data.getCategories().add(category_cell)
value_cell = workbook.getCell(worksheet_index, data_row_index, first_series_column_index, series_value)
series.getDataPoints().addDataPointForBarSeries(value_cell)
automatic_series_color = series.getAutomaticSeriesColor()
series.getFormat().getFill().setFillType(FillType.Solid)
series.getFormat().getFill().getSolidFillColor().setColor(automatic_series_color)
series.setInvertIfNegative(True)
series.getInvertedSolidFillColor().setColor(Color.RED)
presentation.save("inverted_solid_fill_color.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az eredmény:

Invertert egy pontnál a ChartDataPoint.setInvertIfNegative segítségével is engedélyezheti. Az alábbi példában az invertert a sorozatra letiltották, csak a kiválasztott pontnál engedélyezték. A pontnak negatív értéket is adunk, hogy a hatás látható legyen:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, FillType, Presentation, SaveFormat
Color = jpype.JClass("java.awt.Color")
first_slide_index = 0
first_series_index = 0
target_data_point_index = 2
negative_value = -30
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
automatic_series_color = series.getAutomaticSeriesColor()
series.getFormat().getFill().setFillType(FillType.Solid)
series.getFormat().getFill().getSolidFillColor().setColor(automatic_series_color)
series.getInvertedSolidFillColor().setColor(Color.RED)
series.setInvertIfNegative(False)
data_point = series.getDataPoints().get_Item(target_data_point_index)
data_point.getValue().getAsCell().setValue(negative_value)
data_point.setInvertIfNegative(True)
presentation.save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Egy adott adatpont értékének törlése
Egy pont üresre állításához a többi pont megtartása mellett állítsa a mögöttes munkafüzetcellát None-ra. Oszlopdiagram esetén a ábrázolt érték a ChartDataPoint.getValue segítségével érhető el. Az adatpont ugyanazon kategóriahelyen marad, de a diagram a beállított „blank-value” beállítás szerint üresként kezeli az értéket.
A következő példa csak a második pontot törli az első sorozatban:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
first_slide_index = 0
first_series_index = 0
target_data_point_index = 1
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
data_point = series.getDataPoints().get_Item(target_data_point_index)
data_point.getValue().getAsCell().setValue(None)
presentation.save("clear_data_point_value.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Szétszórt diagramok külön X és Y cellákat használnak, a buborékdiagramok pedig egy méretcellát is. Törölje csak azt a cellát, amelyik az eltávolítandó értéket tartalmazza. Ne hívja meg a ChartDataPointCollection.clear metódust, ha a többi pontot meg akarja tartani, mivel ez a metódus minden adatpontot eltávolít a gyűjteményből.
A sorozat részsávszélességének beállítása
A részsávszélesség a szomszédos sáv- vagy oszlopcsoportok közötti távolságot jelenti, a sáv vagy oszlop szélességének százalékában kifejezve. Az átfedéshez hasonlóan ez a beállítás a szülő sorozatcsoporthoz tartozik, nem egyetlen sorozathoz. Hívja meg egyszer a ChartSeriesGroup.setGapWidth a csoportra. Nagyobb érték több helyet hoz létre a csoportok között, kisebb érték sűrűbbé teszi őket.
A következő példa megváltoztatja a részsávszélességet, és csak a végleges prezentációt menti:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
first_slide_index = 0
first_series_index = 0
gap_width_percent = 30
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(first_slide_index)
chart = slide.getShapes().addChart(ChartType.StackedColumn, 20, 20, 500, 200)
series = chart.getChartData().getSeries().get_Item(first_series_index)
series.getParentSeriesGroup().setGapWidth(gap_width_percent)
presentation.save("gap_width_30.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az eredmény:

GYIK
Mely diagramtípusok támogatják az adat sorozatokat?
Az összes, a ChartType felsorolásban szereplő diagramtípus használ diagramadatokat, de sorozataik nem mindegyiknek ugyanaz a értékstruktúrája vagy beállításai. Például a kategória diagramok kategóriákat és értékeket használnak, a szórt diagramok X és Y értékeket, a buborékdiagramok pedig buborékméreteket. Használja az adatpont‑létrehozó metódust, amely megfelel a sorozat típusának. Az olyan opciók, mint az átfedés és a részsávszélesség, csak a kompatibilis sáv‑ vagy oszlopcsoportokra vonatkoznak.
Mi az a diagram sorozatcsoport?
Egy ChartSeriesGroup kompatibilis sorozatokat tartalmaz, amelyek közös csoportszintű ábrázolási beállításokat osztanak meg. Egy kombinált diagram több csoportot is tartalmazhat, ezért egy sorozaton keresztül elért csoport módosítása nem feltétlenül változtatja meg a diagram összes sorozatát.
Tartalmaz-e egy újonnan létrehozott diagram alapértelmezett adatot?
Igen. Alapértelmezés szerint a ShapeCollection.addChart mintasorozatokat, kategóriákat és értékeket hoz létre. Ezeket a cellákat szerkesztheti, vagy törölheti a sorozat‑ és kategóriagyűjteményeket, mielőtt teljesen egyéni adatkészletet adna hozzá. Egy túlterhelés segítségével diagramot hozhat létre alapértelmezett adatok nélkül is.
Hogyan kapcsolódnak a diagramobjektumok a munkafüzetcellákhoz?
A sorozatnevek, kategóriacímkék és adatpont‑értékek olyan cellákra hivatkoznak, amelyek egy ChartDataWorkbook részei. Egy hivatkozott cella módosítása frissíti a megfelelő diagramelemet. Egyedi adatok építésekor tartsa a kategóriasorokat és a sorozat‑érték sorokat összehangoltan, hogy minden pont a megfelelő kategória alatt legyen ábrázolva.
Hogyan töröljek egy pontot a teljes sorozat helyett?
Állítsa a megfelelő értékcellát None-ra, hogy a pont kategóriahelye üres pontként maradjon. A ChartDataPointCollection.clear metódust csak akkor használja, ha a sorozat összes pontját el akarja távolítani. Ha a kategóriákat is törli, frissítse minden sorozatot, hogy értékeik továbbra is igazodjanak a kategóriagyűjteményhez.
Hogyan jelennek meg az üres pontok?
Az eredmény a diagramtípustól és a Chart.setDisplayBlanksAs beállítástól függ. A támogatott diagramok megjeleníthetik az üresek helyét hézagként, nullaként, vagy a szomszédos pontok összekapcsolásával. Válassza azt a beállítást, amely a hiányzó adatok jelentésének leginkább megfelel a prezentációjában.
Hogyan formázzák a negatív értékeket?
A támogatott sáv‑, oszlop‑ és buborék‑sorozatok esetén hívja meg a ChartSeries.setInvertIfNegative metódust, és állítsa be a ChartSeries.getInvertedSolidFillColor által visszaadott színt. Egyedi pontnál a ChartDataPoint.setInvertIfNegative felülírhatja a viselkedést. Ezek a metódusok a formázást érintik, nem a tárolt numerikus értékeket.
Melyik formázás nyer, ha mind a sorozat, mind a pont formázva van?
Az explicit adatpont‑formázás előnyt élvez az adott pontnál. A többi pont továbbra is az explicit sorozat‑formázást, vagy ha az nincs definiálva, a automatikus diagramstílust és témát használja. A csoportszintű beállítások, mint az átfedés és a részsávszélesség, az elrendezést szabályozzák, és nem pontszintű formázási felülírások.
Van korlát arra, hogy hány sorozatot tartalmazhat egy diagram?
Az Aspose.Slides nem szab elő különálló, rögzített sorozatszám‑korlátot. Gyakorlatban a prezentációfájl mérete, a rendelkezésre álló memória, a renderelési idő és a diagram olvashatósága határozza meg a használható határt.
Mit kell módosítanom, ha az oszlopok túl közel vagy túl távol vannak egymástól?
Hívja meg a ChartSeriesGroup.setGapWidth megfelelő szülő sorozatcsoporton. Növelje az értéket a csoportok közötti tér növeléséhez, vagy csökkentse, ha közelebb akarja hozni őket.