在 .NET 中自定义演示文稿的图表轴

概述

本文说明如何使用 Aspose.Slides for .NET 自定义图表轴。内容包括计算轴值、切换图表行列、轴可见性、类目标签和刻度间隔、日期类目及格式、标题旋转、轴定位以及显示单位。

获取图表垂直轴的最大值

创建一个 Presentation 并添加一个带默认数据的面积图。读取计算轴值之前调用 ValidateChartLayout 以确保图表布局是最新的。

读取轴限制的 ActualMaxValue 和 ActualMinValue,以及刻度间隔的 ActualMajorUnit 和 ActualMinorUnit。ActualMajorUnitScale 和 ActualMinorUnitScale 提供时间单位的比例,这在日期轴中相关。示例将这些值存储在局部变量中并保存图表。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Area, 100, 100, 500, 350);
chart.ValidateChartLayout();

var maxValue = chart.Axes.VerticalAxis.ActualMaxValue;
var minValue = chart.Axes.VerticalAxis.ActualMinValue;

var majorUnit = chart.Axes.VerticalAxis.ActualMajorUnit;
var minorUnit = chart.Axes.VerticalAxis.ActualMinorUnit;

var majorUnitScale = chart.Axes.VerticalAxis.ActualMajorUnitScale;
var minorUnitScale = chart.Axes.VerticalAxis.ActualMinorUnitScale;

presentation.Save("AxisValues_out.pptx", SaveFormat.Pptx);

在轴之间交换数据

使用 SwitchRowColumn 交换图表数据中系列和类目的角色。每个原来的类目变为系列,每个原来的系列变为类目。这会改变数据的分组方式,但不会交换水平和垂直轴。示例使用 SetRange 将默认数据绑定到 Sheet1!A1:D5(包括标题行和类目列),然后切换行列。它保存了一个具有四个系列和三个类目的图表。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 100, 100, 400, 300);

chart.ChartData.SetRange("Sheet1!A1:D5");
chart.ChartData.SwitchRowColumn();

presentation.Save("SwitchChartRowColumns_out.pptx", SaveFormat.Pptx);

禁用折线图的垂直轴

将垂直轴的 IsVisible 设置为 false 以隐藏它。示例创建一个带默认数据的折线图并在垂直轴隐藏的情况下保存。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Line, 100, 100, 400, 300);
chart.Axes.VerticalAxis.IsVisible = false;

presentation.Save("HiddenVerticalAxis.pptx", SaveFormat.Pptx);

禁用折线图的水平轴

将水平轴的 IsVisible 设置为 false 以隐藏它。示例创建一个带默认数据的折线图并在水平轴隐藏的情况下保存。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Line, 100, 100, 400, 300);
chart.Axes.HorizontalAxis.IsVisible = false;

presentation.Save("HiddenHorizontalAxis.pptx", SaveFormat.Pptx);

更改类目轴

将 CategoryAxisType 设置为选择日期或文本类目轴。此示例需要 ExistingChart.pptx,其中第一张幻灯片的第一形状是图表,类目单元格包含数值型 Excel 日期。它将水平轴更改为日期轴。将 IsAutomaticMajorUnit 设置为 false,MajorUnit 设置为 1,并将 MajorUnitScale 设置为月份,可使主刻度每月一次。

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("ExistingChart.pptx");
var slide = presentation.Slides[0];

var chart = (IChart) slide.Shapes[0];
chart.Axes.HorizontalAxis.CategoryAxisType = CategoryAxisType.Date;
chart.Axes.HorizontalAxis.IsAutomaticMajorUnit = false;
chart.Axes.HorizontalAxis.MajorUnit = 1;
chart.Axes.HorizontalAxis.MajorUnitScale = TimeUnitType.Months;

presentation.Save("ChangeChartCategoryAxis_out.pptx", SaveFormat.Pptx);

控制类目轴标签间隔

当图表拥有大量类目时,可在不删除类目或数据点的前提下减少可见轴标签的数量。将 IsAutomaticTickLabelSpacing 设置为 false,随后将 TickLabelSpacing 设置为所需的类目间隔。对于按正常顺序排列的文本类目,计数从第一个类目开始:

间隔 示例中显示的标签
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 的间隔会显示每第三个标签,显示的标签之间会隐藏两个标签。它不会删除对应的列。自动间隔会根据可用空间选择间隔;不一定会显示每个标签。

刻度线拥有独立的控制。将 IsAutomaticTickMarksSpacing 设置为 false 并使用 TickMarksSpacing 来设定其间隔。例如,1 可在每个类目间隔处保留刻度线,而标签仅每三个类目显示一次。将 MajorTickMark 设置为可见样式以便观察结果。将任一自动间隔属性重新设为 true 可让图表再次自动选择间隔。

以下自包含示例创建 24 个类目和一个系列,然后在 CategoryAxisIntervals.pptx 中保存三张幻灯片:自动间隔、手动标签间隔且刻度线独立,以及恢复自动间隔。两份副本保留原始图表数据。无需输入演示文稿。水平标签文本使密度差异一目了然。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 30, 40, 660, 320);

chart.HasLegend = false;
chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();

var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);

var series = chart.ChartData.Series.Add(ChartType.ClusteredColumn);
for (var i = 0; i < 24; i++)
{
    var categoryCell = workbook.GetCell(0, i + 1, 0, $"Category {i + 1}");
    chart.ChartData.Categories.Add(categoryCell);
    var valueCell = workbook.GetCell(0, i + 1, 1, 10 + i % 6 * 5);
    series.DataPoints.AddDataPointForBarSeries(valueCell);
}

