SedSat3 1.1.6
Sediment Source Apportionment Tool - Advanced statistical methods for environmental pollution research
Loading...
Searching...
No Matches
generalchart.cpp
Go to the documentation of this file.
1#include "generalchart.h"
2#include "ui_generalchart.h"
3#include "resultitem.h"
4#include <string>
5
6
7GeneralChart::GeneralChart(QWidget *parent) :
8 QDialog(parent),
9 ui(new Ui::GeneralChart)
10{
11 ui->setupUi(this);
12 chart = new Chart();
14 ui->verticalLayout->addWidget(chartView);
15 connect(ui->Exporttppng,SIGNAL(clicked()),this,SLOT(on_Exporttopng()));
16
17}
18
20{
21 delete ui;
22}
23
25{
26 result_item = res;
27 if (res->Type() == result_type::contribution)
28 {
29
30 Contribution* contributions = static_cast<Contribution*>(res->Result());
31 return PlotContribution(contributions, QString::fromStdString(res->Name()));
32
33 }
35 {
36
37 Elemental_Profile_Set* profile_sets = static_cast<Elemental_Profile_Set*>(res->Result());
38 return PlotProfileSet(profile_sets,QString::fromStdString(res->Name()));
39
40 }
41
43 {
44
45 Elemental_Profile* profile_set = static_cast<Elemental_Profile*>(res->Result());
46 return PlotPredictedConcentration(profile_set,QString::fromStdString(res->Name()));
47
48 }
49
50 if (res->Type() == result_type::vector)
51 {
52 CMBVector* profile = static_cast<CMBVector*>(res->Result());
53 return PlotVector(profile, QString::fromStdString(res->Name()));
54 }
55 if (res->Type() == result_type::vectorset)
56 {
57 CMBVectorSet* profile = static_cast<CMBVectorSet*>(res->Result());
58 return PlotVectorSet(profile, QString::fromStdString(res->Name()));
59 }
60 if (res->Type() == result_type::matrix)
61 {
62 CMBMatrix* matrix = static_cast<CMBMatrix*>(res->Result());
63 return PlotMatrix(matrix, QString::fromStdString(res->Name()));
64 }
65
66
67 if (res->Type() == result_type::mlrset)
68 {
70 return PlotRegressionSet(mlrset, QString::fromStdString(res->Name()));
71 }
73 {
74 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
75 return PlotTimeSeriesSet(timeseriesset, QString::fromStdString(res->Name()),QString::fromStdString(res->XAxisTitle()),QString::fromStdString(res->YAxisTitle()));
76 }
78 {
79 RangeSet* rangeset = static_cast<RangeSet*>(res->Result());
80 return PlotRangeSet(rangeset, QString::fromStdString(res->Name()),QString::fromStdString(res->XAxisTitle()),QString::fromStdString(res->YAxisTitle()));
81 }
82
84 {
85 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
86 return PlotTimeSeriesSet_M(timeseriesset, QString::fromStdString(res->Name()),QString::fromStdString(res->XAxisTitle()),QString::fromStdString(res->YAxisTitle()));
87 }
89 {
90 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
91 return PlotTimeSeriesSet_M(timeseriesset, QString::fromStdString(res->Name()),QString::fromStdString(res->XAxisTitle()),QString::fromStdString(res->YAxisTitle()));
92 }
94 {
95 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
96 return PlotTimeSeriesSet_Stacked(timeseriesset, QString::fromStdString(res->Name()),QString::fromStdString(res->XAxisTitle()),QString::fromStdString(res->YAxisTitle()));
97 }
98
99 if (res->Type() == result_type::mcmc_samples)
100 {
101 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
102 return InitializeMCMCSamples(timeseriesset, QString::fromStdString(res->Name()));
103 }
105 {
106 CMBTimeSeriesSet* timeseriesset = static_cast<CMBTimeSeriesSet*>(res->Result());
107 return InitializeDistributions(timeseriesset, QString::fromStdString(res->Name()));
108 }
109 if (res->Type() == result_type::matrix1vs1)
110 {
111 CMBMatrix* matrix = static_cast<CMBMatrix*>(res->Result());
112 return PlotScatter(matrix);
113 }
115 {
116 CMBVectorSet* vector_set = static_cast<CMBVectorSet*>(res->Result());
117 return PlotScatter(vector_set);
118 }
119
121 {
122 CMBVectorSetSet* vector_set = static_cast<CMBVectorSetSet*>(res->Result());
123 return PlotVectorSetSet(vector_set,QString::fromStdString(res->Name()));
124 }
125
126 chartView->update();
127 return false;
128}
129
130double roundDown(double a, double rounding_value) {
131 if (a >= 0)
132 return round(a/rounding_value)*rounding_value;
133 else
134 return -round(-a/rounding_value+1)*rounding_value;
135
136}
137
138bool GeneralChart::PlotVectorSetSet(CMBVectorSetSet *profile, const QString &title)
139{
140 source1_combo = new QComboBox();
141 source2_combo = new QComboBox();
142 QLabel *source1_label = new QLabel();
143 QLabel *source2_label = new QLabel();
144 source1_label->setText("Source group I:");
145 source2_label->setText("Source group II:");
146
147 connect(source1_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onDFAPairChanged(int)));
148 connect(source2_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onDFAPairChanged(int)));
149
150 for (map<std::string,CMBVectorSet>::iterator it = profile->begin(); it!=profile->end(); it++ )
151 {
152 source1_combo->addItem(QString::fromStdString(it->first));
153 source2_combo->addItem(QString::fromStdString(it->first));
154 }
155 ui->horizontalLayout->addWidget(source1_label);
156 ui->horizontalLayout->addWidget(source1_combo);
157 ui->horizontalLayout->addWidget(source2_label);
158 ui->horizontalLayout->addWidget(source2_combo);
159 onDFAPairChanged(source1_combo->currentIndex());
160 return true;
161}
162
163bool GeneralChart::PlotVectorSet(CMBVectorSet *profile, const QString &title)
164{
165 element_combo = new QComboBox();
166 QLabel *element_label = new QLabel();
167 element_label->setText("Source group pair:");
168
169 connect(element_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onPairChanged(int)));
170
171 for (map<std::string,CMBVector>::iterator it = profile->begin(); it!=profile->end(); it++ )
172 {
173 element_combo->addItem(QString::fromStdString(it->first));
174 }
175
176
177 ui->horizontalLayout->addWidget(element_label);
178 ui->horizontalLayout->addWidget(element_combo);
179 onPairChanged(element_combo->currentIndex());
180
181 return true;
182}
183
184bool GeneralChart::PlotVector(CMBVector *profile, const QString &title)
185{
186 QStringList categories;
187
188 QBarCategoryAxis *axisX = new QBarCategoryAxis();
189
190 vector<string> element_names = profile->Labels();
191 for (unsigned int i = 0; i < element_names.size(); i++)
192 categories << QString::fromStdString(element_names[i]);
193
194 axisX->append(categories);
195 chart->addAxis(axisX, Qt::AlignBottom);
196 axisX->setTitleText(QString::fromStdString(result_item->XAxisTitle()));
197 QLogValueAxis* axisYLog;
198 QValueAxis* axisYNormal;
199 bool _log = (result_item->YAxisMode()==yaxis_mode::log?true:false);
200 double profile_min;
201 if (result_item->AbsValue())
202 profile_min = profile->abs().min();
203 else
204 profile_min = profile->min();
205 if (profile_min>0 && _log)
206 {
207 axisYLog = new QLogValueAxis();
208 if (result_item->AbsValue())
209 axisYLog->setRange(pow(10, roundDown(log(profile->abs().min())/log(10.0))), pow(10, int(log(profile->abs().max()) / log(10.0))+1));
210 else
211 axisYLog->setRange(pow(10, roundDown(log(profile->min())/log(10.0))), pow(10, int(log(profile->max()) / log(10.0))+1));
212 axisYLog->setLabelFormat("%g");
213 axisYLog->setMinorTickCount(5);
214 axisYLog->setTitleText(QString::fromStdString(result_item->YAxisTitle()));
215 chart->addAxis(axisYLog, Qt::AlignLeft);
216 _log = true;
217 }
218 else
219 {
220 axisYNormal = new QValueAxis();
221 if (result_item->AbsValue())
222 axisYNormal->setRange(roundDown(profile->abs().min()*10.0)/10, roundDown((profile->abs().max()+0.1)*10.0)/10);
223 else
224 axisYNormal->setRange(roundDown(profile->min()*10.0)/10, roundDown((profile->max()+0.1)*10.0)/10);
225 axisYNormal->setLabelFormat("%f");
226 axisYNormal->setMinorTickCount(5);
227 axisYNormal->setTitleText(QString::fromStdString(result_item->YAxisTitle()));
228 chart->addAxis(axisYNormal, Qt::AlignLeft);
229 _log = false;
230 }
231 axisX->setLabelsAngle(-90);
232 chart->addAxis(axisX, Qt::AlignBottom);
233
234
235 //QLineSeries* series = new QLineSeries();
236 QBarSeries* series = new QBarSeries();
237
238 chart->addSeries(series);
239 series->setName(title);
240 series->attachAxis(axisX);
241 if (_log)
242 series->attachAxis(axisYLog);
243 else
244 series->attachAxis(axisYNormal);
245
246 double counter = 0.5;
247 QBarSet *barset = new QBarSet(QString::fromStdString(result_item->Name()));
248 QPen pen;
249 pen.setWidth(2);
250 barset->setPen(pen);
251
252 for (int i=0; i<profile->num; i++)
253 {
254 if (result_item->AbsValue())
255 barset->append(fabs(profile->at(i)));
256 else
257 barset->append(profile->at(i));
258 counter++;
259 }
260 series->append(barset);
261 return true;
262
263}
264
265
266bool GeneralChart::PlotMatrix(CMBMatrix *matrix, const QString &title)
267{
268 QStringList categories;
269
270 QBarCategoryAxis *axisX = new QBarCategoryAxis();
271
272 vector<string> element_names = matrix->ColumnLabels();
273 for (unsigned int i = 0; i < element_names.size(); i++)
274 categories << QString::fromStdString(element_names[i]);
275
276 axisX->append(categories);
277 chart->addAxis(axisX, Qt::AlignBottom);
278
279 QLogValueAxis* axisYLog;
280 QValueAxis* axisYNormal;
281 bool _log = (result_item->YAxisMode()==yaxis_mode::log?true:false);
282 double matrix_min;
283 if (result_item->AbsValue())
284 matrix_min = matrix->abs().min();
285 else
286 matrix_min = matrix->min();
287
288
289 if (matrix_min>0 && _log)
290 {
291 axisYLog = new QLogValueAxis();
292 axisYLog->setRange(pow(10, roundDown(log(matrix_min)/log(10.0))), pow(10, int(log(matrix->max()) / log(10.0))+1));
293 axisYLog->setLabelFormat("%g");
294 axisYLog->setMinorTickCount(5);
295 chart->addAxis(axisYLog, Qt::AlignLeft);
296 _log = true;
297 }
298 else
299 {
300 axisYNormal = new QValueAxis();
301 axisYNormal->setRange(roundDown(matrix_min*10.0)/10, roundDown((matrix->max()+0.1)*10.0)/10);
302 axisYNormal->setLabelFormat("%f");
303 axisYNormal->setMinorTickCount(5);
304 chart->addAxis(axisYNormal, Qt::AlignLeft);
305 _log= false;
306 }
307
308 chart->addAxis(axisX, Qt::AlignBottom);
309
310
311 for (int i=0; i<matrix->getnumrows(); i++)
312 { QBarSeries* series = new QBarSeries();
313
314 chart->addSeries(series);
315 series->setName(QString::fromStdString(matrix->RowLabel(i)));
316 series->attachAxis(axisX);
317 if (_log)
318 series->attachAxis(axisYLog);
319 else
320 series->attachAxis(axisYNormal);
321
322 double counter = 0.5;
323 QBarSet *barset = new QBarSet(QString::fromStdString(matrix->RowLabel(i)));
324 QPen pen;
325 pen.setWidth(2);
326 barset->setPen(pen);
327
328 for (int j=0; j<matrix->getnumcols(); j++)
329 {
330 if (result_item->AbsValue())
331 barset->append(fabs(matrix->matr[i][j]));
332 else
333 barset->append(matrix->matr[i][j]);
334 counter++;
335 }
336 series->append(barset);
337 }
338 return true;
339
340
341}
342
343
344bool GeneralChart::PlotProfileSet(Elemental_Profile_Set *profile_sets, const QString &title)
345{
346 QCategoryAxis* axisX = new QCategoryAxis();
347
348 axisX->setRange(0, profile_sets->GetElementNames().size());
349 vector<string> element_names = profile_sets->GetElementNames();
350 for (int i=0; i<element_names.size(); i++)
351 axisX->append(QString::fromStdString(element_names[i]),double(i+1));
352
353
354 QLogValueAxis* axisYLog;
355 QValueAxis* axisYNormal;
356 bool _log = (result_item->YAxisMode()==yaxis_mode::log?true:false);
357 if (profile_sets->GetMinimum()>0 && _log)
358 {
359 axisYLog = new QLogValueAxis();
360 axisYLog->setRange(pow(10, roundDown(log(profile_sets->GetMinimum())/log(10.0))), pow(10, int(log(profile_sets->GetMaximum()) / log(10.0))+1));
361 axisYLog->setLabelFormat("%g");
362 axisYLog->setMinorTickCount(5);
363 chart->addAxis(axisYLog, Qt::AlignLeft);
364 _log = true;
365 }
366 else
367 {
368 axisYNormal = new QValueAxis();
370 axisYNormal->setRange(roundDown(profile_sets->GetMinimum()), roundDown(profile_sets->GetMaximum()+1));
371 else
372 axisYNormal->setRange(roundDown(profile_sets->GetMinimum()), result_item->YLimit(_range::high));
373 axisYNormal->setLabelFormat("%g");
374 axisYNormal->setMinorTickCount(5);
375 chart->addAxis(axisYNormal, Qt::AlignLeft);
376 }
377
378 chart->addAxis(axisX, Qt::AlignBottom);
379
380
381 for (map<string,Elemental_Profile>::iterator it = profile_sets->begin(); it!=profile_sets->end(); it++)
382 {
383 QScatterSeries* series = new QScatterSeries();
384 chart->addSeries(series);
385 series->setName(QString::fromStdString(it->first));
386 series->attachAxis(axisX);
387 if (_log)
388 series->attachAxis(axisYLog);
389 else
390 series->attachAxis(axisYNormal);
391 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
392 series->setMarkerSize(15.0);
393 double counter=0.5;
394 for (map<string, double>::iterator datapoint = it->second.begin(); datapoint != it->second.end(); datapoint++)
395 {
396 series->append(counter,datapoint->second);
397 counter++;
398 }
399
400 }
401 return true;
402
403}
404bool GeneralChart::PlotContribution(Contribution* contributions, const QString &title)
405{
406 QPieSeries* series = new QPieSeries();
407 QStringList labels;
408 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
409 {
410 series->append(QString::fromStdString(it->first), it->second * 100);
411 labels.append(QString::number(it->second*100)+"%");
412 }
413
414 chart->addSeries(series);
415 for(auto slice : series->slices())
416 { slice->setLabel(QString("%1%").arg(100*slice->percentage(), 0, 'f', 1));
417 slice->setLabelVisible();
418
419 }
420
421 int i=0;
422 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
423 {
424 chart->legend()->markers(series)[i]->setLabel(QString::fromStdString(it->first));
425 i++;
426 }
427
428 series->setLabelsPosition(QPieSlice::LabelOutside);
429 chart->setTitle(title);
430
431 chartView->setRenderHint(QPainter::Antialiasing);
432 return true;
433}
434bool GeneralChart::PlotPredictedConcentration(Elemental_Profile* profile_set, const QString &title)
435{
436 QCategoryAxis* axisX = new QCategoryAxis();
437 qDebug() << profile_set->GetElementNames().size();
438 axisX->setRange(0, profile_set->size()*10);
439 vector<string> element_names = profile_set->GetElementNames();
440 for (int i = 0; i < element_names.size(); i++)
441 axisX->append(QString::fromStdString(element_names[i]), double(i + 1)*10);
442
443
444 QLogValueAxis* axisYLog;
445 QValueAxis* axisYNormal;
446 axisX->setTitleText(QString::fromStdString(result_item->XAxisTitle()));
447 bool _log = (result_item->YAxisMode()==yaxis_mode::log?true:false);
448 if (profile_set->GetMinimum()>0 && _log)
449 {
450 axisYLog = new QLogValueAxis();
451 axisYLog->setRange(pow(10, roundDown(log(profile_set->GetMinimum())/log(10.0))), pow(10, int(log(profile_set->GetMaximum()) / log(10.0))+1));
452 axisYLog->setLabelFormat("%g");
453 axisYLog->setMinorTickCount(5);
454 axisYLog->setTitleText(QString::fromStdString(result_item->YAxisTitle()));
455 chart->addAxis(axisYLog, Qt::AlignLeft);
456 _log = true;
457 }
458 else
459 {
460 axisYNormal = new QValueAxis();
462 axisYNormal->setRange(roundDown(profile_set->GetMinimum()), roundDown(profile_set->GetMaximum()+1));
463 else
464 axisYNormal->setRange(roundDown(profile_set->GetMinimum()), result_item->YLimit(_range::low));
465 axisYNormal->setLabelFormat("%f");
466 axisYNormal->setMinorTickCount(5);
467 axisYNormal->setTitleText(QString::fromStdString(result_item->YAxisTitle()));
468 chart->addAxis(axisYNormal, Qt::AlignLeft);
469 }
470
471 chart->addAxis(axisX, Qt::AlignBottom);
472
473
474 //QLineSeries* series = new QLineSeries();
475 QScatterSeries* series = new QScatterSeries();
476 chart->addSeries(series);
477 series->setName(title);
478 series->attachAxis(axisX);
479 if (_log)
480 series->attachAxis(axisYLog);
481 else
482 series->attachAxis(axisYNormal);
483 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
484 series->setMarkerSize(15.0);
485 double counter = 0.5;
486 for (map<string, double>::iterator datapoint = profile_set->begin(); datapoint != profile_set->end(); datapoint++)
487 {
488 series->append(counter*10, datapoint->second);
489 counter++;
490 }
491 return true;
492
493
494}
495bool GeneralChart::PlotRegressionSet(MultipleLinearRegressionSet *regressionset, const QString &title)
496{
497 element_combo = new QComboBox();
498 QLabel *element_label = new QLabel();
499 element_label->setText("Constituent:");
500 independent_combo = new QComboBox();
501
502 connect(element_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onElementChanged(int)));
503 connect(independent_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onIndependentChanged(int)));
504 for (map<std::string,MultipleLinearRegression>::iterator it = regressionset->begin(); it!=regressionset->end(); it++ )
505 {
506 element_combo->addItem(QString::fromStdString(it->first));
507 }
508
509 QLabel *independent_label = new QLabel();
510 independent_label->setText("Independent Variable:");
511 ui->horizontalLayout->addWidget(element_label);
512 ui->horizontalLayout->addWidget(element_combo);
513 ui->horizontalLayout->addWidget(independent_label);
514 ui->horizontalLayout->addWidget(independent_combo);
515 onElementChanged(element_combo->currentIndex());
517 return true;
518}
519
520bool GeneralChart:: InitializeMCMCSamples(CMBTimeSeriesSet *mcmcsamples, const QString &title)
521{
522 element_combo = new QComboBox();
523 QLabel *element_label = new QLabel();
524 element_label->setText("Variable:");
525 ui->horizontalLayout->addWidget(element_label);
526 ui->horizontalLayout->addWidget(element_combo);
527
528 for (int i = 0; i<mcmcsamples->size(); i++ )
529 {
530 element_combo->addItem(QString::fromStdString(mcmcsamples->getSeriesName(i)));
531 }
532 connect(element_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onMCMCVariableChanged(int)));
533
534
535 onMCMCVariableChanged(element_combo->currentIndex());
536
537 return true;
538}
539
540bool GeneralChart::InitializeDistributions(CMBTimeSeriesSet *distributions, const QString &title)
541{
542 element_combo = new QComboBox();
543 QLabel *element_label = new QLabel();
544 element_label->setText("Variable:");
545 ui->horizontalLayout->addWidget(element_label);
546 ui->horizontalLayout->addWidget(element_combo);
547
548 for (int i = 0; i<distributions->size(); i++ )
549 {
550 element_combo->addItem(QString::fromStdString(distributions->getSeriesName(i)));
551 }
552 connect(element_combo, SIGNAL(currentIndexChanged(int)),this, SLOT(onDistributionsVariableChanged(int)));
553
554
556
557 return true;
558}
559
560
562{
564 independent_combo->clear();
565 QString constituent = element_combo->itemText(i_element);
566 for (unsigned int i=0; i<mlrset->at(constituent.toStdString()).GetIndependentVariableNames().size(); i++)
567 {
568 independent_combo->addItem(QString::fromStdString(mlrset->at(constituent.toStdString()).GetIndependentVariableNames()[i]));
569 }
570 if (!independent_combo->currentText().isEmpty() && !element_combo->currentText().isEmpty())
571 {
572 PlotRegression(&mlrset->at(constituent.toStdString()),independent_combo->currentText());
573 }
574
575}
576
578{
579 chart->removeAllSeries();
580 for (int i=0; i<chart->axes().size(); i++)
581 chart->removeAxis(chart->axes()[i]);
582
583 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
584 {
585 chart->removeAxis(chart->axes(Qt::Vertical)[i]);
586 }
587
588 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
589 {
590 chart->removeAxis(chart->axes(Qt::Horizontal)[i]);
591 }
593 QString pair = element_combo->itemText(pair_id);
594 PlotVector(&vectorset->at(pair.toStdString()),"DFA S value between '" + pair + "'");
595
596}
597
599{
600 chart->removeAllSeries();
601 for (int i=0; i<chart->axes().size(); i++)
602 chart->removeAxis(chart->axes()[i]);
603
604 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
605 {
606 chart->removeAxis(chart->axes(Qt::Vertical)[i]);
607 }
608
609 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
610 {
611 chart->removeAxis(chart->axes(Qt::Horizontal)[i]);
612 }
614 qDebug()<<source1_combo->currentText();
615 qDebug()<<source2_combo->currentText();
616 if (source1_combo->currentText()!="" && source2_combo->currentText()!="")
617 PlotScatter(&vectorset->at(source1_combo->currentText().toStdString()),&vectorset->at(source2_combo->currentText().toStdString()), "WB_" + source1_combo->currentText(), "WB_" + source2_combo->currentText() );
618}
619
621{
622 CMBTimeSeriesSet * samplesset = static_cast<CMBTimeSeriesSet*>(result_item->Result());
623 QString variable = element_combo->itemText(i);
624 PlotMCMCSamples(&samplesset->operator[](variable.toStdString()),variable);
625}
626
628{
629 CMBTimeSeriesSet * samplesset = static_cast<CMBTimeSeriesSet*>(result_item->Result());
630 QString variable = element_combo->itemText(i);
631 if (samplesset->Contains(variable.toStdString()))
632 PlotDistribution(&samplesset->operator[](variable.toStdString()),variable);
633}
635{
637 if (!independent_combo->currentText().isEmpty() && !element_combo->currentText().isEmpty())
638 {
639 PlotRegression(&mlrset->at(element_combo->currentText().toStdString()),independent_combo->currentText());
640 }
641
642}
643
644bool GeneralChart::PlotRegression(MultipleLinearRegression *mlr,const QString& independent_var)
645{
646
647 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
648 {
649 qDebug()<<chart->axes(Qt::Horizontal)[i]->objectName();
650 }
651
652 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
653 {
654 qDebug()<<chart->axes(Qt::Vertical)[i]->objectName();
655 }
656
657 chart->removeAllSeries();
658 for (int i=0; i<chart->axes().size(); i++)
659 {
660 chart->removeAxis(chart->axes()[i]);
661 //delete chart->axes()[i];
662 }
663
664 qDebug()<<"After:";
665 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
666 {
667 qDebug()<<chart->axes(Qt::Horizontal)[i]->objectName();
668 chart->removeAxis(chart->axes(Qt::Horizontal)[i]);
669 }
670
671 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
672 {
673 qDebug()<<chart->axes(Qt::Vertical)[i]->objectName();
674 chart->removeAxis(chart->axes(Qt::Vertical)[i]);
675 }
676 chart->axes().clear();
677 QValueAxis* axisX = new QValueAxis();
678 QValueAxis* axisYNormal = new QValueAxis();
679 axisX->setObjectName("axisX");
680 axisYNormal->setObjectName("axisY");
681
682 QLineSeries *lineseries = new QLineSeries();
683 double x_min_val = CVector(mlr->IndependentData(independent_var.toStdString())).min();
684 double x_max_val = CVector(mlr->IndependentData(independent_var.toStdString())).max();
685 double y_min_val, y_max_val;
686
687 if (mlr->Equation()==regression_form::linear)
688 { y_min_val = mlr->CoefficientsIntercept()[0];
689 y_max_val = mlr->CoefficientsIntercept()[0];
690 }
691 else
692 {
693 y_min_val = exp(mlr->CoefficientsIntercept()[0]);
694 y_max_val = exp(mlr->CoefficientsIntercept()[0]);
695 }
696 for (int i=0; i<mlr->GetIndependentVariableNames().size(); i++)
697 {
698 if (mlr->GetIndependentVariableNames()[i]!=independent_var.toStdString())
699 {
700 if (mlr->Equation()==regression_form::linear)
701 { y_min_val += mlr->MeanIndependentVar(i)*mlr->CoefficientsIntercept()[i+1];
702 y_max_val += mlr->MeanIndependentVar(i)*mlr->CoefficientsIntercept()[i+1];
703 }
704 else
705 {
706 y_min_val *= exp(log(mlr->GeoMeanIndependentVar(i))*mlr->CoefficientsIntercept()[i+1]);
707 y_max_val *= exp(log(mlr->GeoMeanIndependentVar(i))*mlr->CoefficientsIntercept()[i+1]);
708 }
709 }
710 else
711 {
712 if (mlr->Equation()==regression_form::linear)
713 { y_min_val += x_min_val*mlr->CoefficientsIntercept()[i+1];
714 y_max_val += x_max_val*mlr->CoefficientsIntercept()[i+1];
715 }
716 else
717 {
718 y_min_val *= exp(log(x_min_val)*mlr->CoefficientsIntercept()[i+1]);
719 y_max_val *= exp(log(x_max_val)*mlr->CoefficientsIntercept()[i+1]);
720 }
721 }
722 }
723
724 axisX->setRange(CVector(mlr->IndependentData(independent_var.toStdString())).min(), CVector(mlr->IndependentData(independent_var.toStdString())).max());
725 axisX->setTitleText(independent_var);
726
727 //axisYNormal->setLabelFormat("%f");
728 //axisYNormal->setMinorTickCount(5);
729 axisYNormal->setTitleText(QString::fromStdString("Measured " + mlr->DependentVariableName()));
730
731
732 QScatterSeries* series = new QScatterSeries();
733
734 series->setName(QString::fromStdString(mlr->DependentVariableName()));
735 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
736 series->setMarkerSize(15.0);
737 qDebug()<<independent_var;
738 for (unsigned int i=0; i<mlr->IndependentData(independent_var.toStdString()).size(); i++)
739 {
740 qDebug()<<mlr->DependentData()[i] << ","<< mlr->IndependentData(independent_var.toStdString())[i];
741 series->append(mlr->IndependentData(independent_var.toStdString())[i],mlr->DependentData()[i]);
742 }
743
744 chart->addAxis(axisX, Qt::AlignBottom);
745 chart->addAxis(axisYNormal, Qt::AlignLeft);
746 chart->addSeries(series);
747 series->attachAxis(axisX);
748 series->attachAxis(axisYNormal);
749
750 if (mlr->Equation()==regression_form::linear)
751 {
752 lineseries->append(x_min_val,y_min_val);
753 lineseries->append(x_max_val,y_max_val);
754 }
755 else
756 {
757 for (double x = x_min_val; x<=x_max_val; x+=(x_max_val-x_min_val)/20.0)
758 {
759 double y = exp(mlr->CoefficientsIntercept()[0]);
760 for (unsigned int i=0; i<mlr->GetIndependentVariableNames().size(); i++)
761 if (mlr->GetIndependentVariableNames()[i]!=independent_var.toStdString())
762 y *= exp(log(mlr->GeoMeanIndependentVar(i))*mlr->CoefficientsIntercept()[i+1]);
763 else
764 y *= exp(log(x)*mlr->CoefficientsIntercept()[i+1]);
765 lineseries->append(x,y);
766 }
767 }
768 chart->addSeries(lineseries);
769 lineseries->attachAxis(axisX);
770 lineseries->attachAxis(axisYNormal);
771 lineseries->setName("Regression");
772 axisYNormal->setRange(std::min(std::min(CVector(mlr->DependentData()).min(),y_min_val),y_max_val),std::max(std::max(CVector(mlr->DependentData()).max(),y_max_val),y_min_val));
773
774 return true;
775}
776
778{
779
780 QValueAxis* axisX = new QValueAxis();
781 QValueAxis* axisYNormal = new QValueAxis();
782 axisX->setObjectName("axisX");
783 axisYNormal->setObjectName("axisY");
784
785 CMBVector vec1 = matrix->GetColumn(matrix->ColumnLabel(0));
786 CMBVector vec2 = matrix->GetColumn(matrix->ColumnLabel(1));
787
788 double x_min_val = matrix->GetColumn(matrix->ColumnLabel(0)).min();
789 double x_max_val = matrix->GetColumn(matrix->ColumnLabel(0)).max();
790 double y_min_val = matrix->GetColumn(matrix->ColumnLabel(1)).min();
791 double y_max_val = matrix->GetColumn(matrix->ColumnLabel(1)).max();
792
793
794 axisX->setRange(x_min_val-(x_max_val-x_min_val)*0.05,x_max_val+(x_max_val-x_min_val)*0.05);
795 axisX->setTitleText(QString::fromStdString(matrix->ColumnLabel(0)));
796 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
797 axisYNormal->setTitleText(QString::fromStdString(matrix->ColumnLabel(1)));
798
799 chart->addAxis(axisX, Qt::AlignBottom);
800 chart->addAxis(axisYNormal, Qt::AlignLeft);
801
802 QStringList rowcategories = matrix->RowLabelCategories();
803 for (int i=0; i<rowcategories.size();i++)
804 {
805 QScatterSeries* series = new QScatterSeries();
806 qDebug()<<rowcategories[i];
807 for (int j=0; j<matrix->getnumrows(); j++)
808 if (QString::fromStdString(matrix->RowLabel(j))==rowcategories[i])
809 series->append(matrix->matr[j][0],matrix->matr[j][1]);
810
811 QPen pen = series->pen();
812 pen.setWidth(2);
813 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
814 series->setPen(pen);
815
816 series->setName(rowcategories[i]);
817 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
818 series->setMarkerSize(15.0);
819 chart->addSeries(series);
820 series->attachAxis(axisX);
821 series->attachAxis(axisYNormal);
822
823 }
824
825 return true;
826}
827
829{
830
831 QCategoryAxis* axisX = new QCategoryAxis();
832 QValueAxis* axisYNormal = new QValueAxis();
833 axisX->setObjectName("axisX");
834 axisYNormal->setObjectName("axisY");
835
836 double x_min_val = 0.5;
837 double x_max_val = vectorset->size()+0.5;
838 double y_min_val = vectorset->min();
839 double y_max_val = vectorset->max();
840
841
842 axisX->setRange(x_min_val,x_max_val);
843 axisX->setTitleText(QString::fromStdString(result_item->XAxisTitle()));
844 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
845 axisYNormal->setTitleText(QString::fromStdString(result_item->YAxisTitle()));
846
847 chart->addAxis(axisX, Qt::AlignBottom);
848 chart->addAxis(axisYNormal, Qt::AlignLeft);
849
850 QStringList categories;
851 int counter = 0;
852 for (map<string, CMBVector>::iterator vec = vectorset->begin(); vec!=vectorset->end(); vec++)
853 {
854 QScatterSeries* series = new QScatterSeries();
855
856 for (int j=0; j<vec->second.num; j++)
857 series->append(counter+1,vec->second[j]);
858
859 counter++;
860 QPen pen = series->pen();
861 pen.setWidth(2);
862 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
863 series->setPen(pen);
864
865 series->setName(QString::fromStdString(vec->first));
866 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
867 series->setMarkerSize(15.0);
868 chart->addSeries(series);
869 series->attachAxis(axisX);
870 series->attachAxis(axisYNormal);
871 axisX->append(QString::fromStdString(vec->first), counter+0.5);
872 }
873
874 return true;
875}
876
877
878bool GeneralChart::PlotScatter(CMBVectorSet *vectorset1, CMBVectorSet *vectorset2, const QString &xaxisTitle, const QString &yaxisTitle)
879{
880
881 QValueAxis* axisX = new QValueAxis();
882 QValueAxis* axisYNormal = new QValueAxis();
883 axisX->setObjectName("axisX");
884 axisYNormal->setObjectName("axisY");
885
886 double x_min_val = vectorset1->min();
887 double x_max_val = vectorset1->max();
888 double y_min_val = vectorset2->min();
889 double y_max_val = vectorset2->max();
890
891
892 axisX->setRange(x_min_val-(x_max_val-x_min_val)*0.05,x_max_val+(x_max_val-x_min_val)*0.05);
893 axisX->setTitleText(xaxisTitle);
894 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
895 axisYNormal->setTitleText(yaxisTitle);
896
897 chart->addAxis(axisX, Qt::AlignBottom);
898 chart->addAxis(axisYNormal, Qt::AlignLeft);
899
900 QStringList categories;
901 int counter = 0;
902
903
904 for (map<string, CMBVector>::iterator vec = vectorset1->begin(); vec!=vectorset1->end(); vec++)
905 {
906 QScatterSeries* series = new QScatterSeries();
907
908 TimeSeriesSet<double> vals(2);
909 for (int j=0; j<vec->second.num; j++)
910 {
911 series->append(vec->second[j],vectorset2->at(vec->first)[j]);
912 vals[0].append(j,vec->second[j]);
913 vals[1].append(j,vectorset2->at(vec->first)[j]);
914 }
915
916 double mean1 = vals[0].mean();
917 double mean2 = vals[1].mean();
918 double std1 = vals[0].stddev();
919 double std2 = vals[1].stddev();
920 double Cov = Covariance(vals[0],vals[1]);
921
922 QColor color = QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256));
923 counter++;
924
925
926 series->setName(QString::fromStdString(vec->first));
927 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
928 series->setMarkerSize(15.0);
929 series->setColor(color);
930 QPen pen = series->pen();
931 pen.setColor(color);
932 pen.setWidth(2);
933 pen.setBrush(color);
934 series->setPen(pen);
935
936 chart->addSeries(series);
937 series->attachAxis(axisX);
938 series->attachAxis(axisYNormal);
939 double rho = Cov/(std1*std2);
940 double major_diagonal;
941 double minor_diagonal;
942 if (std1>=std2)
943 {
944 major_diagonal = 2*sqrt(2*((std1*std1+std2*std2)/2.0 + sqrt(pow((std1*std1-std2*std2)/2.0,2)+pow(rho*std1*std2,2))));
945 minor_diagonal = 2*sqrt(2*((std1*std1+std2*std2)/2.0 - sqrt(pow((std1*std1-std2*std2)/2.0,2)+pow(rho*std1*std2,2))));
946 }
947 else
948 {
949 major_diagonal = 2*sqrt(2*((std1*std1+std2*std2)/2.0 - sqrt(pow((std1*std1-std2*std2)/2.0,2)+pow(rho*std1*std2,2))));
950 minor_diagonal = 2*sqrt(2*((std1*std1+std2*std2)/2.0 + sqrt(pow((std1*std1-std2*std2)/2.0,2)+pow(rho*std1*std2,2))));
951 }
952 double orientation = 0.5*atan(2*rho*std1*std2/(std1*std1-std2*std2));
953
954 qDebug()<<"Std1="<<std1;
955 qDebug()<<"Std2="<<std2;
956 qDebug()<<"Rho="<<rho;
957 qDebug()<<"Major diagonal="<<major_diagonal;
958 qDebug()<<"Minor diagonal="<<minor_diagonal;
959 qDebug()<<"Orienation="<<orientation;
960 vector<QPointF> ellipsepoints = calculateRotatedEllipsePoints(mean1, mean2, major_diagonal, minor_diagonal, orientation, M_PI/30.0);
961 QLineSeries* seriesellipse = new QLineSeries();
962 seriesellipse->setName(QString::fromStdString(vec->first));
963
964 for (size_t i = 0; i<ellipsepoints.size(); i++)
965 {
966 seriesellipse->append(ellipsepoints[i].x(), ellipsepoints[i].y());
967 }
968
969 QPen penellipse = QPen(QBrush(Qt::DashLine),2,Qt::PenStyle::DashLine);
970 penellipse.setColor(color);
971 penellipse.setWidth(2);
972 penellipse.setBrush(color);
973
974 seriesellipse->setPen(penellipse);
975
976 chart->addSeries(seriesellipse);
977
978 for (size_t i = 0; i< chart->legend()->markers(seriesellipse).size(); i++)
979 chart->legend()->markers(seriesellipse)[i]->setVisible(false);
980 seriesellipse->attachAxis(axisX);
981 seriesellipse->attachAxis(axisYNormal);
982
983
984 }
985
986 return true;
987}
988
989
990
991
992bool GeneralChart::PlotMCMCSamples(TimeSeries<double> *samples,const QString& variable)
993{
994
995 chart->removeAllSeries();
996 for (int i=0; i<chart->axes().size(); i++)
997 {
998 chart->removeAxis(chart->axes()[i]);
999 //delete chart->axes()[i];
1000 }
1001
1002 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
1003 {
1004 chart->removeAxis(chart->axes(Qt::Horizontal)[i]);
1005 }
1006
1007 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
1008 {
1009 chart->removeAxis(chart->axes(Qt::Vertical)[i]);
1010 }
1011 chart->axes().clear();
1012 QValueAxis* axisX = new QValueAxis();
1013 QValueAxis* axisYNormal = new QValueAxis();
1014 axisX->setObjectName("axisX");
1015 axisYNormal->setObjectName("axisY");
1016
1017 double x_min_val = samples->mint();
1018 double x_max_val = samples->maxt();
1019 double y_min_val = samples->minC();
1020 double y_max_val = samples->maxC();
1021
1022
1023 axisX->setRange(x_min_val, x_max_val);
1024 axisX->setTitleText("Sample number");
1025
1026 //axisYNormal->setLabelFormat("%f");
1027 //axisYNormal->setMinorTickCount(5);
1028 axisYNormal->setTitleText(variable);
1029 axisYNormal->setRange(y_min_val, y_max_val);
1030
1031
1032 QScatterSeries* series = new QScatterSeries();
1033
1034 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1035
1036 series->setName(variable);
1037 series->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
1038 series->setMarkerSize(3.0);
1039 series->setPen(marker_pen);
1040
1041
1042 for (int i=0; i<samples->size(); i++)
1043 {
1044 series->append(samples->getTime(i),samples->getValue(i));
1045 }
1046
1047 chart->addAxis(axisX, Qt::AlignBottom);
1048 chart->addAxis(axisYNormal, Qt::AlignLeft);
1049 chart->addSeries(series);
1050 series->attachAxis(axisX);
1051 series->attachAxis(axisYNormal);
1052
1053 return true;
1054}
1055
1056
1057bool GeneralChart::PlotDistribution(TimeSeries<double> *samples,const QString& variable)
1058{
1059 chart->removeAllSeries();
1060 for (int i=0; i<chart->axes().size(); i++)
1061 {
1062 chart->removeAxis(chart->axes()[i]);
1063 //delete chart->axes()[i];
1064 }
1065
1066 for (int i=0; i<chart->axes(Qt::Horizontal).size(); i++)
1067 {
1068 chart->removeAxis(chart->axes(Qt::Horizontal)[i]);
1069 }
1070
1071 for (int i=0; i<chart->axes(Qt::Vertical).size(); i++)
1072 {
1073 chart->removeAxis(chart->axes(Qt::Vertical)[i]);
1074 }
1075 chart->axes().clear();
1076 QValueAxis* axisX = new QValueAxis();
1077 QValueAxis* axisYNormal = new QValueAxis();
1078 axisX->setObjectName("axisX");
1079 axisYNormal->setObjectName("axisY");
1080
1081 double x_min_val = samples->mint();
1082 double x_max_val = samples->maxt();
1083 double y_min_val = samples->minC();
1084 double y_max_val = samples->maxC();
1085
1086
1087 axisX->setRange(x_min_val, x_max_val);
1088 axisX->setTitleText("Sample number");
1089 axisYNormal->setTitleText(variable);
1090 axisYNormal->setRange(y_min_val, y_max_val);
1091
1092 QLineSeries *series = new QLineSeries();
1093 QAreaSeries *areaseries = new QAreaSeries(series);
1094
1095 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1096
1097 series->setName(variable);
1098 series->setPen(marker_pen);
1099
1100 for (int i=0; i<samples->size(); i++)
1101 {
1102 series-> append(samples->getTime(i),samples->getValue(i));
1103 }
1104
1105 chart->addAxis(axisX, Qt::AlignBottom);
1106 chart->addAxis(axisYNormal, Qt::AlignLeft);
1107
1108 chart->addSeries(series);
1109 series->attachAxis(axisX);
1110 series->attachAxis(axisYNormal);
1111
1112 chart->addSeries(areaseries);
1113 areaseries->attachAxis(axisX);
1114 areaseries->attachAxis(axisYNormal);
1115
1117 {
1118 QLineSeries *observed_series = new QLineSeries;
1119 QPen observed_pen(QBrush(Qt::DashLine),3,Qt::PenStyle::DashLine);
1120 observed_pen.setColor(Qt::black);
1121 observed_series->setPen(observed_pen);
1122 observed_series->append(static_cast<CMBTimeSeriesSet*>(result_item->Result())->ObservedValue(variable.toStdString()),0);
1123 observed_series->append(static_cast<CMBTimeSeriesSet*>(result_item->Result())->ObservedValue(variable.toStdString()),y_max_val);
1124 chart->addSeries(observed_series);
1125 observed_series->attachAxis(axisX);
1126 observed_series->attachAxis(axisYNormal);
1127 }
1128 return true;
1129}
1130
1131bool GeneralChart::PlotTimeSeriesSet(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
1132{
1133 double x_min_val = timeseriesset->mintime();
1134 double x_max_val = timeseriesset->maxtime();
1135 double y_min_val = timeseriesset->minval();
1136 double y_max_val = timeseriesset->maxval();
1137 QString xAxisTitle = x_axis_title;
1138 QString yAxisTitle = y_axis_title;
1139 if (x_axis_title.isEmpty()) xAxisTitle = "Value";
1140 if (y_axis_title.isEmpty()) yAxisTitle = "CDF";
1141 QValueAxis* axisX = new QValueAxis();
1142 QValueAxis* axisY = new QValueAxis();
1143 axisX->setObjectName("axisX");
1144 axisY->setObjectName("axisY");
1145 axisX->setTitleText(xAxisTitle);
1146 axisY->setTitleText(yAxisTitle);
1147 axisX->setRange(x_min_val,x_max_val);
1148 axisY->setRange(y_min_val,y_max_val);
1149 chart->addAxis(axisX, Qt::AlignBottom);
1150 chart->addAxis(axisY, Qt::AlignLeft);
1151 for (int i=0; i<timeseriesset->size(); i++)
1152 {
1153 QLineSeries *lineseries = new QLineSeries();
1154 chart->addSeries(lineseries);
1155 lineseries->attachAxis(axisX);
1156 lineseries->attachAxis(axisY);
1157
1158 for (int j=0; j<timeseriesset->at(i).size(); j++)
1159 {
1160 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1161 }
1162 QPen pen = lineseries->pen();
1163 pen.setWidth(2);
1164 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1165 lineseries->setPen(pen);
1166 lineseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1167
1168 }
1169
1170 return true;
1171}
1172
1173bool GeneralChart::PlotRangeSet(RangeSet *rangeset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
1174{
1175 double y_min_val = rangeset->minval();
1176 double y_max_val = rangeset->maxval();
1177
1179 {
1180 y_max_val = result_item->YLimit(_range::high);
1181 }
1182
1184 {
1185 y_min_val = result_item->YLimit(_range::low);
1186 }
1187
1189 {
1190 y_min_val = max(y_min_val,1e-8);
1191 }
1192 QString xAxisTitle = x_axis_title;
1193 QString yAxisTitle = y_axis_title;
1194 if (x_axis_title.isEmpty()) xAxisTitle = "Constituent";
1195 if (y_axis_title.isEmpty()) yAxisTitle = "95% CI";
1196 QCategoryAxis* axisX = new QCategoryAxis();
1197
1198 QLogValueAxis* axisYLog = new QLogValueAxis();
1199 QValueAxis* axisY = new QValueAxis();
1200
1201 axisX->setObjectName("axisX");
1202 axisY->setObjectName("axisY");
1203 axisYLog->setObjectName("axisYLog");
1204 axisYLog->setMinorTickCount(10);
1205
1206 axisX->setTitleText(xAxisTitle);
1208 { axisYLog->setTitleText(yAxisTitle);
1209 axisYLog->setRange(y_min_val,y_max_val);
1210 axisYLog->setLabelFormat("%g");
1211 }
1212 else
1213 { axisY->setTitleText(yAxisTitle);
1214 axisY->setRange(y_min_val,y_max_val);
1215 axisYLog->setLabelFormat("%f");
1216 }
1217 axisX->setRange(-0.5,rangeset->size()-0.5);
1218
1219
1220 chart->addAxis(axisX, Qt::AlignBottom);
1222 chart->addAxis(axisYLog, Qt::AlignLeft);
1223 else
1224 chart->addAxis(axisY, Qt::AlignLeft);
1225
1226 double upperlimit = 0.5;
1227 axisX->setStartValue(-0.5);
1228 QBoxPlotSeries *boxWhiskSeries = new QBoxPlotSeries();
1229
1230 for (map<string, Range>::iterator it = rangeset->begin(); it!=rangeset->end(); it++)
1231 {
1232 axisX->append(QString::fromStdString(it->first),upperlimit);
1233 upperlimit += 1;
1234 }
1235
1237 { QScatterSeries* scatterseries = new QScatterSeries();
1238 chart->addSeries(scatterseries);
1239 scatterseries->attachAxis(axisX);
1241 scatterseries->attachAxis(axisYLog);
1242 else
1243 scatterseries->attachAxis(axisY);
1244 int counter = 0;
1245 for (map<string, Range>::iterator it = rangeset->begin(); it!=rangeset->end(); it++)
1246 {
1247 scatterseries->append(counter,it->second.GetValue());
1248 counter++;
1249 }
1250 QPen pen = scatterseries->pen();
1251 pen.setWidth(2);
1252
1253 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1254 scatterseries->setPen(pen);
1255 scatterseries->setName(QString::fromStdString("Observed value"));
1256 }
1257
1258 for (map<string, Range>::iterator it = rangeset->begin(); it!=rangeset->end(); it++)
1259 {
1260 QBoxSet *boxSet = new QBoxSet();
1261 qDebug()<<it->second.Get(_range::low)<<","<<it->second.Get(_range::high)<<","<<it->second.GetValue();
1262 boxSet->setValue(QBoxSet::LowerExtreme, max(it->second.Get(_range::low),y_min_val));
1263 boxSet->setValue(QBoxSet::UpperExtreme, it->second.Get(_range::high));
1264 boxSet->setValue(QBoxSet::LowerQuartile, max(it->second.Get(_range::low),y_min_val));
1265 boxSet->setValue(QBoxSet::UpperQuartile, it->second.Get(_range::high));
1266 boxSet->setValue(QBoxSet::Median, it->second.Median());
1267 boxWhiskSeries->append(boxSet);
1268
1269
1270 }
1271 QPen brushcolor(QColor(0,200,0,126));
1272 QBrush brush(QColor(0,200,0,126));
1273 boxWhiskSeries->setBrush(brush);
1274 boxWhiskSeries->setName("95% Credible Interval");
1275
1276 chart->addSeries(boxWhiskSeries);
1278 boxWhiskSeries->attachAxis(axisYLog);
1279 else
1280 boxWhiskSeries->attachAxis(axisY);
1281 boxWhiskSeries->attachAxis(axisX);
1282
1283 return true;
1284}
1285
1286bool GeneralChart::PlotTimeSeriesSet_M(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
1287{
1288 double x_min_val = timeseriesset->mintime();
1289 double x_max_val = timeseriesset->maxtime();
1290 double y_min_val = timeseriesset->minval();
1291 double y_max_val = timeseriesset->maxval();
1292 QValueAxis* axisX = new QValueAxis();
1293 QValueAxis* axisY = new QValueAxis();
1294 QString xAxisTitle = x_axis_title;
1295 QString yAxisTitle = y_axis_title;
1296 if (x_axis_title.isEmpty()) xAxisTitle = "Value";
1297 if (y_axis_title.isEmpty()) yAxisTitle = "CDF";
1298 axisX->setObjectName("axisX");
1299 axisY->setObjectName("axisY");
1300 axisX->setTitleText(xAxisTitle);
1301 axisY->setTitleText(yAxisTitle);
1302 axisX->setRange(x_min_val,x_max_val);
1303 axisY->setRange(y_min_val,y_max_val);
1304 chart->addAxis(axisX, Qt::AlignBottom);
1305 chart->addAxis(axisY, Qt::AlignLeft);
1306 //axisX->setStartValue(x_min_val);
1307 QStringList x_Labels;
1308 int i=0;
1309 {
1310 QScatterSeries* scatterseries = new QScatterSeries();
1311 chart->addSeries(scatterseries);
1312 scatterseries->attachAxis(axisX);
1313 scatterseries->attachAxis(axisY);
1314
1315 for (int j=0; j<timeseriesset->at(i).size(); j++)
1316 {
1317 x_Labels.append(QString::fromStdString(timeseriesset->Label(j)));
1318 //axisX->append(QString::fromStdString(timeseriesset->Label(j)),j+1);
1319 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1320 }
1321 QPen pen = scatterseries->pen();
1322 pen.setWidth(2);
1323
1324 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1325 scatterseries->setPen(pen);
1326 scatterseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1327
1328 }
1329 for (int i=1; i<timeseriesset->size(); i++)
1330 {
1331 QLineSeries *lineseries = new QLineSeries();
1332 chart->addSeries(lineseries);
1333 lineseries->attachAxis(axisX);
1334 lineseries->attachAxis(axisY);
1335
1336 for (int j=0; j<timeseriesset->at(i).size(); j++)
1337 {
1338 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1339 }
1340 QPen pen = lineseries->pen();
1341 pen.setWidth(2);
1342 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1343 lineseries->setPen(pen);
1344 lineseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1345
1346 }
1347
1348 return true;
1349}
1350
1351
1352bool GeneralChart::PlotTimeSeriesSet_A(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
1353{
1354 double x_min_val = timeseriesset->mintime();
1355 double x_max_val = timeseriesset->maxtime();
1356 double y_min_val = result_item->YLimit(_range::low);
1357 double y_max_val = result_item->YLimit(_range::high);
1358 QCategoryAxis* axisX = new QCategoryAxis();
1359 QValueAxis* axisY = new QValueAxis();
1360 QString xAxisTitle = x_axis_title;
1361 QString yAxisTitle = y_axis_title;
1362 if (x_axis_title.isEmpty()) xAxisTitle = "Value";
1363 if (y_axis_title.isEmpty()) yAxisTitle = "Sample";
1364 axisX->setObjectName("axisX");
1365 axisY->setObjectName("axisY");
1366 axisX->setTitleText(xAxisTitle);
1367 axisY->setTitleText(yAxisTitle);
1368 axisX->setRange(x_min_val,x_max_val);
1369 QStringList XAxisLabels;
1370 axisY->setRange(y_min_val,y_max_val);
1371 chart->addAxis(axisX, Qt::AlignBottom);
1372 chart->addAxis(axisY, Qt::AlignLeft);
1373 for (int i=0; i<timeseriesset->size(); i++)
1374 {
1375 QScatterSeries* scatterseries = new QScatterSeries();
1376 chart->addSeries(scatterseries);
1377 scatterseries->attachAxis(axisX);
1378 scatterseries->attachAxis(axisY);
1379
1380 for (int j=0; j<timeseriesset->at(i).size(); j++)
1381 {
1382 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1383 if (i==0)
1384 axisX->append(QString::fromStdString(timeseriesset->Label(j)),j+0.5);
1385 }
1386
1387 QPen pen = scatterseries->pen();
1388 pen.setWidth(2);
1389
1390 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1391 scatterseries->setPen(pen);
1392 scatterseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1393
1394 }
1395
1396
1397 return true;
1398}
1399
1400bool GeneralChart::PlotTimeSeriesSet_Stacked(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
1401{
1402
1403 QVector<QBarSet*> sets(timeseriesset->size());
1404 for (int i=0; i<timeseriesset->size(); i++)
1405 { sets[i] = new QBarSet(QString::fromStdString(timeseriesset->getSeriesName(i)));
1406 for (int j=0; j<timeseriesset->at(i).size(); j++)
1407 *sets[i] << timeseriesset->at(i).getValue(j);
1408
1409 }
1410
1411 QStackedBarSeries *series = new QStackedBarSeries;
1412 for (int i=0; i<timeseriesset->size(); i++)
1413 series->append(sets[i]);
1414
1415 chart->addSeries(series);
1416 chart->setTitle(title);
1417 chart->setAnimationOptions(QChart::SeriesAnimations);
1418 QStringList categories;
1419 for (int j=0; j<timeseriesset->at(0).size(); j++)
1420 categories << QString::fromStdString(timeseriesset->Label(j));
1421
1422 auto axisX = new QBarCategoryAxis;
1423 axisX->append(categories);
1424 chart->addAxis(axisX, Qt::AlignBottom);
1425 series->attachAxis(axisX);
1426 auto axisY = new QValueAxis;
1427 chart->addAxis(axisY, Qt::AlignLeft);
1428 series->attachAxis(axisY);
1429
1430 QString xAxisTitle = x_axis_title;
1431 QString yAxisTitle = y_axis_title;
1432 if (x_axis_title.isEmpty()) xAxisTitle = "Value";
1433 if (y_axis_title.isEmpty()) yAxisTitle = "Sample";
1434
1435 chart->legend()->setVisible(true);
1436 chart->legend()->setAlignment(Qt::AlignBottom);
1437
1438
1439 return true;
1440
1441}
1442
1444{
1445 QRect rect = QDialog::frameGeometry();
1446
1447 QString fileName = QFileDialog::getSaveFileName(this,
1448 tr("Save"), "",
1449 tr("png file (*.png)"));
1450
1451 if (!fileName.contains("."))
1452 fileName+=".png";
1453 chart->setAnimationOptions(QChart::NoAnimation);
1454 this->resize(rect.width() * 2, rect.height() * 2);
1455
1456 chartView->grab().save(fileName);
1457 this->resize(rect.size());
1458}
1459
1460
1462 double centerX, double centerY,
1463 double semiMajorAxis, double semiMinorAxis,
1464 double rotationAngle, double interval
1465) {
1466 std::vector<QPointF> points;
1467
1468 // Iterate over the angle in the range [0, 2π] with the given interval
1469 for (double t = 0; t <= 2 * M_PI; t += interval) {
1470 // Parametric equations for rotated ellipse
1471 double x = centerX + semiMajorAxis * cos(t) * cos(rotationAngle)
1472 - semiMinorAxis * sin(t) * sin(rotationAngle);
1473 double y = centerY + semiMajorAxis * cos(t) * sin(rotationAngle)
1474 + semiMinorAxis * sin(t) * cos(rotationAngle);
1475 QPointF point(x,y);
1476 points.push_back(point);
1477 }
1478
1479
1480 return points;
1481}
Matrix class with labeled rows and columns for Chemical Mass Balance analysis.
Definition cmbmatrix.h:19
Collection of time series with labels and observed values.
string Label(unsigned int i) const
Gets label for time point (uses custom labels if set)
double ObservedValue(int i)
Gets observed value at specified index.
Collection of named CMBVectorSet objects for hierarchical data organization.
Collection of named CMBVector objects for multi-variable analysis.
double min() const
Finds the minimum value across all vectors.
double max() const
Finds the maximum value across all vectors.
Vector class with string labels for Chemical Mass Balance analysis.
Definition cmbvector.h:17
vector< string > Labels() const
Gets all element labels.
Definition cmbvector.h:138
Definition chart.h:14
Source contribution container for Chemical Mass Balance results.
Manages a collection of elemental profiles (samples) for source fingerprinting analysis.
vector< string > GetElementNames() const
Get all element names (from first profile)
double GetMinimum() const
Get minimum concentration across all elements and samples.
double GetMaximum() const
Get maximum concentration across all elements and samples.
Container for elemental concentration data of a single sediment sample.
double GetMaximum() const
Get maximum concentration value.
vector< string > GetElementNames() const
Get list of all element names.
double GetMinimum() const
Get minimum concentration value.
bool PlotTimeSeriesSet_Stacked(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title, const QString &y_axis_title="")
bool PlotDistribution(TimeSeries< double > *mlr, const QString &variable)
bool PlotRangeSet(RangeSet *rangeset, const QString &title, const QString &x_axis_title, const QString &y_axis_title)
void onDistributionsVariableChanged(int)
bool PlotMatrix(CMBMatrix *matrix, const QString &title)
bool InitializeDistributions(CMBTimeSeriesSet *distributions, const QString &title)
bool PlotProfileSet(Elemental_Profile_Set *elementalprofileset, const QString &title)
QComboBox * source1_combo
bool PlotScatter(CMBMatrix *matrix)
ChartView * chartView
bool PlotContribution(Contribution *contributions, const QString &title)
void onMCMCVariableChanged(int)
Chart * chart
bool PlotVectorSet(CMBVectorSet *profile, const QString &title)
GeneralChart(QWidget *parent=nullptr)
bool PlotMCMCSamples(TimeSeries< double > *mlr, const QString &variable)
QComboBox * source2_combo
std::vector< QPointF > calculateRotatedEllipsePoints(double centerX, double centerY, double semiMajorAxis, double semiMinorAxis, double rotationAngle, double interval)
void onIndependentChanged(int i_independent)
bool PlotRegression(MultipleLinearRegression *timeseriesset, const QString &independent_var)
QComboBox * element_combo
bool PlotTimeSeriesSet(CMBTimeSeriesSet *regressionset, const QString &title, const QString &x_axis_title="", const QString &y_axis_title="")
bool PlotPredictedConcentration(Elemental_Profile *elemental_profile, const QString &title)
bool PlotVectorSetSet(CMBVectorSetSet *profile, const QString &title)
ResultItem * result_item
Ui::GeneralChart * ui
QComboBox * independent_combo
void onPairChanged(int pair_id)
bool Plot(ResultItem *res)
bool PlotTimeSeriesSet_M(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title="", const QString &y_axis_title="")
void onDFAPairChanged(int pair_id)
void onElementChanged(int i_constituent)
bool PlotVector(CMBVector *profile, const QString &title)
bool PlotRegressionSet(MultipleLinearRegressionSet *regressionset, const QString &title)
bool PlotTimeSeriesSet_A(CMBTimeSeriesSet *timeseriesset, const QString &title, const QString &x_axis_title="", const QString &y_axis_title="")
bool InitializeMCMCSamples(CMBTimeSeriesSet *mcmcsamples, const QString &title)
string XAxisTitle()
Definition resultitem.h:55
string Name() const
Definition resultitem.h:22
double YLimit(_range highlow)
Definition resultitem.h:59
result_type Type() const
Definition resultitem.h:24
string YAxisTitle()
Definition resultitem.h:56
Interface * Result() const
Definition resultitem.h:17
bool AbsValue()
Definition resultitem.h:58
bool FixedYLimit()
Definition resultitem.h:74
yaxis_mode YAxisMode()
Definition resultitem.h:27
double roundDown(double a, double rounding_value)
double roundDown(double a, double rounding_number=1.0)
@ low
Lower bound of the parameter range.
@ high
Upper bound of the parameter range.
@ distribution_with_observed
@ predicted_concentration
@ rangeset_with_observed
@ elemental_profile_set
@ timeseries_set_first_symbol