Настройка осей диаграмм в презентациях с помощью Python

Обзор

В этой статье объясняется, как настраивать оси диаграмм с помощью Aspose.Slides для Python через .NET. Описываются вычисляемые значения осей, переключение строк и столбцов диаграммы, видимость осей, интервалы меток категорий и делений, даты и их форматирование, вращение заголовка, позиционирование осей и единицы отображения.

Получить максимальные значения на вертикальной оси диаграмм

Создайте Presentation и добавьте областную диаграмму с данными по умолчанию. Вызовите validate_chart_layout перед чтением вычисленных значений осей, чтобы макет диаграммы был актуален.

Прочитайте actual_max_value и actual_min_value для пределов оси, а также actual_major_unit и actual_minor_unit для интервалов делений. actual_major_unit_scale и actual_minor_unit_scale предоставляют шкалы единиц времени, которые актуальны для осей даты. Пример сохраняет эти значения в локальные переменные и сохраняет диаграмму.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.AREA, 100, 100, 500, 350)
    chart.validate_chart_layout()

    max_value = chart.axes.vertical_axis.actual_max_value
    min_value = chart.axes.vertical_axis.actual_min_value

    major_unit = chart.axes.vertical_axis.actual_major_unit
    minor_unit = chart.axes.vertical_axis.actual_minor_unit

    major_unit_scale = chart.axes.vertical_axis.actual_major_unit_scale
    minor_unit_scale = chart.axes.vertical_axis.actual_minor_unit_scale

    presentation.save("AxisValues_out.pptx", slides.export.SaveFormat.PPTX)

Переместить данные между осями

Используйте switch_row_column для обмена ролями рядов и категорий в данных диаграммы. Каждая бывшая категория становится рядом, а каждый бывший ряд — категорией. Это меняет способ группировки данных; оси не меняются местами. В примере используется set_range для привязки данных по умолчанию к Sheet1!A1:D5, включая строку заголовка и столбец категорий, перед переключением строк и столбцов. Сохраняется диаграмма с четырьмя рядами и тремя категориями.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 100, 100, 400, 300)

    chart.chart_data.set_range("Sheet1!A1:D5")
    chart.chart_data.switch_row_column()

    presentation.save("SwitchChartRowColumns_out.pptx", slides.export.SaveFormat.PPTX)

Отключить вертикальную ось для линейных диаграмм

Установите is_visible в False для вертикальной оси, чтобы скрыть её. Пример создает линейную диаграмму с данными по умолчанию и сохраняет её с скрытой вертикальной осью.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.LINE, 100, 100, 400, 300)
    chart.axes.vertical_axis.is_visible = False

    presentation.save("HiddenVerticalAxis.pptx", slides.export.SaveFormat.PPTX)

Отключить горизонтальную ось для линейных диаграмм

Установите is_visible в False для горизонтальной оси, чтобы скрыть её. Пример создает линейную диаграмму с данными по умолчанию и сохраняет её с скрытой горизонтальной осью.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.LINE, 100, 100, 400, 300)
    chart.axes.horizontal_axis.is_visible = False

    presentation.save("HiddenHorizontalAxis.pptx", slides.export.SaveFormat.PPTX)

Изменить ось категорий

Установите category_axis_type для выбора оси категорий даты или текста. Этот пример требует ExistingChart.pptx, где диаграмма является первой фигурой на первом слайде, а ячейки категорий содержат числовые значения даты Excel. Он меняет горизонтальную ось на ось даты. Установка is_automatic_major_unit в False, major_unit в 1 и major_unit_scale в months размещает основные деления с интервалом один месяц.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation("ExistingChart.pptx") as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes[0]
    chart.axes.horizontal_axis.category_axis_type = charts.CategoryAxisType.DATE
    chart.axes.horizontal_axis.is_automatic_major_unit = False
    chart.axes.horizontal_axis.major_unit = 1
    chart.axes.horizontal_axis.major_unit_scale = charts.TimeUnitType.MONTHS

    presentation.save("ChangeChartCategoryAxis_out.pptx", slides.export.SaveFormat.PPTX)

Управление интервалами меток оси категорий

Когда диаграмма содержит много категорий, уменьшите количество видимых меток оси, не удаляя категории или точки данных. Установите is_automatic_tick_label_spacing в False, затем задайте tick_label_spacing желаемый интервал категорий. Для текстовых категорий в обычном порядке отсчёт начинается с первой категории:

