Arbeiten mit Diagrammen
Übersicht
Aspose.Cells FOSS verwendet eine methoden‑pro‑Diagrammtyp‑API. Anstelle eines generischen add(ChartType.X, ...) Aufrufs hat jeder Diagrammtyp seine eigene dedizierte Methode in der charts‑Sammlung des Arbeitsblatts:
| Methode | Diagrammtyp |
|---|---|
ws.charts.add_bar(top_row, left_col, bottom_row, right_col) | Gruppierte Säule (Balkendiagramm) |
ws.charts.add_line(top_row, left_col, bottom_row, right_col) | Linie |
ws.charts.add_pie(top_row, left_col, bottom_row, right_col) | Kreis |
ws.charts.add_area(top_row, left_col, bottom_row, right_col) | Fläche |
Alle vier Positionsparameter beschreiben den rechteckigen Bereich im Blatt, in dem das Diagramm eingebettet wird. Zeilen‑ und Spaltenindizes sind nullbasiert. Jede Methode gibt ein Chart‑Objekt zurück, das Sie vor dem Speichern weiter konfigurieren.
Einschränkung: Nur die Diagrammtypen LINE, BAR, PIE, AREA und STOCK können in XLSX gespeichert werden. Der Aufruf von
wb.save()mit einer Arbeitsmappe, die einen anderen Diagrammtyp enthält (z. B. SCATTER, WATERFALL, RADAR, TREEMAP, HISTOGRAM), löstNotImplementedErroraus.
Ein Säulendiagramm hinzufügen
Das nachstehende Beispiel erstellt einen kleinen Umsatz‑nach‑Produkt‑Datensatz und fügt anschließend ein Säulendiagramm hinzu, das unter den Daten positioniert ist.
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
##--- Data ---
ws.cells["A1"].value = "Product"
ws.cells["B1"].value = "Revenue"
products = ["Widget A", "Widget B", "Widget C", "Widget D", "Widget E"]
revenues = [12_500, 18_200, 9_800, 21_400, 15_600]
for i, (product, revenue) in enumerate(zip(products, revenues), start=2):
ws.cells[f"A{i}"].value = product
ws.cells[f"B{i}"].value = revenue
##--- Chart (rows 7–22, columns A–H, all zero-based) ---
##top_row=6, left_col=0, bottom_row=22, right_col=7
chart = ws.charts.add_bar(6, 0, 22, 7)
chart.title = "Revenue by Product"
chart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue (USD)")
chart.show_legend = True
chart.legend_position = "bottom"
workbook.save("column_chart.xlsx")
print("Saved column_chart.xlsx")Die Daten belegen die Zeilen 1–6 (nullbasierte Zeilen 0–5), sodass top_row=6 das Diagramm sofort darunter platziert, ohne die Daten zu überlappen.
Ein Liniendiagramm hinzufügen
Liniendiagramme eignen sich gut, um Trends im Zeitverlauf darzustellen. Die Aufrufsignatur ist identisch zu add_bar — nur der Methodenname ändert sich.
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
##--- Monthly trend data ---
ws.cells["A1"].value = "Month"
ws.cells["B1"].value = "Page Views"
ws.cells["C1"].value = "Conversions"
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
page_views = [4_200, 5_100, 4_800, 6_300, 7_100, 6_800]
conversions = [ 210, 255, 230, 340, 390, 360]
for i, (month, pv, cv) in enumerate(zip(months, page_views, conversions), start=2):
ws.cells[f"A{i}"].value = month
ws.cells[f"B{i}"].value = pv
ws.cells[f"C{i}"].value = cv
##--- Line chart below the data ---
chart = ws.charts.add_line(8, 0, 24, 8)
chart.title = "Monthly Website Metrics"
chart.n_series.add("B2:B7", category_data="A2:A7", name="Page Views")
chart.n_series.add("C2:C7", category_data="A2:A7", name="Conversions")
chart.show_legend = True
chart.legend_position = "bottom"
workbook.save("line_chart.xlsx")
print("Saved line_chart.xlsx")Diagrammtitel und Legende
Setzen Sie den Diagrammtitel, indem Sie einen einfachen String direkt chart.title zuweisen. Die Eigenschaft akzeptiert ein str — versuchen Sie nicht, auf eine Untereigenschaft wie .title.text zuzugreifen, die in dieser Bibliothek nicht existiert.
##Correct
chart.title = "Quarterly Sales"
##Wrong — raises AttributeError
##chart.title.text = "Quarterly Sales"Die Sichtbarkeit und Position der Legende werden durch zwei Eigenschaften gesteuert:
chart.show_legend = True # display the legend
chart.legend_position = "bottom" # "bottom", "top", "left", "right"Um die Legende vollständig auszublenden, setzen Sie chart.show_legend = False. Derlegend_position‑Wert wird ignoriert, wenn die Legende ausgeblendet ist.
Datenreihen‑Konfiguration
Verwenden Sie chart.n_series.add(), um Datenbereiche an ein Diagramm anzuhängen. Übergeben Sie alle
Argumente als keyword arguments, um Verwechslungen durch Positionsreihenfolge zu vermeiden:
chart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue")Sie können mehrere Serien zu einem einzelnen Diagramm hinzufügen, indem Sie n_series.add mehrmals aufrufen. Jeder Aufruf fügt eine neue Serie hinzu:
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
##Headers
ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "North"
ws.cells["C1"].value = "South"
ws.cells["D1"].value = "East"
data = [
("Q1", 8_400, 6_100, 7_200),
("Q2", 9_200, 7_400, 8_100),
("Q3", 10_500, 8_900, 9_600),
("Q4", 11_800, 9_300, 10_200),
]
for i, row in enumerate(data, start=2):
ws.cells[f"A{i}"].value = row[0]
ws.cells[f"B{i}"].value = row[1]
ws.cells[f"C{i}"].value = row[2]
ws.cells[f"D{i}"].value = row[3]
chart = ws.charts.add_bar(6, 0, 22, 8)
chart.title = "Regional Sales by Quarter"
chart.n_series.add("B2:B5", category_data="A2:A5", name="North")
chart.n_series.add("C2:C5", category_data="A2:A5", name="South")
chart.n_series.add("D2:D5", category_data="A2:A5", name="East")
chart.show_legend = True
chart.legend_position = "bottom"
workbook.save("multi_series_chart.xlsx")
print("Saved multi_series_chart.xlsx")Kategoriedaten
Kategorielabels können auf Diagrammebene oder auf Ebene der einzelnen Serien festgelegt werden.
Kategoriedaten auf Diagrammebene gilt standardmäßig für alle Reihen:
chart.category_data = "A2:A5"Serienbezogene Kategoriedaten (über das Schlüsselwortargument category_data zu
n_series.add) überschreibt die Diagrammebene‑Einstellung für diese bestimmte Serie:
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")Wenn jede Serie denselben Kategorienbereich teilt, das Setzen von chart.category_data
einmal ist prägnanter. Wenn Serien unterschiedliche Kategorienbereiche haben — zum Beispiel,
zwei Datensätze mit unterschiedlichen Zeiträumen — verwenden Sie das pro‑Serie‑Schlüsselwortargument
stattdessen.
Diagrammpositionierung
Die vier Positionsparameter jeder add_*‑Methode definieren ein Begrenzungsrechteck im Blatt, gemessen in nullbasierten Zeilen‑ und Spaltenindizes:
add_bar(top_row, left_col, bottom_row, right_col)| Parameter | Bedeutung |
|---|---|
top_row | Nullbasierter Index der ersten vom Diagramm belegten Zeile |
left_col | Nullbasierter Index der linken Spalte |
bottom_row | Nullbasierter Index der letzten vom Diagramm belegten Zeile |
right_col | Nullbasierter Index der rechten Spalte |
Ein gängiges Muster besteht darin, das Diagramm direkt unter den Daten zu platzieren.
Wenn Ihre Daten in Excel‑Zeile 6 enden (nullbasierter Zeilenindex 5), beginnen Sie das Diagramm bei top_row=6:
from aspose.cells_foss import Workbook, Cell
workbook = Workbook()
ws = workbook.worksheets[0]
##Data in rows 1–5 (zero-based 0–4)
labels = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon"]
values = [30, 45, 28, 60, 52]
ws.cells["A1"].value = "Category"
ws.cells["B1"].value = "Score"
for i, (label, val) in enumerate(zip(labels, values), start=2):
ws.cells[f"A{i}"].value = label
ws.cells[f"B{i}"].value = val
##Data ends at zero-based row 5 (Excel row 6).
##Place chart from row 6 to row 22, columns A–H (0–7).
chart = ws.charts.add_bar(6, 0, 22, 7)
chart.title = "Category Scores"
chart.n_series.add("B2:B6", category_data="A2:A6", name="Score")
chart.show_legend = False
workbook.save("positioned_chart.xlsx")
print("Saved positioned_chart.xlsx")Machen Sie das Diagramm hoch genug, um lesbar zu sein: eine Höhe von mindestens 15 Zeilen
(bottom_row - top_row >= 15) und eine Breite von mindestens 6 Spalten ist ein vernünftiger
Ausgangspunkt.
Häufige Fehler
| Falsch | Richtig | Warum |
|---|---|---|
ws.charts.add(ChartType.COLUMN, ...) | ws.charts.add_bar(...) | Rufen Sie ws.charts.add(ChartType.X, ...) nicht direkt für nicht unterstützte Typen auf — es wird NotImplementedError für 11 von 16 Diagrammtypen auslösen. Verwenden Sie stattdessen add_bar(), add_line(), add_pie(), add_area() oder add_stock(). |
chart.title.text = "My Chart" | chart.title = "My Chart" | chart.title ist eine einfache Zeichenketten‑Eigenschaft, kein Objekt mit einer .text‑Unter‑Eigenschaft. |
chart.n_series.add("B2:B5", "A2:A5", "Revenue") | chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue") | Der zweite und dritte Parameter müssen als Schlüsselwort‑Argumente übergeben werden, um Mehrdeutigkeiten zu vermeiden. |
chart = ws.charts.add_bar(0, 0, 15, 7) (überlappt Daten) | Platzieren Sie top_row unter der letzten Datenzeile | Ein Diagramm, das Daten überlappt, verdeckt Werte und führt zu verwirrenden Layouts. |
chart.legend_position = "bottom" ohne chart.show_legend = True | Setzen Sie chart.show_legend = True zuerst | legend_position hat keine Wirkung, wenn show_legend False ist. |
Siehe auch
- API Reference: Vollständige Klassen‑ und Methodendokumentation für
aspose.cells_foss - Knowledge Base: Aufgabenorientierte How‑to‑Guides
- Product Overview: Zusammenfassung von Funktionen und Fähigkeiten
- Getting Started / Installation: pip install und Einrichtung
- Blog: Python Excel Chart Tutorial: Schritt‑für‑Schritt-Anleitung zur Diagrammerstellung