Работа с диаграммами
Обзор
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-level category data применяется ко всем сериям по умолчанию:
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
один раз более лаконична. Если у серий разные диапазоны категорий — например,
два набора данных с разными временными периодами — используйте аргумент
ключевого слова per-series
вместо этого.
Позиционирование диаграммы
Четыре позиционных параметра каждого метода add_* определяют ограничивающий прямоугольник на листе, измеряемый в нулевых индексах строк и столбцов:
add_bar(top_row, left_col, bottom_row, right_col)| Параметр | Значение |
|---|---|
top_row | Нулевой индекс первой строки, занятой диаграммой |
left_col | Нулевой индекс самого левого столбца |
bottom_row | Нулевой индекс последней строки, занятой диаграммой |
right_col | Нулевой индекс самого правого столбца |
Распространённый шаблон — размещать диаграмму непосредственно под данными. Если ваши данные
заканчиваются на строке Excel 6 (индекс строки с нулём 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 столбцов — разумная
отправная точка.
Типичные ошибки
| Неправильно | Правильно | Почему |
|---|---|---|
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. |
См. также
- API Reference: Полная документация классов и методов для
aspose.cells_foss - Knowledge Base: Практические руководства по выполнению задач
- Product Overview: Сводка функций и возможностей
- Getting Started / Installation: pip install и настройка
- Blog: Python Excel Chart Tutorial: Пошаговое руководство по созданию диаграмм