Интервал Метки, отображаемые в примере
1 Category 1, Category 2, Category 3, … Category 24
2 Category 1, Category 3, Category 5, … Category 23
3 Category 1, Category 4, Category 7, … Category 22

Интервал 3 отображает каждую третью метку, скрывая две метки между отображаемыми. Это не удаляет соответствующие столбцы. Автоматический интервал выбирает значение на основе доступного места; он не обязателен отображать каждую метку.

Деления имеют отдельные настройки. Установите is_automatic_tick_marks_spacing в False и используйте tick_marks_spacing для задания их интервала. Например, 1 сохраняет деление на каждом интервале категории, тогда как метки отображаются только каждую третью категорию. Установите major_tick_mark в видимый стиль, чтобы увидеть результат. Возврат любого из автоматических свойств к True позволяет диаграмме снова выбрать интервал автоматически.

Следующий автономный пример создаёт 24 категории и один ряд, затем сохраняет три слайда в CategoryAxisIntervals.pptx: автоматический интервал, ручной интервал меток с независимыми делениями и восстановленный автоматический интервал. Две копии сохраняют исходные данные диаграммы. Входная презентация не требуется. Горизонтальный текст меток делает заметной разницу в плотности.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 30, 40, 660, 320)

    chart.has_legend = False
    chart.chart_data.categories.clear()
    chart.chart_data.series.clear()

    workbook = chart.chart_data.chart_data_workbook
    workbook.clear(0)

    series = chart.chart_data.series.add(charts.ChartType.CLUSTERED_COLUMN)
    for i in range(24):
        category_cell = workbook.get_cell(0, i + 1, 0, f"Category {i + 1}")
        chart.chart_data.categories.add(category_cell)
        value_cell = workbook.get_cell(0, i + 1, 1, 10 + i % 6 * 5)
        series.data_points.add_data_point_for_bar_series(value_cell)

    axis = chart.axes.horizontal_axis
    axis.category_axis_type = charts.CategoryAxisType.TEXT
    axis.text_format.text_block_format.rotation_angle = 0
    axis.text_format.portion_format.font_height = 12
    axis.major_tick_mark = charts.TickMarkType.OUTSIDE
    axis.is_automatic_tick_label_spacing = True
    axis.is_automatic_tick_marks_spacing = True

    # Слайд 2: показывать каждую третью метку, но оставлять деление для каждой категории.
    manual_slide = presentation.slides.add_clone(slide)
    manual_chart = manual_slide.shapes[0]
    manual_axis = manual_chart.axes.horizontal_axis
    manual_axis.is_automatic_tick_label_spacing = False
    manual_axis.tick_label_spacing = 3
    manual_axis.is_automatic_tick_marks_spacing = False
    manual_axis.tick_marks_spacing = 1

    # Слайд 3: позволить диаграмме снова выбрать оба интервала.
    restored_slide = presentation.slides.add_clone(manual_slide)
    restored_chart = restored_slide.shapes[0]
    restored_chart.axes.horizontal_axis.is_automatic_tick_label_spacing = True
    restored_chart.axes.horizontal_axis.is_automatic_tick_marks_spacing = True

    presentation.save("CategoryAxisIntervals.pptx", slides.export.SaveFormat.PPTX)

Автоматический интервал (слайд 1): В этом отображении каждая вторая метка категории отображается и переносится на две строки. Автоматический результат может различаться в зависимости от размера диаграммы, шрифтов и рендерера.

Automatic category label spacing with all 24 columns visible

Ручной интервал (слайд 2): Каждая третья метка отображается в одну строку, в то время как деления остаются на каждом интервале категории. Все 24 столбца, включая те, что без меток, остаются видимыми с теми же значениями. Слайд 3 восстанавливает автоматический вид, показанный выше.

Manual category label interval of three with all 24 columns visible

Выберите правильную ось и интервал

Используйте этот интервал количества категорий для текстовой оси категорий, например оси категорий столбчатой, линейной, областной или гистограммной диаграммы. В столбчатой диаграмме это горизонтальная ось. В горизонтальной гистограммной диаграмме ось категорий вертикальна, поэтому применяйте эти настройки к vertical_axis. Интервал делений также применяется к оси рядов в диаграммах, где она присутствует.