var axis = chart.Axes.HorizontalAxis;
axis.CategoryAxisType = CategoryAxisType.Text;
axis.TextFormat.TextBlockFormat.RotationAngle = 0;
axis.TextFormat.PortionFormat.FontHeight = 12;
axis.MajorTickMark = TickMarkType.Outside;
axis.IsAutomaticTickLabelSpacing = true;
axis.IsAutomaticTickMarksSpacing = true;

// 幻灯片 2:显示每三个标签,但为每个类目保留刻度标记。
var manualSlide = presentation.Slides.AddClone(slide);
var manualChart = (IChart)manualSlide.Shapes[0];
var manualAxis = manualChart.Axes.HorizontalAxis;
manualAxis.IsAutomaticTickLabelSpacing = false;
manualAxis.TickLabelSpacing = 3;
manualAxis.IsAutomaticTickMarksSpacing = false;
manualAxis.TickMarksSpacing = 1;

// 幻灯片 3:让图表重新自动选择标签和刻度间隔。
var restoredSlide = presentation.Slides.AddClone(manualSlide);
var restoredChart = (IChart)restoredSlide.Shapes[0];
restoredChart.Axes.HorizontalAxis.IsAutomaticTickLabelSpacing = true;
restoredChart.Axes.HorizontalAxis.IsAutomaticTickMarksSpacing = true;

presentation.Save("CategoryAxisIntervals.pptx", SaveFormat.Pptx);

自动间距(幻灯片 1): 在此渲染中,每第二个类目标签会显示并换行至两行。自动结果可能会随图表大小、字体和渲染器而变化。

自动类目标签间距,显示全部 24 列

手动间距(幻灯片 2): 每第三个标签显示在一行上,而刻度线仍保持在每个类目间隔。所有 24 列(包括未标记的列)仍可见且值保持不变。幻灯片 3 恢复了上图的自动外观。

手动类目标签间隔为三,显示全部 24 列

选择正确的轴和间隔

对于文本类目轴(如柱形图、折线图、面积图或条形图的类目轴)使用此类目计数间隔。在柱形图中,它是水平轴;在水平条形图中,类目轴是垂直的,因此请将这些设置应用于 VerticalAxis。刻度间隔同样适用于具有系列轴的图表。

不要使用类目标签间隔来设置数值轴的数字刻度。在数值轴上,MajorUnit 指定数值差异,例如 10 的主单位会在 0、10、20 等位置生成刻度,当轴从零开始时。类目标签间隔 3 则是按类目位置计数, 与其数据值无关。散点图和气泡图使用数值轴而非文本类目轴。对于日期轴,请使用在 更改类目轴 中描述的基于时间的主单位和比例。

设置类目轴值的日期格式

示例用四个年度值替换默认图表数据。日期以 OLE Automation 序列号存储在第一个工作表(索引 0)中。将 CategoryAxisType 设置为日期轴,禁用 IsNumberFormatLinkedToSource,并将 yyyy 赋给 NumberFormat,使类目标签显示四位年份且不受单元格格式影响。

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Line, 50, 50, 450, 300);

chart.ChartData.Categories.Clear();
chart.ChartData.Series.Clear();

var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);

var series = chart.ChartData.Series.Add(ChartType.Line);
for (var i = 0; i < 4; i++)
{
    var date = new DateTime(2015 + i, 1, 1);
    var categoryCell = workbook.GetCell(0, i + 1, 0, date.ToOADate());
    chart.ChartData.Categories.Add(categoryCell);

    var valueCell = workbook.GetCell(0, i + 1, 1, i + 1);
    series.DataPoints.AddDataPointForLineSeries(valueCell);
}

chart.Axes.HorizontalAxis.CategoryAxisType = CategoryAxisType.Date;
chart.Axes.HorizontalAxis.IsNumberFormatLinkedToSource = false;
chart.Axes.HorizontalAxis.NumberFormat = "yyyy";

presentation.Save("DateAxisFormat.pptx", SaveFormat.Pptx);

为图表轴标题设置旋转角度

在垂直轴上启用 HasTitle,提供标题文本,并将 RotationAngle 设置为旋转标题。角度以度为单位;本示例将柱形图的数值轴标题旋转 90 度后保存。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
chart.Axes.VerticalAxis.HasTitle = true;
chart.Axes.VerticalAxis.Title.AddTextFrameForOverriding("Value");
chart.Axes.VerticalAxis.Title.TextFormat.TextBlockFormat.RotationAngle = 90;

presentation.Save("RotatedAxisTitle.pptx", SaveFormat.Pptx);

在类目轴或数值轴上设置轴位置

使用 AxisBetweenCategories 控制数值轴是跨越类目轴之间还是在类目刻度线处交叉。此属性适用于类目轴。示例在柱形图的水平类目轴上将其设为 true 并保存结果。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
chart.Axes.HorizontalAxis.AxisBetweenCategories = true;

presentation.Save("AxisBetweenCategories.pptx", SaveFormat.Pptx);

在图表数值轴上设置显示单位

将 DisplayUnit 设置为在不更改底层数据的情况下缩放数值轴标签。将 DisplayUnitType 设为 Millions,则 60,000,000 会显示为 60。示例创建一个柱形图并将其垂直轴的显示单位设为百万。

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
chart.Axes.VerticalAxis.DisplayUnit = DisplayUnitType.Millions;

presentation.Save("Result.pptx", SaveFormat.Pptx);

FAQ

如何设置一个轴交叉另一个轴的数值(轴交叉点)?

使用 CrossType 选择交叉行为。若要指定数值交叉点,设置 CrossAt。这些设置可让你将轴交叉移动到合适的基准线上。

如何相对于轴定位刻度标签?

使用 TickLabelPosition 并结合 TickLabelPositionType:Low、High、NextTo 或 None。若要控制刻度线本身,请使用 MajorTickMark 或 MinorTickMark,它们与标签位置分离。