2#include "ui_generalchart.h"
132 return round(a/rounding_value)*rounding_value;
134 return -round(-a/rounding_value+1)*rounding_value;
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:");
150 for (map<std::string,CMBVectorSet>::iterator it = profile->begin(); it!=profile->end(); it++ )
155 ui->horizontalLayout->addWidget(source1_label);
157 ui->horizontalLayout->addWidget(source2_label);
166 QLabel *element_label =
new QLabel();
167 element_label->setText(
"Source group pair:");
171 for (map<std::string,CMBVector>::iterator it = profile->begin(); it!=profile->end(); it++ )
177 ui->horizontalLayout->addWidget(element_label);
186 QStringList categories;
188 QBarCategoryAxis *axisX =
new QBarCategoryAxis();
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]);
194 axisX->append(categories);
195 chart->addAxis(axisX, Qt::AlignBottom);
197 QLogValueAxis* axisYLog =
nullptr;
198 QValueAxis* axisYNormal =
nullptr;
202 profile_min = profile->abs().min();
204 profile_min = profile->min();
205 if (profile_min>0 && _log)
207 axisYLog =
new QLogValueAxis();
209 axisYLog->setRange(pow(10,
roundDown(
log(profile->abs().min())/
log(10.0))), pow(10,
int(
log(profile->abs().max()) /
log(10.0))+1));
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);
215 chart->addAxis(axisYLog, Qt::AlignLeft);
220 axisYNormal =
new QValueAxis();
222 axisYNormal->setRange(
roundDown(profile->abs().min()*10.0)/10,
roundDown((profile->abs().max()+0.1)*10.0)/10);
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);
228 chart->addAxis(axisYNormal, Qt::AlignLeft);
231 axisX->setLabelsAngle(-90);
232 chart->addAxis(axisX, Qt::AlignBottom);
236 QBarSeries* series =
new QBarSeries();
238 chart->addSeries(series);
239 series->setName(title);
240 series->attachAxis(axisX);
242 series->attachAxis(axisYLog);
244 series->attachAxis(axisYNormal);
247 QBarSet *barset =
new QBarSet(QString::fromStdString(
result_item->
Name()));
252 for (
int i=0; i<profile->num; i++)
255 barset->append(fabs(profile->at(i)));
257 barset->append(profile->at(i));
260 series->append(barset);
268 QStringList categories;
270 QBarCategoryAxis *axisX =
new QBarCategoryAxis();
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]);
276 axisX->append(categories);
277 chart->addAxis(axisX, Qt::AlignBottom);
279 QLogValueAxis* axisYLog =
nullptr;
280 QValueAxis* axisYNormal =
nullptr;
284 matrix_min =
matrix->abs().min();
286 matrix_min =
matrix->min();
289 if (matrix_min>0 && _log)
291 axisYLog =
new QLogValueAxis();
293 axisYLog->setLabelFormat(
"%g");
294 axisYLog->setMinorTickCount(5);
295 chart->addAxis(axisYLog, Qt::AlignLeft);
300 axisYNormal =
new QValueAxis();
302 axisYNormal->setLabelFormat(
"%f");
303 axisYNormal->setMinorTickCount(5);
304 chart->addAxis(axisYNormal, Qt::AlignLeft);
308 chart->addAxis(axisX, Qt::AlignBottom);
311 for (
int i=0; i<
matrix->getnumrows(); i++)
312 { QBarSeries* series =
new QBarSeries();
314 chart->addSeries(series);
315 series->setName(QString::fromStdString(
matrix->RowLabel(i)));
316 series->attachAxis(axisX);
318 series->attachAxis(axisYLog);
320 series->attachAxis(axisYNormal);
323 QBarSet *barset =
new QBarSet(QString::fromStdString(
matrix->RowLabel(i)));
328 for (
int j=0; j<
matrix->getnumcols(); j++)
331 barset->append(fabs(
matrix->matr[i][j]));
333 barset->append(
matrix->matr[i][j]);
336 series->append(barset);
346 QCategoryAxis* axisX =
new QCategoryAxis();
350 for (
int i=0; i<element_names.size(); i++)
351 axisX->append(QString::fromStdString(element_names[i]),
double(i+1));
354 QLogValueAxis* axisYLog =
nullptr;
355 QValueAxis* axisYNormal =
nullptr;
359 axisYLog =
new QLogValueAxis();
361 axisYLog->setLabelFormat(
"%g");
362 axisYLog->setMinorTickCount(5);
363 chart->addAxis(axisYLog, Qt::AlignLeft);
368 axisYNormal =
new QValueAxis();
373 axisYNormal->setLabelFormat(
"%g");
374 axisYNormal->setMinorTickCount(5);
375 chart->addAxis(axisYNormal, Qt::AlignLeft);
382 chart->addAxis(axisX, Qt::AlignBottom);
385 for (map<string,Elemental_Profile>::iterator it = profile_sets->begin(); it!=profile_sets->end(); it++)
387 QScatterSeries* series =
new QScatterSeries();
388 chart->addSeries(series);
389 series->setName(QString::fromStdString(it->first));
390 series->attachAxis(axisX);
392 series->attachAxis(axisYLog);
394 series->attachAxis(axisYNormal);
395 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
396 series->setMarkerSize(15.0);
398 for (map<string, double>::iterator datapoint = it->second.begin(); datapoint != it->second.end(); datapoint++)
400 series->append(
counter,datapoint->second);
410 QPieSeries* series =
new QPieSeries();
412 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
414 series->append(QString::fromStdString(it->first), it->second * 100);
415 labels.append(QString::number(it->second*100)+
"%");
418 chart->addSeries(series);
419 for(
auto slice : series->slices())
420 { slice->setLabel(QString(
"%1%").arg(100*slice->percentage(), 0,
'f', 1));
421 slice->setLabelVisible();
426 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
428 chart->legend()->markers(series)[i]->setLabel(QString::fromStdString(it->first));
432 series->setLabelsPosition(QPieSlice::LabelOutside);
433 chart->setTitle(title);
435 chartView->setRenderHint(QPainter::Antialiasing);
440 QCategoryAxis* axisX =
new QCategoryAxis();
442 axisX->setRange(0, profile_set->size()*10);
444 for (
int i = 0; i < element_names.size(); i++)
445 axisX->append(QString::fromStdString(element_names[i]),
double(i + 1)*10);
448 QLogValueAxis* axisYLog =
nullptr;
449 QValueAxis* axisYNormal =
nullptr;
454 axisYLog =
new QLogValueAxis();
456 axisYLog->setLabelFormat(
"%g");
457 axisYLog->setMinorTickCount(5);
459 chart->addAxis(axisYLog, Qt::AlignLeft);
464 axisYNormal =
new QValueAxis();
469 axisYNormal->setLabelFormat(
"%f");
470 axisYNormal->setMinorTickCount(5);
472 chart->addAxis(axisYNormal, Qt::AlignLeft);
479 chart->addAxis(axisX, Qt::AlignBottom);
483 QScatterSeries* series =
new QScatterSeries();
484 chart->addSeries(series);
485 series->setName(title);
486 series->attachAxis(axisX);
488 series->attachAxis(axisYLog);
490 series->attachAxis(axisYNormal);
491 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
492 series->setMarkerSize(15.0);
494 for (map<string, double>::iterator datapoint = profile_set->begin(); datapoint != profile_set->end(); datapoint++)
496 series->append(
counter*10, datapoint->second);
506 QLabel *element_label =
new QLabel();
507 element_label->setText(
"Constituent:");
512 for (map<std::string,MultipleLinearRegression>::iterator it = regressionset->begin(); it!=regressionset->end(); it++ )
517 QLabel *independent_label =
new QLabel();
518 independent_label->setText(
"Independent Variable:");
519 ui->horizontalLayout->addWidget(element_label);
521 ui->horizontalLayout->addWidget(independent_label);
531 QLabel *element_label =
new QLabel();
532 element_label->setText(
"Variable:");
533 ui->horizontalLayout->addWidget(element_label);
536 for (
int i = 0; i<mcmcsamples->size(); i++ )
538 element_combo->addItem(QString::fromStdString(mcmcsamples->getSeriesName(i)));
551 QLabel *element_label =
new QLabel();
552 element_label->setText(
"Variable:");
553 ui->horizontalLayout->addWidget(element_label);
556 for (
int i = 0; i<distributions->size(); i++ )
558 element_combo->addItem(QString::fromStdString(distributions->getSeriesName(i)));
574 for (
unsigned int i=0; i<
mlrset->at(constituent.toStdString()).GetIndependentVariableNames().size(); i++)
576 independent_combo->addItem(QString::fromStdString(
mlrset->at(constituent.toStdString()).GetIndependentVariableNames()[i]));
587 chart->removeAllSeries();
588 for (
int i=0; i<
chart->axes().size(); i++)
591 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
593 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
596 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
598 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
608 chart->removeAllSeries();
609 for (
int i=0; i<
chart->axes().size(); i++)
612 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
614 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
617 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
619 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
632 PlotMCMCSamples(&samplesset->operator[](variable.toStdString()),variable);
639 if (samplesset->Contains(variable.toStdString()))
655 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
657 qDebug()<<
chart->axes(Qt::Horizontal)[i]->objectName();
660 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
662 qDebug()<<
chart->axes(Qt::Vertical)[i]->objectName();
665 chart->removeAllSeries();
666 for (
int i=0; i<
chart->axes().size(); i++)
673 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
675 qDebug()<<
chart->axes(Qt::Horizontal)[i]->objectName();
676 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
679 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
681 qDebug()<<
chart->axes(Qt::Vertical)[i]->objectName();
682 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
684 chart->axes().clear();
685 QValueAxis* axisX =
new QValueAxis();
686 QValueAxis* axisYNormal =
new QValueAxis();
687 axisX->setObjectName(
"axisX");
688 axisYNormal->setObjectName(
"axisY");
690 QLineSeries *lineseries =
new QLineSeries();
691 double x_min_val = CVector(
mlr->IndependentData(independent_var.toStdString())).min();
692 double x_max_val = CVector(
mlr->IndependentData(independent_var.toStdString())).max();
693 double y_min_val, y_max_val;
696 { y_min_val =
mlr->CoefficientsIntercept()[0];
697 y_max_val =
mlr->CoefficientsIntercept()[0];
701 y_min_val = exp(
mlr->CoefficientsIntercept()[0]);
702 y_max_val = exp(
mlr->CoefficientsIntercept()[0]);
704 for (
int i=0; i<
mlr->GetIndependentVariableNames().size(); i++)
706 if (
mlr->GetIndependentVariableNames()[i]!=independent_var.toStdString())
709 { y_min_val +=
mlr->MeanIndependentVar(i)*
mlr->CoefficientsIntercept()[i+1];
710 y_max_val +=
mlr->MeanIndependentVar(i)*
mlr->CoefficientsIntercept()[i+1];
714 y_min_val *= exp(
log(
mlr->GeoMeanIndependentVar(i))*
mlr->CoefficientsIntercept()[i+1]);
715 y_max_val *= exp(
log(
mlr->GeoMeanIndependentVar(i))*
mlr->CoefficientsIntercept()[i+1]);
721 { y_min_val += x_min_val*
mlr->CoefficientsIntercept()[i+1];
722 y_max_val += x_max_val*
mlr->CoefficientsIntercept()[i+1];
726 y_min_val *= exp(
log(x_min_val)*
mlr->CoefficientsIntercept()[i+1]);
727 y_max_val *= exp(
log(x_max_val)*
mlr->CoefficientsIntercept()[i+1]);
732 axisX->setRange(CVector(
mlr->IndependentData(independent_var.toStdString())).min(), CVector(
mlr->IndependentData(independent_var.toStdString())).max());
733 axisX->setTitleText(independent_var);
737 axisYNormal->setTitleText(QString::fromStdString(
"Measured " +
mlr->DependentVariableName()));
740 QScatterSeries* series =
new QScatterSeries();
742 series->setName(QString::fromStdString(
mlr->DependentVariableName()));
743 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
744 series->setMarkerSize(15.0);
745 qDebug()<<independent_var;
746 for (
unsigned int i=0; i<
mlr->IndependentData(independent_var.toStdString()).size(); i++)
748 qDebug()<<
mlr->DependentData()[i] <<
","<<
mlr->IndependentData(independent_var.toStdString())[i];
749 series->append(
mlr->IndependentData(independent_var.toStdString())[i],
mlr->DependentData()[i]);
752 chart->addAxis(axisX, Qt::AlignBottom);
753 chart->addAxis(axisYNormal, Qt::AlignLeft);
754 chart->addSeries(series);
755 series->attachAxis(axisX);
756 series->attachAxis(axisYNormal);
760 lineseries->append(x_min_val,y_min_val);
761 lineseries->append(x_max_val,y_max_val);
765 for (
double x = x_min_val;
x<=x_max_val;
x+=(x_max_val-x_min_val)/20.0)
767 double y = exp(
mlr->CoefficientsIntercept()[0]);
768 for (
unsigned int i=0; i<
mlr->GetIndependentVariableNames().size(); i++)
769 if (
mlr->GetIndependentVariableNames()[i]!=independent_var.toStdString())
770 y *= exp(
log(
mlr->GeoMeanIndependentVar(i))*
mlr->CoefficientsIntercept()[i+1]);
772 y *= exp(
log(
x)*
mlr->CoefficientsIntercept()[i+1]);
773 lineseries->append(
x,
y);
776 chart->addSeries(lineseries);
777 lineseries->attachAxis(axisX);
778 lineseries->attachAxis(axisYNormal);
779 lineseries->setName(
"Regression");
780 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));
788 QValueAxis* axisX =
new QValueAxis();
789 QValueAxis* axisYNormal =
new QValueAxis();
790 axisX->setObjectName(
"axisX");
791 axisYNormal->setObjectName(
"axisY");
796 double x_min_val =
matrix->GetColumn(
matrix->ColumnLabel(0)).min();
797 double x_max_val =
matrix->GetColumn(
matrix->ColumnLabel(0)).max();
798 double y_min_val =
matrix->GetColumn(
matrix->ColumnLabel(1)).min();
799 double y_max_val =
matrix->GetColumn(
matrix->ColumnLabel(1)).max();
802 axisX->setRange(x_min_val-(x_max_val-x_min_val)*0.05,x_max_val+(x_max_val-x_min_val)*0.05);
803 axisX->setTitleText(QString::fromStdString(
matrix->ColumnLabel(0)));
804 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
805 axisYNormal->setTitleText(QString::fromStdString(
matrix->ColumnLabel(1)));
807 chart->addAxis(axisX, Qt::AlignBottom);
808 chart->addAxis(axisYNormal, Qt::AlignLeft);
810 QStringList rowcategories =
matrix->RowLabelCategories();
811 for (
int i=0; i<rowcategories.size();i++)
813 QScatterSeries* series =
new QScatterSeries();
814 qDebug()<<rowcategories[i];
815 for (
int j=0; j<
matrix->getnumrows(); j++)
816 if (QString::fromStdString(
matrix->RowLabel(j))==rowcategories[i])
819 QPen pen = series->pen();
821 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
824 series->setName(rowcategories[i]);
825 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
826 series->setMarkerSize(15.0);
827 chart->addSeries(series);
828 series->attachAxis(axisX);
829 series->attachAxis(axisYNormal);
839 QCategoryAxis* axisX =
new QCategoryAxis();
840 QValueAxis* axisYNormal =
new QValueAxis();
841 axisX->setObjectName(
"axisX");
842 axisYNormal->setObjectName(
"axisY");
844 double x_min_val = 0.5;
845 double x_max_val =
vectorset->size()+0.5;
850 axisX->setRange(x_min_val,x_max_val);
852 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
855 chart->addAxis(axisX, Qt::AlignBottom);
856 chart->addAxis(axisYNormal, Qt::AlignLeft);
858 QStringList categories;
860 for (map<string, CMBVector>::iterator vec =
vectorset->begin(); vec!=
vectorset->end(); vec++)
862 QScatterSeries* series =
new QScatterSeries();
864 for (
int j=0; j<vec->second.num; j++)
865 series->append(
counter+1,vec->second[j]);
868 QPen pen = series->pen();
870 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
873 series->setName(QString::fromStdString(vec->first));
874 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
875 series->setMarkerSize(15.0);
876 chart->addSeries(series);
877 series->attachAxis(axisX);
878 series->attachAxis(axisYNormal);
879 axisX->append(QString::fromStdString(vec->first),
counter+0.5);
889 QValueAxis* axisX =
new QValueAxis();
890 QValueAxis* axisYNormal =
new QValueAxis();
891 axisX->setObjectName(
"axisX");
892 axisYNormal->setObjectName(
"axisY");
894 double x_min_val = vectorset1->
min();
895 double x_max_val = vectorset1->
max();
896 double y_min_val = vectorset2->
min();
897 double y_max_val = vectorset2->
max();
900 axisX->setRange(x_min_val-(x_max_val-x_min_val)*0.05,x_max_val+(x_max_val-x_min_val)*0.05);
901 axisX->setTitleText(xaxisTitle);
902 axisYNormal->setRange(y_min_val-(y_max_val-y_min_val)*0.05,y_max_val+(y_max_val-y_min_val)*0.05);
903 axisYNormal->setTitleText(yaxisTitle);
905 chart->addAxis(axisX, Qt::AlignBottom);
906 chart->addAxis(axisYNormal, Qt::AlignLeft);
908 QStringList categories;
912 for (map<string, CMBVector>::iterator vec = vectorset1->begin(); vec!=vectorset1->end(); vec++)
914 QScatterSeries* series =
new QScatterSeries();
916 TimeSeriesSet<double> vals(2);
917 for (
int j=0; j<vec->second.num; j++)
919 series->append(vec->second[j],vectorset2->at(vec->first)[j]);
920 vals[0].append(j,vec->second[j]);
921 vals[1].append(j,vectorset2->at(vec->first)[j]);
924 double mean1 = vals[0].mean();
925 double mean2 = vals[1].mean();
926 double std1 = vals[0].stddev();
927 double std2 = vals[1].stddev();
928 double Cov = Covariance(vals[0],vals[1]);
930 QColor color = QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256));
934 series->setName(QString::fromStdString(vec->first));
935 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
936 series->setMarkerSize(15.0);
937 series->setColor(color);
938 QPen pen = series->pen();
944 chart->addSeries(series);
945 series->attachAxis(axisX);
946 series->attachAxis(axisYNormal);
947 double rho = Cov/(std1*std2);
948 double major_diagonal;
949 double minor_diagonal;
952 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))));
953 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))));
957 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))));
958 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))));
960 double orientation = 0.5*atan(2*rho*std1*std2/(std1*std1-std2*std2));
962 qDebug()<<
"Std1="<<std1;
963 qDebug()<<
"Std2="<<std2;
964 qDebug()<<
"Rho="<<rho;
965 qDebug()<<
"Major diagonal="<<major_diagonal;
966 qDebug()<<
"Minor diagonal="<<minor_diagonal;
967 qDebug()<<
"Orienation="<<orientation;
969 QLineSeries* seriesellipse =
new QLineSeries();
970 seriesellipse->setName(QString::fromStdString(vec->first));
972 for (
size_t i = 0; i<ellipsepoints.size(); i++)
974 seriesellipse->append(ellipsepoints[i].
x(), ellipsepoints[i].
y());
977 QPen penellipse = QPen(QBrush(Qt::DashLine),2,Qt::PenStyle::DashLine);
978 penellipse.setColor(color);
979 penellipse.setWidth(2);
980 penellipse.setBrush(color);
982 seriesellipse->setPen(penellipse);
984 chart->addSeries(seriesellipse);
986 for (
size_t i = 0; i<
chart->legend()->markers(seriesellipse).size(); i++)
987 chart->legend()->markers(seriesellipse)[i]->setVisible(
false);
988 seriesellipse->attachAxis(axisX);
989 seriesellipse->attachAxis(axisYNormal);
1003 chart->removeAllSeries();
1004 for (
int i=0; i<
chart->axes().size(); i++)
1010 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
1012 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
1015 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
1017 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
1019 chart->axes().clear();
1020 QValueAxis* axisX =
new QValueAxis();
1021 QValueAxis* axisYNormal =
new QValueAxis();
1022 axisX->setObjectName(
"axisX");
1023 axisYNormal->setObjectName(
"axisY");
1025 double x_min_val =
samples->mint();
1026 double x_max_val =
samples->maxt();
1027 double y_min_val =
samples->minC();
1028 double y_max_val =
samples->maxC();
1031 axisX->setRange(x_min_val, x_max_val);
1032 axisX->setTitleText(
"Sample number");
1036 axisYNormal->setTitleText(variable);
1037 axisYNormal->setRange(y_min_val, y_max_val);
1040 QScatterSeries* series =
new QScatterSeries();
1042 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1044 series->setName(variable);
1045 series->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
1046 series->setMarkerSize(3.0);
1047 series->setPen(marker_pen);
1050 for (
int i=0; i<
samples->size(); i++)
1055 chart->addAxis(axisX, Qt::AlignBottom);
1056 chart->addAxis(axisYNormal, Qt::AlignLeft);
1057 chart->addSeries(series);
1058 series->attachAxis(axisX);
1059 series->attachAxis(axisYNormal);
1067 chart->removeAllSeries();
1068 for (
int i=0; i<
chart->axes().size(); i++)
1074 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
1076 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
1079 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
1081 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
1083 chart->axes().clear();
1084 QValueAxis* axisX =
new QValueAxis();
1085 QValueAxis* axisYNormal =
new QValueAxis();
1086 axisX->setObjectName(
"axisX");
1087 axisYNormal->setObjectName(
"axisY");
1089 double x_min_val =
samples->mint();
1090 double x_max_val =
samples->maxt();
1091 double y_min_val =
samples->minC();
1092 double y_max_val =
samples->maxC();
1095 axisX->setRange(x_min_val, x_max_val);
1096 axisX->setTitleText(
"Sample number");
1097 axisYNormal->setTitleText(variable);
1098 axisYNormal->setRange(y_min_val, y_max_val);
1100 QLineSeries *series =
new QLineSeries();
1101 QAreaSeries *areaseries =
new QAreaSeries(series);
1103 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1105 series->setName(variable);
1106 series->setPen(marker_pen);
1108 for (
int i=0; i<
samples->size(); i++)
1113 chart->addAxis(axisX, Qt::AlignBottom);
1114 chart->addAxis(axisYNormal, Qt::AlignLeft);
1116 chart->addSeries(series);
1117 series->attachAxis(axisX);
1118 series->attachAxis(axisYNormal);
1120 chart->addSeries(areaseries);
1121 areaseries->attachAxis(axisX);
1122 areaseries->attachAxis(axisYNormal);
1126 QLineSeries *observed_series =
new QLineSeries;
1127 QPen observed_pen(QBrush(Qt::DashLine),3,Qt::PenStyle::DashLine);
1128 observed_pen.setColor(Qt::black);
1129 observed_series->setPen(observed_pen);
1132 chart->addSeries(observed_series);
1133 observed_series->attachAxis(axisX);
1134 observed_series->attachAxis(axisYNormal);
1141 double x_min_val = timeseriesset->mintime();
1142 double x_max_val = timeseriesset->maxtime();
1143 double y_min_val = timeseriesset->minval();
1144 double y_max_val = timeseriesset->maxval();
1145 QString xAxisTitle = x_axis_title;
1146 QString yAxisTitle = y_axis_title;
1147 if (x_axis_title.isEmpty()) xAxisTitle =
"Value";
1148 if (y_axis_title.isEmpty()) yAxisTitle =
"CDF";
1149 QValueAxis* axisX =
new QValueAxis();
1150 QValueAxis* axisY =
new QValueAxis();
1151 axisX->setObjectName(
"axisX");
1152 axisY->setObjectName(
"axisY");
1153 axisX->setTitleText(xAxisTitle);
1154 axisY->setTitleText(yAxisTitle);
1155 axisX->setRange(x_min_val,x_max_val);
1156 axisY->setRange(y_min_val,y_max_val);
1157 chart->addAxis(axisX, Qt::AlignBottom);
1158 chart->addAxis(axisY, Qt::AlignLeft);
1159 for (
int i=0; i<timeseriesset->size(); i++)
1161 QLineSeries *lineseries =
new QLineSeries();
1162 chart->addSeries(lineseries);
1163 lineseries->attachAxis(axisX);
1164 lineseries->attachAxis(axisY);
1166 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1168 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1170 QPen pen = lineseries->pen();
1172 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1173 lineseries->setPen(pen);
1174 lineseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1183 double y_min_val =
rangeset->minval();
1184 double y_max_val =
rangeset->maxval();
1198 y_min_val = max(y_min_val,1e-8);
1200 QString xAxisTitle = x_axis_title;
1201 QString yAxisTitle = y_axis_title;
1202 if (x_axis_title.isEmpty()) xAxisTitle =
"Constituent";
1203 if (y_axis_title.isEmpty()) yAxisTitle =
"95% CI";
1204 QCategoryAxis* axisX =
new QCategoryAxis();
1206 QLogValueAxis* axisYLog =
new QLogValueAxis();
1207 QValueAxis* axisY =
new QValueAxis();
1209 axisX->setObjectName(
"axisX");
1210 axisY->setObjectName(
"axisY");
1211 axisYLog->setObjectName(
"axisYLog");
1212 axisYLog->setMinorTickCount(10);
1214 axisX->setTitleText(xAxisTitle);
1216 { axisYLog->setTitleText(yAxisTitle);
1217 axisYLog->setRange(y_min_val,y_max_val);
1218 axisYLog->setLabelFormat(
"%g");
1221 { axisY->setTitleText(yAxisTitle);
1222 axisY->setRange(y_min_val,y_max_val);
1223 axisYLog->setLabelFormat(
"%f");
1225 axisX->setRange(-0.5,
rangeset->size()-0.5);
1228 chart->addAxis(axisX, Qt::AlignBottom);
1230 chart->addAxis(axisYLog, Qt::AlignLeft);
1232 chart->addAxis(axisY, Qt::AlignLeft);
1234 double upperlimit = 0.5;
1235 axisX->setStartValue(-0.5);
1236 QBoxPlotSeries *boxWhiskSeries =
new QBoxPlotSeries();
1238 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1240 axisX->append(QString::fromStdString(it->first),upperlimit);
1245 { QScatterSeries* scatterseries =
new QScatterSeries();
1246 chart->addSeries(scatterseries);
1247 scatterseries->attachAxis(axisX);
1249 scatterseries->attachAxis(axisYLog);
1251 scatterseries->attachAxis(axisY);
1253 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1255 scatterseries->append(
counter,it->second.GetValue());
1258 QPen pen = scatterseries->pen();
1261 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1262 scatterseries->setPen(pen);
1263 scatterseries->setName(QString::fromStdString(
"Observed value"));
1266 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1268 QBoxSet *boxSet =
new QBoxSet();
1270 boxSet->setValue(QBoxSet::LowerExtreme, max(it->second.Get(
_range::low),y_min_val));
1271 boxSet->setValue(QBoxSet::UpperExtreme, it->second.Get(
_range::high));
1272 boxSet->setValue(QBoxSet::LowerQuartile, max(it->second.Get(
_range::low),y_min_val));
1273 boxSet->setValue(QBoxSet::UpperQuartile, it->second.Get(
_range::high));
1274 boxSet->setValue(QBoxSet::Median, it->second.Median());
1275 boxWhiskSeries->append(boxSet);
1279 QPen brushcolor(QColor(0,200,0,126));
1280 QBrush brush(QColor(0,200,0,126));
1281 boxWhiskSeries->setBrush(brush);
1282 boxWhiskSeries->setName(
"95% Credible Interval");
1284 chart->addSeries(boxWhiskSeries);
1286 boxWhiskSeries->attachAxis(axisYLog);
1288 boxWhiskSeries->attachAxis(axisY);
1289 boxWhiskSeries->attachAxis(axisX);
1296 double x_min_val = timeseriesset->mintime();
1297 double x_max_val = timeseriesset->maxtime();
1298 double y_min_val = timeseriesset->minval();
1299 double y_max_val = timeseriesset->maxval();
1300 QValueAxis* axisX =
new QValueAxis();
1301 QValueAxis* axisY =
new QValueAxis();
1302 QString xAxisTitle = x_axis_title;
1303 QString yAxisTitle = y_axis_title;
1304 if (x_axis_title.isEmpty()) xAxisTitle =
"Value";
1305 if (y_axis_title.isEmpty()) yAxisTitle =
"CDF";
1306 axisX->setObjectName(
"axisX");
1307 axisY->setObjectName(
"axisY");
1308 axisX->setTitleText(xAxisTitle);
1309 axisY->setTitleText(yAxisTitle);
1310 axisX->setRange(x_min_val,x_max_val);
1311 axisY->setRange(y_min_val,y_max_val);
1312 chart->addAxis(axisX, Qt::AlignBottom);
1313 chart->addAxis(axisY, Qt::AlignLeft);
1315 QStringList x_Labels;
1318 QScatterSeries* scatterseries =
new QScatterSeries();
1319 chart->addSeries(scatterseries);
1320 scatterseries->attachAxis(axisX);
1321 scatterseries->attachAxis(axisY);
1323 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1325 x_Labels.append(QString::fromStdString(timeseriesset->
Label(j)));
1327 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1329 QPen pen = scatterseries->pen();
1332 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1333 scatterseries->setPen(pen);
1334 scatterseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1337 for (
int i=1; i<timeseriesset->size(); i++)
1339 QLineSeries *lineseries =
new QLineSeries();
1340 chart->addSeries(lineseries);
1341 lineseries->attachAxis(axisX);
1342 lineseries->attachAxis(axisY);
1344 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1346 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1348 QPen pen = lineseries->pen();
1350 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1351 lineseries->setPen(pen);
1352 lineseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1362 double x_min_val = timeseriesset->mintime();
1363 double x_max_val = timeseriesset->maxtime();
1366 QCategoryAxis* axisX =
new QCategoryAxis();
1367 QValueAxis* axisY =
new QValueAxis();
1368 QString xAxisTitle = x_axis_title;
1369 QString yAxisTitle = y_axis_title;
1370 if (x_axis_title.isEmpty()) xAxisTitle =
"Value";
1371 if (y_axis_title.isEmpty()) yAxisTitle =
"Sample";
1372 axisX->setObjectName(
"axisX");
1373 axisY->setObjectName(
"axisY");
1374 axisX->setTitleText(xAxisTitle);
1375 axisY->setTitleText(yAxisTitle);
1376 axisX->setRange(x_min_val,x_max_val);
1377 QStringList XAxisLabels;
1378 axisY->setRange(y_min_val,y_max_val);
1379 chart->addAxis(axisX, Qt::AlignBottom);
1380 chart->addAxis(axisY, Qt::AlignLeft);
1381 for (
int i=0; i<timeseriesset->size(); i++)
1383 QScatterSeries* scatterseries =
new QScatterSeries();
1384 chart->addSeries(scatterseries);
1385 scatterseries->attachAxis(axisX);
1386 scatterseries->attachAxis(axisY);
1388 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1390 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1392 axisX->append(QString::fromStdString(timeseriesset->
Label(j)),j+0.5);
1395 QPen pen = scatterseries->pen();
1398 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
1399 scatterseries->setPen(pen);
1400 scatterseries->setName(QString::fromStdString(timeseriesset->getSeriesName(i)));
1411 QVector<QBarSet*> sets(timeseriesset->size());
1412 for (
int i=0; i<timeseriesset->size(); i++)
1413 { sets[i] =
new QBarSet(QString::fromStdString(timeseriesset->getSeriesName(i)));
1414 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1415 *sets[i] << timeseriesset->at(i).getValue(j);
1419 QStackedBarSeries *series =
new QStackedBarSeries;
1420 for (
int i=0; i<timeseriesset->size(); i++)
1421 series->append(sets[i]);
1423 chart->addSeries(series);
1424 chart->setTitle(title);
1425 chart->setAnimationOptions(QChart::SeriesAnimations);
1426 QStringList categories;
1427 for (
int j=0; j<timeseriesset->at(0).size(); j++)
1428 categories << QString::fromStdString(timeseriesset->
Label(j));
1430 auto axisX =
new QBarCategoryAxis;
1431 axisX->append(categories);
1432 chart->addAxis(axisX, Qt::AlignBottom);
1433 series->attachAxis(axisX);
1434 auto axisY =
new QValueAxis;
1435 chart->addAxis(axisY, Qt::AlignLeft);
1436 series->attachAxis(axisY);
1438 QString xAxisTitle = x_axis_title;
1439 QString yAxisTitle = y_axis_title;
1440 if (x_axis_title.isEmpty()) xAxisTitle =
"Value";
1441 if (y_axis_title.isEmpty()) yAxisTitle =
"Sample";
1443 chart->legend()->setVisible(
true);
1444 chart->legend()->setAlignment(Qt::AlignBottom);
1453 QRect rect = QDialog::frameGeometry();
1455 QString fileName = QFileDialog::getSaveFileName(
this,
1457 tr(
"png file (*.png)"));
1459 if (!fileName.contains(
"."))
1461 chart->setAnimationOptions(QChart::NoAnimation);
1462 this->resize(rect.width() * 2, rect.height() * 2);
1465 this->resize(rect.size());
1470 double centerX,
double centerY,
1471 double semiMajorAxis,
double semiMinorAxis,
1472 double rotationAngle,
double interval
1474 std::vector<QPointF> points;
1477 for (
double t = 0; t <= 2 * M_PI; t += interval) {
1479 double x = centerX + semiMajorAxis * cos(t) * cos(rotationAngle)
1480 - semiMinorAxis * sin(t) * sin(rotationAngle);
1481 double y = centerY + semiMajorAxis * cos(t) * sin(rotationAngle)
1482 + semiMinorAxis * sin(t) * cos(rotationAngle);
1484 points.push_back(point);
Matrix class with labeled rows and columns for Chemical Mass Balance analysis.
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.
vector< string > Labels() const
Gets all element labels.
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)
bool PlotContribution(Contribution *contributions, const QString &title)
void onMCMCVariableChanged(int)
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)
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)
double YLimit(_range highlow)
Interface * Result() const
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
@ timeseries_set_first_symbol