Как создавать диаграммы в Excel с помощью Python

Как создавать диаграммы в Excel с помощью Python

Диаграммы превращают необработанные данные таблицы в визуальные инсайты. Aspose.Cells FOSS for Python позволяет программно создавать столбчатые, линейные, гистограммы и круговые диаграммы, полностью контролируя серии данных, подписи категорий, заголовок диаграммы и её положение, без необходимости использования Microsoft Excel.

Почему создавать диаграммы с помощью Aspose.Cells FOSS?

  1. Не требуется Excel: Создавайте диаграммы полностью на Python, на любой ОС.
  2. API «метод‑по‑типу»: Используйте add_bar(), add_line(), add_pie(), add_area() и другие — один метод на тип диаграммы.
  3. Именованные серии: Настраивайте каждую серию с помощью аргументов name=, category_data=.
  4. Точное размещение: Управляйте границами диаграммы с помощью координат ячеек (top_row, left_col, bottom_row, right_col).

Пошаговое руководство

Шаг 1: Установите Aspose.Cells FOSS для Python

pip install aspose-cells-foss

Шаг 2: Создать рабочую книгу и заполнить данные

Создайте новую книгу и запишите числовые данные вместе с метками категорий в ячейки:

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]
ws.name = "Sales Data"

##Category labels in column A (rows 2-5, leaving row 1 for a header)
ws.cells["A1"].value = "Quarter"
ws.cells["A2"].value = "Q1"
ws.cells["A3"].value = "Q2"
ws.cells["A4"].value = "Q3"
ws.cells["A5"].value = "Q4"

##Revenue series in column B
ws.cells["B1"].value = "Revenue"
ws.cells["B2"].value = 50000
ws.cells["B3"].value = 62000
ws.cells["B4"].value = 71000
ws.cells["B5"].value = 89000

##Expense series in column C
ws.cells["C1"].value = "Expenses"
ws.cells["C2"].value = 32000
ws.cells["C3"].value = 38000
ws.cells["C4"].value = 41000
ws.cells["C5"].value = 47000

Шаг 3: Добавить столбчатую диаграмму

Используйте ws.charts.add_bar(top_row, left_col, bottom_row, right_col) для вставки столбчатой диаграммы. Метод возвращает объект диаграммы напрямую:

##Insert a column chart occupying rows 7-22, columns 0-7
chart = ws.charts.add_bar(6, 0, 22, 7)

Индексы строк и столбцов начинаются с нуля.


Шаг 4: Настройка серии данных

Добавьте каждый набор данных, используя chart.n_series.add() с аргументами ключевых слов:

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

##Add Expenses series
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")

Аргумент category_data указывает диапазон ячеек для меток оси X. Аргумент name задает подпись легенды серии.


Шаг 5: Установить заголовок диаграммы и данные категорий

Установите заголовок диаграммы как обычную строку:

chart.title = "Quarterly Sales vs Expenses"
chart.category_data = "A2:A5"   # x-axis labels at chart level
chart.show_legend = True
chart.legend_position = "bottom"

Шаг 6: Сохранить рабочую книгу

workbook.save("sales_chart.xlsx")
print("Workbook with chart saved.")

Пример полного столбчатого графика:

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]

##Data
labels = ["Q1", "Q2", "Q3", "Q4"]
revenue = [50000, 62000, 71000, 89000]
expenses = [32000, 38000, 41000, 47000]

ws.cells["A1"].value = "Quarter"
ws.cells["B1"].value = "Revenue"
ws.cells["C1"].value = "Expenses"

for i, (label, rev, exp) in enumerate(zip(labels, revenue, expenses), start=2):
    ws.cells[f"A{i}"].value = label
    ws.cells[f"B{i}"].value = rev
    ws.cells[f"C{i}"].value = exp

chart = ws.charts.add_bar(6, 0, 22, 7)
chart.title = "Quarterly Sales vs Expenses"
chart.category_data = "A2:A5"
chart.n_series.add("B2:B5", category_data="A2:A5", name="Revenue")
chart.n_series.add("C2:C5", category_data="A2:A5", name="Expenses")
chart.show_legend = True
chart.legend_position = "bottom"

workbook.save("quarterly_chart.xlsx")

Шаг 7: Создать линейный график

Тот же шаблон работает для add_line():

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
revenue = [42000, 47500, 53000, 49000, 61000, 68000]

ws.cells["A1"].value = "Month"
ws.cells["B1"].value = "Revenue"

for i, (m, r) in enumerate(zip(months, revenue), start=2):
    ws.cells[f"A{i}"].value = m
    ws.cells[f"B{i}"].value = r

chart = ws.charts.add_line(8, 0, 24, 8)
chart.title = "Monthly Revenue Trend"
chart.category_data = "A2:A7"
chart.n_series.add("B2:B7", category_data="A2:A7", name="Revenue")
chart.show_legend = True

workbook.save("trend_chart.xlsx")

Распространённые проблемы и решения

1. Диаграмма отображается пустой или пустой

Cause: Диапазон данных, переданный в n_series.add(), не содержит значений, либо строка диапазона ячеек неверна.
Fix: Убедитесь, что диапазон ячеек соответствует вашим данным. Проверьте, что ws.cells["B2"].value не является None.

2. Метки категорий не отображаются на оси X

Cause: chart.category_data не был установлен, или диапазон указывает на пустые ячейки.
Fix: Установите chart.category_data = "A2:A5", где столбец A содержит строки меток.

3. Позиция диаграммы перекрывает данные

Причина: Границы строк в add_bar() перекрывают область данных.
Решение: Разместите диаграмму ниже данных: ws.charts.add_bar(data_last_row + 2, 0, data_last_row + 18, 7).

4. AttributeError: 'ChartCollection' object has no attribute 'add'

Причина: Библиотека FOSS использует API «метод‑по‑типу», а не add(ChartType.COLUMN, ...).
Исправление: Используйте ws.charts.add_bar(...), ws.charts.add_line(...), ws.charts.add_pie(...) или ws.charts.add_area(...).


Часто задаваемые вопросы

Какие типы диаграмм поддерживаются?

Используйте add_bar(), add_line(), add_pie(), add_area() и add_stock() для наиболее распространённых типов. Эти пять имеют полную поддержку XML‑сериализации. Проверьте класс ChartCollection для полного списка доступных методов add_*.

Могу ли я создавать диаграммы в существующем файле Excel?

Да. Загрузите книгу с Workbook("existing.xlsx"), откройте целевой лист и добавьте диаграмму, используя соответствующий метод ws.charts.add_*().

Как установить заголовок диаграммы?

Назначьте простую строку: chart.title = "My Chart Title". Под‑свойства .text нет: заголовок — это сама строка.

Совместим ли этот подход с pandas?

Да. Запишите значения pandas DataFrame в ячейки в цикле, затем добавьте диаграмму над этим диапазоном данных.


Связанные ресурсы:

 Русский