Работа с диаграми

Преглед

Aspose.Cells FOSS използва API, базирано на метод за всеки тип диаграма. Вместо общо извикване add(ChartType.X, ...), всеки тип диаграма има собствен специализиран метод в колекцията charts на работния лист:

МетодТип диаграма
ws.charts.add_bar(top_row, left_col, bottom_row, right_col)Групирана колона (стълбовидна диаграма)
ws.charts.add_line(top_row, left_col, bottom_row, right_col)Линия
ws.charts.add_pie(top_row, left_col, bottom_row, right_col)Кръгова
ws.charts.add_area(top_row, left_col, bottom_row, right_col)Област

Всички четири позиционни параметъра описват правоъгълната област в листа, където графиката ще бъде вградена. Индексите на редовете и колоните са нулево-базирани. Всеки метод връща обект Chart, който можете да конфигурирате допълнително преди запазване.

Ограничение: Само типове диаграми LINE, BAR, PIE, AREA и STOCK могат да се запазват в XLSX. Извикването на wb.save() с работна книга, която съдържа друг тип диаграма (например SCATTER, WATERFALL, RADAR, TREEMAP, HISTOGRAM) ще предизвика NotImplementedError.


Добавяне на колонна диаграма

Примерът по-долу записва малък набор от данни за приходите по продукти и след това добавя колонна диаграма, разположена под данните.

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")

Данните заемат редове 1–6 (редове с нулева индексация 0–5), така че top_row=6 поставя диаграмата непосредствено под тях, без да се припокрива с данните.


Добавяне на линейна диаграма

Линейните диаграми са подходящи за показване на тенденции във времето. Подписът на извикването е идентичен на add_bar — само името на метода се променя.

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")

Заглавие на диаграмата и легенда

Задайте заглавието на диаграмата, като присвоите обикновен низ директно на chart.title. Свойството приема str — не се опитвайте да достъпвате под‑свойство като .title.text, което не съществува в тази библиотека.

##Correct
chart.title = "Quarterly Sales"

##Wrong — raises AttributeError
##chart.title.text = "Quarterly Sales"

Видимостта и позицията на легендата се контролират от две свойства:

chart.show_legend = True          # display the legend
chart.legend_position = "bottom"  # "bottom", "top", "left", "right"

За да скриете легендата изцяло, задайте chart.show_legend = False. Стойността legend_position се игнорира, когато легендата е скрита.


Конфигурация на серия от данни

Използвайте chart.n_series.add(), за да прикрепите диапазони от данни към диаграма. Предавайте всички аргументи като ключови аргументи, за да избегнете объркване с позиционния ред:

chart.n_series.add("B2:B6", category_data="A2:A6", name="Revenue")

Можете да добавяте множество серии към една диаграма, като извикате n_series.add повече от веднъж. Всяко извикване добавя нова серия:

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")

Данни за категория

Етикетите за категории могат да се задават на ниво диаграма или на ниво отделна серия.

Данните за категории на ниво диаграма се прилагат за всички серии по подразбиране:

chart.category_data = "A2:A5"

Данни за категория на ниво серия (чрез аргумента за ключова дума category_data към n_series.add) заменят настройката на ниво диаграма за конкретната серия:

chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")

Когато всяка серия споделя един и същи диапазон на категориите, задаването на chart.category_data еднократно е по‑кратко. Когато сериите имат различни диапазони на категориите — например, два набора от данни с различни периоди — използвайте аргумента за ключова дума за всяка серия вместо това.


Позициониране на диаграмата

Четирите позиционни параметъра на всеки add_* метод определят ограничителен правоъгълник в листа, измерен в индекси на редове и колони, започващи от нула:

add_bar(top_row, left_col, bottom_row, right_col)
ParameterMeaning
top_rowНулево-базиран индекс на първия ред, зает от диаграмата
left_colНулево-базиран индекс на най-лявата колона
bottom_rowНулево-базиран индекс на последния ред, зает от диаграмата
right_colНулево-базиран индекс на най-дясната колона

Обича се да се поставя диаграмата директно под данните. Ако вашите данни завършват на ред 6 в Excel (индекс на реда, започващ от 0, е 5), започнете диаграмата на 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")

Направете диаграмата достатъчно висока, за да бъде четлива: височина поне 15 реда
(bottom_row - top_row >= 15) и ширина поне 6 колони е разумна
начална точка.


Чести грешки

WrongRightWhy
ws.charts.add(ChartType.COLUMN, ...)ws.charts.add_bar(...)Не извиквайте ws.charts.add(ChartType.X, ...) директно за неподдържани типове — ще предизвика NotImplementedError за 11 от 16 типа диаграми. Вместо това използвайте add_bar(), add_line(), add_pie(), add_area() или add_stock().
chart.title.text = "My Chart"chart.title = "My Chart"chart.title е обикновено свойство от тип низ, а не обект с подпомощно свойство .text.
chart.n_series.add("B2:B5", "A2:A5", "Revenue")chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")Вторият и третият параметър трябва да се предават като аргументи с име, за да се избегне двусмислие.
chart = ws.charts.add_bar(0, 0, 15, 7) (препокрива данни)Поставете top_row под последния ред с данниДиаграма, която препокрива данните, скрива стойностите и причинява объркващи оформления.
chart.legend_position = "bottom" без chart.show_legend = TrueЗадайте chart.show_legend = True първоlegend_position няма ефект, когато show_legend е False.

Виж също

 Български