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;
198 QValueAxis* axisYNormal;
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;
280 QValueAxis* axisYNormal;
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;
355 QValueAxis* axisYNormal;
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);
378 chart->addAxis(axisX, Qt::AlignBottom);
381 for (map<string,Elemental_Profile>::iterator it = profile_sets->begin(); it!=profile_sets->end(); it++)
383 QScatterSeries* series =
new QScatterSeries();
384 chart->addSeries(series);
385 series->setName(QString::fromStdString(it->first));
386 series->attachAxis(axisX);
388 series->attachAxis(axisYLog);
390 series->attachAxis(axisYNormal);
391 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
392 series->setMarkerSize(15.0);
394 for (map<string, double>::iterator datapoint = it->second.begin(); datapoint != it->second.end(); datapoint++)
396 series->append(
counter,datapoint->second);
406 QPieSeries* series =
new QPieSeries();
408 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
410 series->append(QString::fromStdString(it->first), it->second * 100);
411 labels.append(QString::number(it->second*100)+
"%");
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();
422 for (map<string, double>::iterator it = contributions->begin(); it != contributions->end(); it++)
424 chart->legend()->markers(series)[i]->setLabel(QString::fromStdString(it->first));
428 series->setLabelsPosition(QPieSlice::LabelOutside);
429 chart->setTitle(title);
431 chartView->setRenderHint(QPainter::Antialiasing);
436 QCategoryAxis* axisX =
new QCategoryAxis();
438 axisX->setRange(0, profile_set->size()*10);
440 for (
int i = 0; i < element_names.size(); i++)
441 axisX->append(QString::fromStdString(element_names[i]),
double(i + 1)*10);
444 QLogValueAxis* axisYLog;
445 QValueAxis* axisYNormal;
450 axisYLog =
new QLogValueAxis();
452 axisYLog->setLabelFormat(
"%g");
453 axisYLog->setMinorTickCount(5);
455 chart->addAxis(axisYLog, Qt::AlignLeft);
460 axisYNormal =
new QValueAxis();
465 axisYNormal->setLabelFormat(
"%f");
466 axisYNormal->setMinorTickCount(5);
468 chart->addAxis(axisYNormal, Qt::AlignLeft);
471 chart->addAxis(axisX, Qt::AlignBottom);
475 QScatterSeries* series =
new QScatterSeries();
476 chart->addSeries(series);
477 series->setName(title);
478 series->attachAxis(axisX);
480 series->attachAxis(axisYLog);
482 series->attachAxis(axisYNormal);
483 series->setMarkerShape(QScatterSeries::MarkerShapeCircle);
484 series->setMarkerSize(15.0);
486 for (map<string, double>::iterator datapoint = profile_set->begin(); datapoint != profile_set->end(); datapoint++)
488 series->append(
counter*10, datapoint->second);
498 QLabel *element_label =
new QLabel();
499 element_label->setText(
"Constituent:");
504 for (map<std::string,MultipleLinearRegression>::iterator it = regressionset->begin(); it!=regressionset->end(); it++ )
509 QLabel *independent_label =
new QLabel();
510 independent_label->setText(
"Independent Variable:");
511 ui->horizontalLayout->addWidget(element_label);
513 ui->horizontalLayout->addWidget(independent_label);
523 QLabel *element_label =
new QLabel();
524 element_label->setText(
"Variable:");
525 ui->horizontalLayout->addWidget(element_label);
528 for (
int i = 0; i<mcmcsamples->size(); i++ )
530 element_combo->addItem(QString::fromStdString(mcmcsamples->getSeriesName(i)));
543 QLabel *element_label =
new QLabel();
544 element_label->setText(
"Variable:");
545 ui->horizontalLayout->addWidget(element_label);
548 for (
int i = 0; i<distributions->size(); i++ )
550 element_combo->addItem(QString::fromStdString(distributions->getSeriesName(i)));
566 for (
unsigned int i=0; i<
mlrset->at(constituent.toStdString()).GetIndependentVariableNames().size(); i++)
568 independent_combo->addItem(QString::fromStdString(
mlrset->at(constituent.toStdString()).GetIndependentVariableNames()[i]));
579 chart->removeAllSeries();
580 for (
int i=0; i<
chart->axes().size(); i++)
583 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
585 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
588 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
590 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
600 chart->removeAllSeries();
601 for (
int i=0; i<
chart->axes().size(); i++)
604 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
606 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
609 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
611 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
624 PlotMCMCSamples(&samplesset->operator[](variable.toStdString()),variable);
631 if (samplesset->Contains(variable.toStdString()))
647 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
649 qDebug()<<
chart->axes(Qt::Horizontal)[i]->objectName();
652 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
654 qDebug()<<
chart->axes(Qt::Vertical)[i]->objectName();
657 chart->removeAllSeries();
658 for (
int i=0; i<
chart->axes().size(); i++)
665 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
667 qDebug()<<
chart->axes(Qt::Horizontal)[i]->objectName();
668 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
671 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
673 qDebug()<<
chart->axes(Qt::Vertical)[i]->objectName();
674 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
676 chart->axes().clear();
677 QValueAxis* axisX =
new QValueAxis();
678 QValueAxis* axisYNormal =
new QValueAxis();
679 axisX->setObjectName(
"axisX");
680 axisYNormal->setObjectName(
"axisY");
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;
688 { y_min_val =
mlr->CoefficientsIntercept()[0];
689 y_max_val =
mlr->CoefficientsIntercept()[0];
693 y_min_val = exp(
mlr->CoefficientsIntercept()[0]);
694 y_max_val = exp(
mlr->CoefficientsIntercept()[0]);
696 for (
int i=0; i<
mlr->GetIndependentVariableNames().size(); i++)
698 if (
mlr->GetIndependentVariableNames()[i]!=independent_var.toStdString())
701 { y_min_val +=
mlr->MeanIndependentVar(i)*
mlr->CoefficientsIntercept()[i+1];
702 y_max_val +=
mlr->MeanIndependentVar(i)*
mlr->CoefficientsIntercept()[i+1];
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]);
713 { y_min_val += x_min_val*
mlr->CoefficientsIntercept()[i+1];
714 y_max_val += x_max_val*
mlr->CoefficientsIntercept()[i+1];
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]);
724 axisX->setRange(CVector(
mlr->IndependentData(independent_var.toStdString())).min(), CVector(
mlr->IndependentData(independent_var.toStdString())).max());
725 axisX->setTitleText(independent_var);
729 axisYNormal->setTitleText(QString::fromStdString(
"Measured " +
mlr->DependentVariableName()));
732 QScatterSeries* series =
new QScatterSeries();
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++)
740 qDebug()<<
mlr->DependentData()[i] <<
","<<
mlr->IndependentData(independent_var.toStdString())[i];
741 series->append(
mlr->IndependentData(independent_var.toStdString())[i],
mlr->DependentData()[i]);
744 chart->addAxis(axisX, Qt::AlignBottom);
745 chart->addAxis(axisYNormal, Qt::AlignLeft);
746 chart->addSeries(series);
747 series->attachAxis(axisX);
748 series->attachAxis(axisYNormal);
752 lineseries->append(x_min_val,y_min_val);
753 lineseries->append(x_max_val,y_max_val);
757 for (
double x = x_min_val;
x<=x_max_val;
x+=(x_max_val-x_min_val)/20.0)
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]);
764 y *= exp(
log(
x)*
mlr->CoefficientsIntercept()[i+1]);
765 lineseries->append(
x,
y);
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));
780 QValueAxis* axisX =
new QValueAxis();
781 QValueAxis* axisYNormal =
new QValueAxis();
782 axisX->setObjectName(
"axisX");
783 axisYNormal->setObjectName(
"axisY");
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();
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)));
799 chart->addAxis(axisX, Qt::AlignBottom);
800 chart->addAxis(axisYNormal, Qt::AlignLeft);
802 QStringList rowcategories =
matrix->RowLabelCategories();
803 for (
int i=0; i<rowcategories.size();i++)
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])
811 QPen pen = series->pen();
813 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
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);
831 QCategoryAxis* axisX =
new QCategoryAxis();
832 QValueAxis* axisYNormal =
new QValueAxis();
833 axisX->setObjectName(
"axisX");
834 axisYNormal->setObjectName(
"axisY");
836 double x_min_val = 0.5;
837 double x_max_val =
vectorset->size()+0.5;
842 axisX->setRange(x_min_val,x_max_val);
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);
847 chart->addAxis(axisX, Qt::AlignBottom);
848 chart->addAxis(axisYNormal, Qt::AlignLeft);
850 QStringList categories;
852 for (map<string, CMBVector>::iterator vec =
vectorset->begin(); vec!=
vectorset->end(); vec++)
854 QScatterSeries* series =
new QScatterSeries();
856 for (
int j=0; j<vec->second.num; j++)
857 series->append(
counter+1,vec->second[j]);
860 QPen pen = series->pen();
862 pen.setBrush(QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256)));
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);
881 QValueAxis* axisX =
new QValueAxis();
882 QValueAxis* axisYNormal =
new QValueAxis();
883 axisX->setObjectName(
"axisX");
884 axisYNormal->setObjectName(
"axisY");
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();
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);
897 chart->addAxis(axisX, Qt::AlignBottom);
898 chart->addAxis(axisYNormal, Qt::AlignLeft);
900 QStringList categories;
904 for (map<string, CMBVector>::iterator vec = vectorset1->begin(); vec!=vectorset1->end(); vec++)
906 QScatterSeries* series =
new QScatterSeries();
908 TimeSeriesSet<double> vals(2);
909 for (
int j=0; j<vec->second.num; j++)
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]);
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]);
922 QColor color = QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256));
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();
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;
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))));
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))));
952 double orientation = 0.5*atan(2*rho*std1*std2/(std1*std1-std2*std2));
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;
961 QLineSeries* seriesellipse =
new QLineSeries();
962 seriesellipse->setName(QString::fromStdString(vec->first));
964 for (
size_t i = 0; i<ellipsepoints.size(); i++)
966 seriesellipse->append(ellipsepoints[i].
x(), ellipsepoints[i].
y());
969 QPen penellipse = QPen(QBrush(Qt::DashLine),2,Qt::PenStyle::DashLine);
970 penellipse.setColor(color);
971 penellipse.setWidth(2);
972 penellipse.setBrush(color);
974 seriesellipse->setPen(penellipse);
976 chart->addSeries(seriesellipse);
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);
995 chart->removeAllSeries();
996 for (
int i=0; i<
chart->axes().size(); i++)
1002 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
1004 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
1007 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
1009 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
1011 chart->axes().clear();
1012 QValueAxis* axisX =
new QValueAxis();
1013 QValueAxis* axisYNormal =
new QValueAxis();
1014 axisX->setObjectName(
"axisX");
1015 axisYNormal->setObjectName(
"axisY");
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();
1023 axisX->setRange(x_min_val, x_max_val);
1024 axisX->setTitleText(
"Sample number");
1028 axisYNormal->setTitleText(variable);
1029 axisYNormal->setRange(y_min_val, y_max_val);
1032 QScatterSeries* series =
new QScatterSeries();
1034 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1036 series->setName(variable);
1037 series->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
1038 series->setMarkerSize(3.0);
1039 series->setPen(marker_pen);
1042 for (
int i=0; i<
samples->size(); i++)
1047 chart->addAxis(axisX, Qt::AlignBottom);
1048 chart->addAxis(axisYNormal, Qt::AlignLeft);
1049 chart->addSeries(series);
1050 series->attachAxis(axisX);
1051 series->attachAxis(axisYNormal);
1059 chart->removeAllSeries();
1060 for (
int i=0; i<
chart->axes().size(); i++)
1066 for (
int i=0; i<
chart->axes(Qt::Horizontal).size(); i++)
1068 chart->removeAxis(
chart->axes(Qt::Horizontal)[i]);
1071 for (
int i=0; i<
chart->axes(Qt::Vertical).size(); i++)
1073 chart->removeAxis(
chart->axes(Qt::Vertical)[i]);
1075 chart->axes().clear();
1076 QValueAxis* axisX =
new QValueAxis();
1077 QValueAxis* axisYNormal =
new QValueAxis();
1078 axisX->setObjectName(
"axisX");
1079 axisYNormal->setObjectName(
"axisY");
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();
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);
1092 QLineSeries *series =
new QLineSeries();
1093 QAreaSeries *areaseries =
new QAreaSeries(series);
1095 QPen marker_pen(QBrush(Qt::SolidPattern),1,Qt::PenStyle::SolidLine);
1097 series->setName(variable);
1098 series->setPen(marker_pen);
1100 for (
int i=0; i<
samples->size(); i++)
1105 chart->addAxis(axisX, Qt::AlignBottom);
1106 chart->addAxis(axisYNormal, Qt::AlignLeft);
1108 chart->addSeries(series);
1109 series->attachAxis(axisX);
1110 series->attachAxis(axisYNormal);
1112 chart->addSeries(areaseries);
1113 areaseries->attachAxis(axisX);
1114 areaseries->attachAxis(axisYNormal);
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);
1124 chart->addSeries(observed_series);
1125 observed_series->attachAxis(axisX);
1126 observed_series->attachAxis(axisYNormal);
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++)
1153 QLineSeries *lineseries =
new QLineSeries();
1154 chart->addSeries(lineseries);
1155 lineseries->attachAxis(axisX);
1156 lineseries->attachAxis(axisY);
1158 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1160 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1162 QPen pen = lineseries->pen();
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)));
1175 double y_min_val =
rangeset->minval();
1176 double y_max_val =
rangeset->maxval();
1190 y_min_val = max(y_min_val,1e-8);
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();
1198 QLogValueAxis* axisYLog =
new QLogValueAxis();
1199 QValueAxis* axisY =
new QValueAxis();
1201 axisX->setObjectName(
"axisX");
1202 axisY->setObjectName(
"axisY");
1203 axisYLog->setObjectName(
"axisYLog");
1204 axisYLog->setMinorTickCount(10);
1206 axisX->setTitleText(xAxisTitle);
1208 { axisYLog->setTitleText(yAxisTitle);
1209 axisYLog->setRange(y_min_val,y_max_val);
1210 axisYLog->setLabelFormat(
"%g");
1213 { axisY->setTitleText(yAxisTitle);
1214 axisY->setRange(y_min_val,y_max_val);
1215 axisYLog->setLabelFormat(
"%f");
1217 axisX->setRange(-0.5,
rangeset->size()-0.5);
1220 chart->addAxis(axisX, Qt::AlignBottom);
1222 chart->addAxis(axisYLog, Qt::AlignLeft);
1224 chart->addAxis(axisY, Qt::AlignLeft);
1226 double upperlimit = 0.5;
1227 axisX->setStartValue(-0.5);
1228 QBoxPlotSeries *boxWhiskSeries =
new QBoxPlotSeries();
1230 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1232 axisX->append(QString::fromStdString(it->first),upperlimit);
1237 { QScatterSeries* scatterseries =
new QScatterSeries();
1238 chart->addSeries(scatterseries);
1239 scatterseries->attachAxis(axisX);
1241 scatterseries->attachAxis(axisYLog);
1243 scatterseries->attachAxis(axisY);
1245 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1247 scatterseries->append(
counter,it->second.GetValue());
1250 QPen pen = scatterseries->pen();
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"));
1258 for (map<string, Range>::iterator it =
rangeset->begin(); it!=
rangeset->end(); it++)
1260 QBoxSet *boxSet =
new QBoxSet();
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);
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");
1276 chart->addSeries(boxWhiskSeries);
1278 boxWhiskSeries->attachAxis(axisYLog);
1280 boxWhiskSeries->attachAxis(axisY);
1281 boxWhiskSeries->attachAxis(axisX);
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);
1307 QStringList x_Labels;
1310 QScatterSeries* scatterseries =
new QScatterSeries();
1311 chart->addSeries(scatterseries);
1312 scatterseries->attachAxis(axisX);
1313 scatterseries->attachAxis(axisY);
1315 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1317 x_Labels.append(QString::fromStdString(timeseriesset->
Label(j)));
1319 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1321 QPen pen = scatterseries->pen();
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)));
1329 for (
int i=1; i<timeseriesset->size(); i++)
1331 QLineSeries *lineseries =
new QLineSeries();
1332 chart->addSeries(lineseries);
1333 lineseries->attachAxis(axisX);
1334 lineseries->attachAxis(axisY);
1336 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1338 lineseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1340 QPen pen = lineseries->pen();
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)));
1354 double x_min_val = timeseriesset->mintime();
1355 double x_max_val = timeseriesset->maxtime();
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++)
1375 QScatterSeries* scatterseries =
new QScatterSeries();
1376 chart->addSeries(scatterseries);
1377 scatterseries->attachAxis(axisX);
1378 scatterseries->attachAxis(axisY);
1380 for (
int j=0; j<timeseriesset->at(i).size(); j++)
1382 scatterseries->append(timeseriesset->at(i).getTime(j),timeseriesset->at(i).getValue(j));
1384 axisX->append(QString::fromStdString(timeseriesset->
Label(j)),j+0.5);
1387 QPen pen = scatterseries->pen();
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)));
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);
1411 QStackedBarSeries *series =
new QStackedBarSeries;
1412 for (
int i=0; i<timeseriesset->size(); i++)
1413 series->append(sets[i]);
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));
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);
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";
1435 chart->legend()->setVisible(
true);
1436 chart->legend()->setAlignment(Qt::AlignBottom);
1445 QRect rect = QDialog::frameGeometry();
1447 QString fileName = QFileDialog::getSaveFileName(
this,
1449 tr(
"png file (*.png)"));
1451 if (!fileName.contains(
"."))
1453 chart->setAnimationOptions(QChart::NoAnimation);
1454 this->resize(rect.width() * 2, rect.height() * 2);
1457 this->resize(rect.size());
1462 double centerX,
double centerY,
1463 double semiMajorAxis,
double semiMinorAxis,
1464 double rotationAngle,
double interval
1466 std::vector<QPointF> points;
1469 for (
double t = 0; t <= 2 * M_PI; t += interval) {
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);
1476 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