Не используйте интервал меток категорий для задания числовой шкалы оси значений. На оси значений major_unit определяет разницу в значениях: например, основной шаг 10 создаёт деления 0, 10, 20 и т.д., когда ось начинается с нуля. Интервал меток категорий 3 считается по позициям категорий, независимо от их значений. Диаграммы разброса и пузырьковые используют оси значений, а не текстовую ось категорий. Для оси даты используйте основанные на времени основные единицы и шкалы, как описано в Изменить ось категорий.

Установить формат даты для значений оси категорий

Пример заменяет данные диаграммы по умолчанию на четыре годовых значения. Даты хранятся как серийные номера OLE Automation в первом листе (индекс 0). Установите category_axis_type в ось даты, отключите is_number_format_linked_to_source и задайте yyyy для number_format, чтобы метки категорий отображали четырёхзначные годы независимо от формата ячейки.

from datetime import date

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.LINE, 50, 50, 450, 300)

    chart.chart_data.categories.clear()
    chart.chart_data.series.clear()

    workbook = chart.chart_data.chart_data_workbook
    workbook.clear(0)

    series = chart.chart_data.series.add(charts.ChartType.LINE)
    for i in range(4):
        category_date = date(2015 + i, 1, 1)
        serial_date = (category_date - date(1899, 12, 30)).days
        category_cell = workbook.get_cell(0, i + 1, 0, serial_date)
        chart.chart_data.categories.add(category_cell)

        value_cell = workbook.get_cell(0, i + 1, 1, i + 1)
        series.data_points.add_data_point_for_line_series(value_cell)

    chart.axes.horizontal_axis.category_axis_type = charts.CategoryAxisType.DATE
    chart.axes.horizontal_axis.is_number_format_linked_to_source = False
    chart.axes.horizontal_axis.number_format = "yyyy"

    presentation.save("DateAxisFormat.pptx", slides.export.SaveFormat.PPTX)

Установить угол вращения заголовка оси диаграммы

Включите has_title на вертикальной оси, укажите текст заголовка и задайте rotation_angle для его вращения. Угол измеряется в градусах; этот пример сохраняет столбчатую диаграмму с заголовком оси значений, повернутым на 90 градусов.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 50, 50, 450, 300)
    chart.axes.vertical_axis.has_title = True
    chart.axes.vertical_axis.title.add_text_frame_for_overriding("Value")
    chart.axes.vertical_axis.title.text_format.text_block_format.rotation_angle = 90

    presentation.save("RotatedAxisTitle.pptx", slides.export.SaveFormat.PPTX)

Установить позицию оси на оси категорий или значений

Используйте axis_between_categories для управления тем, пересекает ли ось значений ось категорий между категориями или на метках категорий. Это свойство применяется к осям категорий. Пример устанавливает его в True на горизонтальной оси категорий столбчатой диаграммы и сохраняет результат.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 50, 50, 450, 300)
    chart.axes.horizontal_axis.axis_between_categories = True

    presentation.save("AxisBetweenCategories.pptx", slides.export.SaveFormat.PPTX)

Установить единицу отображения на оси значений диаграммы

Установите display_unit для масштабирования меток оси значений без изменения исходных данных. При DisplayUnitType MILLIONS значение 60 000 000 отображается как 60. Пример создаёт столбчатую диаграмму и применяет единицу отображения в миллионах к её вертикальной оси.

import aspose.slides as slides
import aspose.slides.charts as charts

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    chart = slide.shapes.add_chart(charts.ChartType.CLUSTERED_COLUMN, 50, 50, 450, 300)
    chart.axes.vertical_axis.display_unit = charts.DisplayUnitType.MILLIONS

    presentation.save("Result.pptx", slides.export.SaveFormat.PPTX)

FAQ

Как задать значение, в котором одна ось пересекает другую (пересечение осей)?

Используйте cross_type для выбора поведения пересечения. Чтобы указать числовое значение пересечения, задайте cross_at. Эти параметры позволяют переместить пересечение осей к удобной базовой линии.

Как позиционировать метки делений относительно оси?

Установите tick_label_position с помощью TickLabelPositionType: LOW, HIGH, NEXT_TO или NONE. Чтобы управлять самими делениями, используйте major_tick_mark или minor_tick_mark; они независимы от позиционирования меток.