Настройка осей диаграмм в презентациях с помощью 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): В этом отображении каждая вторая метка категории отображается и переносится на две строки. Автоматический результат может различаться в зависимости от размера диаграммы, шрифтов и рендерера.

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

Выберите правильную ось и интервал
Используйте этот интервал количества категорий для текстовой оси категорий, например оси категорий столбчатой, линейной, областной или гистограммной диаграммы. В столбчатой диаграмме это горизонтальная ось. В горизонтальной гистограммной диаграмме ось категорий вертикальна, поэтому применяйте эти настройки к 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; они независимы от позиционирования меток.