Lägg till trendlinjer i presentationsdiagram i C++
Översikt
Den här artikeln förklarar hur man lägger till trendlinjer i presentationsdiagram med Aspose.Slides. Den visar hur man skapar ett diagram, lägger till trendlinjer i diagramserier och arbetar med flera trendlinjetyper, inklusive exponentiell, linjär, logaritmisk, glidande medelvärde, polynom och potens.
Den beskriver också hur man lägger till en anpassad linje i ett diagram genom att infoga en linjeform, och innehåller en kort FAQ om framåt‑ och bakåtriktade trendlinjeprojektioner samt huruvida trendlinjer bevaras vid export till PDF eller SVG och när diagram renderas som bilder.
Lägg till en trendlinje
Använd ITrendlineCollection::Add för att lägga till en trendlinje i en diagramserie och välj dess typ med TrendlineType. Exemplet skapar ett stapeldiagram med grupperade kolumner med standarddata och lägger till två trendlinjer för var och en av dess tre serier.
Den exponentiella trendlinjen döljer sin ekvation och R‑kvadrat‑värde via ITrendline::set_DisplayEquation och ITrendline::set_DisplayRSquaredValue, medan den linjära trendlinjen är röd. Den logaritmiska trendlinjen använder IOverridableText::AddTextFrameForOverriding för en anpassad etikett. Glidande medelvärde använder ITrendline::set_Period för att genomsnittligt tre datapunkter och ITrendline::set_TrendlineName för ett anpassat namn.
Den polynomiska trendlinjen använder ITrendline::set_Order för att sätta dess grad till tre och utökar en kategori framåt via ITrendline::set_Forward. Den potens‑trendlinjen utökar en kategori bakåt via ITrendline::set_Backward.
#include <system/shared_ptr.h>
#include <drawing/color.h>
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ILineFormat.h>
#include <DOM/IFillFormat.h>
#include <DOM/IColorFormat.h>
#include <DOM/FillType.h>
#include <DOM/IChart.h>
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/ITrendline.h>
#include <DOM/Chart/ITrendlineCollection.h>
#include <DOM/Chart/TrendlineType.h>
#include <DOM/Chart/IFormat.h>
#include <Export/SaveFormat.h>
using namespace System;
using namespace System::Drawing;
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 20, 20, 500, 400);
auto firstSeries = chart->get_ChartData()->get_Series()->idx_get(0);
auto exponentialTrendline = firstSeries->get_TrendLines()->Add(TrendlineType::Exponential);
exponentialTrendline->set_DisplayEquation(false);
exponentialTrendline->set_DisplayRSquaredValue(false);
auto linearTrendline = firstSeries->get_TrendLines()->Add(TrendlineType::Linear);
linearTrendline->get_Format()->get_Line()->get_FillFormat()->set_FillType(FillType::Solid);
linearTrendline->get_Format()->get_Line()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
auto secondSeries = chart->get_ChartData()->get_Series()->idx_get(1);
auto logarithmicTrendline = secondSeries->get_TrendLines()->Add(TrendlineType::Logarithmic);
logarithmicTrendline->AddTextFrameForOverriding(u"New log trend line");
auto movingAverageTrendline = secondSeries->get_TrendLines()->Add(TrendlineType::MovingAverage);
movingAverageTrendline->set_Period(3);
movingAverageTrendline->set_TrendlineName(u"New TrendLine Name");
auto thirdSeries = chart->get_ChartData()->get_Series()->idx_get(2);
auto polynomialTrendline = thirdSeries->get_TrendLines()->Add(TrendlineType::Polynomial);
polynomialTrendline->set_Forward(1);
polynomialTrendline->set_Order(3);
auto powerTrendline = thirdSeries->get_TrendLines()->Add(TrendlineType::Power);
powerTrendline->set_Backward(1);
presentation->Save(u"ChartTrendLines.pptx", SaveFormat::Pptx);
Ange intercept för en trendlinje
Använd ITrendline::set_Intercept för att fixera en trendlinjes Y‑värde vid X = 0. Denna inställning stöds för linjära, exponentiella och polynomiska trendlinjer.
Till exempel kan en produktionskostnadsmodell behöva börja med kända fasta kostnader på 100, även om mätningar vid icke‑noll produktionsvolymer antyder ett annat grundvärde. För en linjär trendlinje begränsar man interceptet ekvationen y = ax + b till b = 100; lutningen anpassas till data under den begränsningen. Det flyttar inte bara en redan anpassad linje. Axelkorsningsinställningar styr var diagramaxlarna möts, inte koefficienterna för den anpassade trendlinjen.
Följande exempel skapar ett spridnings‑ (XY‑)diagram med produktionsvolymer från 1 till 4 och kostnader på 170, 200, 230 och 260. Det sparar diagrammet med standard‑intercept, sätter interceptet till 100 och sparar ett andra PPTX. De två filerna skiljer sig endast i interceptinställningen. Trendlinjen visar sin ekvation och sträcker sig tillbaka till X = 0.
#include <system/shared_ptr.h>
#include <system/object_ext.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartCategoryCollection.h>
#include <DOM/Chart/IChartDataPointCollection.h>
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IChart.h>
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/ITrendline.h>
#include <DOM/Chart/ITrendlineCollection.h>
#include <DOM/Chart/TrendlineType.h>
#include <Export/SaveFormat.h>
using namespace System;
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ScatterWithMarkers, 20, 20, 480, 210);
chart->set_HasLegend(false);
chart->get_ChartData()->get_Series()->Clear();
chart->get_ChartData()->get_Categories()->Clear();
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();
workbook->Clear(0);
auto nameCell = workbook->GetCell(0, 0, 1, ObjectExt::Box<String>(u"Production cost"));
auto series = chart->get_ChartData()->get_Series()->Add(nameCell, ChartType::ScatterWithMarkers);
const double costs[] = { 170, 200, 230, 260 };
for (auto i = 0; i < 4; i++)
{
auto xCell = workbook->GetCell(0, i + 1, 0, ObjectExt::Box<int32_t>(i + 1));
auto yCell = workbook->GetCell(0, i + 1, 1, ObjectExt::Box<double>(costs[i]));
series->get_DataPoints()->AddDataPointForScatterSeries(xCell, yCell);
}
auto trendline = series->get_TrendLines()->Add(TrendlineType::Linear);
trendline->set_DisplayEquation(true);
trendline->set_Backward(1);
presentation->Save(u"AutomaticIntercept.pptx", SaveFormat::Pptx);
trendline->set_Intercept(100);
presentation->Save(u"FixedIntercept.pptx", SaveFormat::Pptx);
Med automatisk beräkning ger dessa data y = 30x + 140. Att sätta interceptet till 100 istället ger ungefär y = 43.33x + 100: det anpassade värdet vid noll matchar det kända grundvärdet, medan linjen inte längre passerar genom varje datapunkt.
| Automatisk intercept | Fast intercept på 100 |
|---|---|
![]() |
![]() |
Båda bilderna använder samma data och axelskala. Trendlinjerna är utökade tillbaka till X = 0 för att visa deras intercept.
Som standard innehåller egenskapen std::numeric_limits<double>::quiet_NaN(), vilket representerar ett ospecificerat intercept snarare än noll. Interceptet beräknas sedan automatiskt från data.
Lägg till en anpassad linje
En anpassad linje är en form som ritas över diagrammet snarare än en trendlinje beräknad från seriedata. Detta exempel använder IShapeCollection::AddAutoShape för att lägga till en horisontell linje på bilden ovanför diagrammet. Linjens position anges i bildens koordinater, mätt i punkter, så den börjar vid diagrammets vänstra kant och ligger halvvägs ner i diagrammet. Dess bredd matchar diagrammets bredd. Linjeformatet som returneras av IShape::get_LineFormat ger linjen en solid röd färg.
#include <system/shared_ptr.h>
#include <drawing/color.h>
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IAutoShape.h>
#include <DOM/ShapeType.h>
#include <DOM/ILineFormat.h>
#include <DOM/IFillFormat.h>
#include <DOM/IColorFormat.h>
#include <DOM/FillType.h>
#include <DOM/IChart.h>
#include <DOM/Chart/ChartType.h>
#include <Export/SaveFormat.h>
using namespace System;
using namespace System::Drawing;
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 100, 100, 500, 400);
auto line = slide->get_Shapes()->AddAutoShape(ShapeType::Line, chart->get_X(), chart->get_Y() + chart->get_Height() / 2, chart->get_Width(), 0);
line->get_LineFormat()->get_FillFormat()->set_FillType(FillType::Solid);
line->get_LineFormat()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
presentation->Save(u"AddCustomLines.pptx", SaveFormat::Pptx);
FAQ
Vad betyder ‘forward’ och ‘backward’ för en trendlinje?
De är längderna på trendlinjen som projiceras framåt/bakåt: för spridnings‑ (XY‑)diagram – i axelenheter; för icke‑spridningsdiagram – i antal kategorier. Endast icke‑negativa värden är tillåtna.
Kommer trendlinjen att bevaras vid export av presentationen till PDF eller SVG, eller vid rendering av en bild?
Ja. Aspose.Slides konverterar presentationer till PDF eller SVG och renderar diagram till bilder; trendlinjer, som en del av diagrammet, bevaras under dessa operationer. En metod finns också för att exportera en bild av diagrammet självt.

