Добавить линии тренда к диаграммам презентаций в .NET
Обзор
Эта статья объясняет, как добавить линии тренда к диаграммам презентаций с использованием Aspose.Slides. Она показывает, как создать диаграмму, добавить линии тренда к сериям диаграммы и работать с несколькими типами линий тренда, включая экспоненциальные, линейные, логарифмические, скользящее среднее, полиномиальные и степенные.
Также она описывает, как добавить пользовательскую линию к диаграмме, вставив форму линии, и содержит краткий FAQ о значениях проекций линии тренда вперед и назад, а также о том, сохраняются ли линии тренда при экспорте в PDF или SVG и при рендеринге диаграмм в виде изображений.
Добавить линию тренда
Используйте ITrendlineCollection.Add для добавления линии тренда к серии диаграммы, выбирая её тип с помощью TrendlineType. Пример создаёт сгруппированную столбчатую диаграмму с данными по умолчанию и добавляет две линии тренда к каждой из её трёх серий.
Экспоненциальная линия тренда скрывает своё уравнение и значение R‑квадрата с помощью DisplayEquation и DisplayRSquaredValue, в то время как линейная линия тренда имеет красный цвет. Логарифмическая линия тренда использует AddTextFrameForOverriding для пользовательской подписи. Скользящее среднее использует Period из трёх точек данных и пользовательское TrendlineName.
Полиномиальная линия тренда имеет Order равный трём и расширяется на одну категорию вперёд с помощью Forward. Степенная линия тренда расширяется на одну категорию назад с помощью Backward.
using System.Drawing;
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, 20, 20, 500, 400);
var firstSeries = chart.ChartData.Series[0];
var exponentialTrendline = firstSeries.TrendLines.Add(TrendlineType.Exponential);
exponentialTrendline.DisplayEquation = false;
exponentialTrendline.DisplayRSquaredValue = false;
var linearTrendline = firstSeries.TrendLines.Add(TrendlineType.Linear);
linearTrendline.Format.Line.FillFormat.FillType = FillType.Solid;
linearTrendline.Format.Line.FillFormat.SolidFillColor.Color = Color.Red;
var secondSeries = chart.ChartData.Series[1];
var logarithmicTrendline = secondSeries.TrendLines.Add(TrendlineType.Logarithmic);
logarithmicTrendline.AddTextFrameForOverriding("New log trend line");
var movingAverageTrendline = secondSeries.TrendLines.Add(TrendlineType.MovingAverage);
movingAverageTrendline.Period = 3;
movingAverageTrendline.TrendlineName = "New TrendLine Name";
var thirdSeries = chart.ChartData.Series[2];
var polynomialTrendline = thirdSeries.TrendLines.Add(TrendlineType.Polynomial);
polynomialTrendline.Forward = 1;
polynomialTrendline.Order = 3;
var powerTrendline = thirdSeries.TrendLines.Add(TrendlineType.Power);
powerTrendline.Backward = 1;
presentation.Save("ChartTrendLines.pptx", SaveFormat.Pptx);
Установить пересечение линии тренда
Используйте Intercept чтобы зафиксировать значение Y линии тренда при X = 0. Эта настройка поддерживается для линейных, экспоненциальных и полиномиальных линий тренда.
Например, модель стоимости производства может потребовать начала с известных фиксированных расходов в размере 100, даже если измерения при ненулевых объёмах производства указывают другую базовую линию. Для линейной линии тренда фиксирование пересечения ограничивает уравнение y = ax + b до b = 100; наклон подбирается по данным при этом ограничении. Это не просто сдвигает уже построенную линию. Настройки пересечения осей управляют тем, где оси диаграммы встречаются, а не коэффициентами подгоняемой линии тренда.
В следующем примере создаётся точечная (XY) диаграмма с объёмами производства от 1 до 4 и затратами 170, 200, 230 и 260. Она сохраняется с автоматически рассчитываемым пересечением по умолчанию, затем пересечение устанавливается в 100 и сохраняется второй файл PPTX. Два файла отличаются только настройкой пересечения. Линия тренда отображает своё уравнение и распространяется назад до X = 0.
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.ScatterWithMarkers, 20, 20, 480, 210);
chart.HasLegend = false;
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
var nameCell = workbook.GetCell(0, 0, 1, "Production cost");
var series = chart.ChartData.Series.Add(nameCell, ChartType.ScatterWithMarkers);
double[] costs = { 170, 200, 230, 260 };
for (var i = 0; i < costs.Length; i++)
{
var xCell = workbook.GetCell(0, i + 1, 0, i + 1);
var yCell = workbook.GetCell(0, i + 1, 1, costs[i]);
series.DataPoints.AddDataPointForScatterSeries(xCell, yCell);
}
var trendline = series.TrendLines.Add(TrendlineType.Linear);
trendline.DisplayEquation = true;
trendline.Backward = 1;
presentation.Save("AutomaticIntercept.pptx", SaveFormat.Pptx);
trendline.Intercept = 100;
presentation.Save("FixedIntercept.pptx", SaveFormat.Pptx);
При автоматическом расчёте эти данные дают y = 30x + 140. Установка пересечения в 100 вместо этого дает приблизительно y = 43.33x + 100: подгоняемое значение при нуле соответствует известной базовой линии, тогда как линия больше не проходит через каждую точку данных.
| Автоматическое пересечение | Фиксированное пересечение 100 |
|---|---|
![]() |
![]() |
Обе изображения используют одни и те же данные и масштабы осей. Линии тренда расширены назад до X = 0, чтобы показать их пересечения.
По умолчанию свойство содержит double.NaN, что означает неуказанное пересечение, а не ноль. Затем пересечение рассчитывается автоматически из данных.
Добавить пользовательскую линию
Пользовательская линия — это форма, нарисованная поверх диаграммы, а не линия тренда, вычисленная из данных серии. В этом примере используется IShapeCollection.AddAutoShape для добавления горизонтальной линии на слайд над диаграммой. Позиция линии задаётся в координатах слайда, измеряемых в пунктах, поэтому она начинается от левого края диаграммы и располагается на полпути вниз по диаграмме. Её ширина совпадает с шириной диаграммы. LineFormat задает линии сплошной красный цвет.
using System.Drawing;
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, 500, 400);
var line = slide.Shapes.AddAutoShape(ShapeType.Line, chart.X, chart.Y + chart.Height / 2, chart.Width, 0);
line.LineFormat.FillFormat.FillType = FillType.Solid;
line.LineFormat.FillFormat.SolidFillColor.Color = Color.Red;
presentation.Save("AddCustomLines.pptx", SaveFormat.Pptx);
FAQ
Что означают «forward» и «backward» для линии тренда?
Это длина линии тренда, проецируемой вперёд/назад: для точечных (XY) диаграмм — в единицах оси; для остальных диаграмм — в количествах категорий. Допустимы только неотрицательные значения.
Сохранится ли линия тренда при экспорте презентации в PDF или SVG, или при рендеринге слайда в изображение?
Да. Aspose.Slides преобразует презентации в PDF или SVG и рендерит диаграммы в изображения; линии тренда, как часть диаграммы, сохраняются во время этих операций. Также доступен метод для экспорта изображения диаграммы.

