Trendvonalak hozzáadása prezentáció diagramokhoz C++-ban

Áttekintés

Ez a cikk bemutatja, hogyan adhatunk trendvonalakat a bemutató diagramokhoz az Aspose.Slides használatával. Megmutatja, hogyan hozzunk létre diagramot, hogyan adjunk trendvonalakat a diagram sorozataihoz, és a különböző trendvonal típusokkal dolgozzunk, beleértve az exponenciális, lineáris, logaritmikus, mozgó átlag, polinomiális és hatvány típusúakat.

Leírja továbbá, hogyan adhatunk egy egyéni vonalat a diagramhoz egy vonal alakzat beszúrásával, valamint egy rövid GYIK-ot tartalmaz a trendvonal előre és hátra vetített értékeiről, valamint arról, hogy a trendvonalak megmaradnak-e PDF vagy SVG export során és a diagramok képként történő megjelenítésekor.

Trendvonal hozzáadása

Használja a ITrendlineCollection::Add metódust trendvonal hozzáadásához egy diagram sorozathoz, a típus kiválasztásához a TrendlineType segítségét. Az példa egy alapértelmezett adatokkal rendelkező csoportosított oszlopdiagramot hoz létre, és minden három sorozatához két trendvonalat ad hozzá.

Az exponenciális trendvonal elrejti egyenletét és R-négyzet értékét a ITrendline::set_DisplayEquation és a ITrendline::set_DisplayRSquaredValue segítségével, míg a lineáris trendvonal piros. A logaritmikus trendvonal a IOverridableText::AddTextFrameForOverriding használja egy egyedi címke létrehozásához. A mozgó átlag a ITrendline::set_Period használja három adatpont átlagolásához, és a ITrendline::set_TrendlineName egyedi névhez.

A polinomiális trendvonal a ITrendline::set_Order segítségével állítja be a háromfokú fokszámot, és egy kategóriával előre nyúlik a ITrendline::set_Forward. A hatvány trendvonal egy kategóriával hátra nyúlik a 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);

Trendvonal metszéspont beállítása

Használja a ITrendline::set_Intercept metódust a trendvonal Y értékének X = 0-nál rögzítéséhez. Ez a beállítás támogatott lineáris, exponenciális és polinomiális trendvonalaknál.

Például egy termelési költség modellnek az ismert, 100 egységű fix költségnél kell kezdődnie, még akkor is, ha a nem nulla termelési mennyiségeknél mért értékek más alapvonalat sugallnak. Lineáris trendvonal esetén a metszéspont rögzítése a y = ax + b képletet b = 100‑ra korlátozza; a meredekség az adatokhoz illeszkedik ebben a feltételben. Ez nem egyszerűen csak áthelyezi a már illesztett vonalat. A tengelykereszteződés beállítások azt szabályozzák, hogy a diagram tengelyei hol találkoznak, nem a trendvonal illesztett együtthatóit.

Az alábbi példa egy szórt (XY) diagramot hoz létre 1‑től 4‑ig terjedő termelési mennyiségekkel és 170, 200, 230 és 260 költségekkel. A diagramot az alapértelmezett automatikus metszésponttal menti, beállítja a metszéspontot 100‑ra, és egy második PPTX‑et ment. A két fájl csak a metszéspont beállításban tér el. A trendvonal megjeleníti egyenletét, és visszanyúlik X = 0‑ig.

#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);

Automatikus számítás esetén ezek az adatok y = 30x + 140 képletet adnak. A metszéspont 100‑ra állítása helyette körülbelül y = 43.33x + 100 eredményt ad: a nulla értéknél illesztett érték megegyezik az ismert alapvonallal, míg a vonal már nem halad át minden adatponton.

Automatikus metszéspont 100-as rögzített metszéspont
Lineáris trendvonal automatikusan kiszámított 140-es metszésponttal Lineáris trendvonal 100-as rögzített metszésponttal

Mindkét kép ugyanazokat az adatokat és tengelyskálákat használja. A trendvonalak vissza vannak nyújtva X = 0‑ig, hogy mutassák a metszéspontjaikat.

Alapértelmezés szerint a tulajdonság std::numeric_limits<double>::quiet_NaN() értéket tartalmaz, ami nem meghatározott metszéspontot jelez, nem nullát. Ezután a metszéspontot automatikusan számítja ki az adatból.

Egyéni vonal hozzáadása

Egy egyéni vonal egy a diagram felett rajzolt alakzat, nem a sorozat adatokból számított trendvonal. Ez a példa a IShapeCollection::AddAutoShape használja, hogy egy vízszintes vonalat adjunk a diára a diagram felett. A vonal pozíciója a dia koordinátáiban van megadva, pontokban mérve, így a diagram bal szélén kezdődik és a diagram magasságának felénél helyezkedik el. Szélessége megegyezik a diagram szélességével. A IShape::get_LineFormat által visszaadott vonalformátum szilárd piros színt ad a vonalnak.

#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);

GYIK

Mit jelent a ‘forward’ és a ‘backward’ egy trendvonal esetén?

Ezek a trendvonal előre/hátra vetített hossza: szórt (XY) diagramoknál – tengelyegységekben; nem szórt diagramoknál – kategóriák számában. Csak nem negatív értékek engedélyezettek.

Megmarad a trendvonal a prezentáció PDF vagy SVG formátumba exportálásakor, vagy diára történő képkénti rendereléskor?

Igen. Az Aspose.Slides a prezentációkat PDF vagy SVG formátumba konvertálja, és a diagramokat képekké rendereli; a trendvonalak a diagram részét képezve megmaradnak ezek során. Egy metódus is elérhető a diagram képének exportálása számára.