void CurrencyPane::UpdateGraph(const QMap<double, double> map) { QCustomPlot* customPlot = ui->plotWidget; if (map.size() < 2) { customPlot->hide(); return; } if (customPlot->isHidden()) { customPlot->show(); } //customPlot->setBackground(Qt::transparent); double lastDate = map.lastKey(); double weekAgo = QDateTime(QDate::currentDate()).addDays(-7).toTime_t(); double highestVal = 0; if (!map.isEmpty()) { highestVal = from(map.values().toVector().toStdVector()).max(); } if (customPlot->graphCount() > 0) { customPlot->removeGraph(0); } customPlot->addGraph(); customPlot->graph()->setName("Net Worth"); QPen pen; pen.setColor(QColor(0, 0, 255, 200)); customPlot->graph()->setLineStyle(QCPGraph::lsLine); customPlot->graph()->setPen(pen); customPlot->graph()->setBrush(QBrush(QColor(255/4.0,160,50,150))); customPlot->graph()->setData(map.keys().toVector(), map.values().toVector()); // configure bottom axis to show date and time instead of number: customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime); customPlot->xAxis->setDateTimeFormat("ddd"); // set a more compact font size for bottom and left axis tick labels: customPlot->xAxis->setTickLabelFont(QFont(QFont().family(), 8)); customPlot->yAxis->setTickLabelFont(QFont(QFont().family(), 8)); // set axis labels: customPlot->xAxis->setLabel("Date"); customPlot->yAxis->setLabel("Total Worth in Chaos"); // make top and right axes visible but without ticks and labels: customPlot->xAxis2->setVisible(true); customPlot->yAxis2->setVisible(true); customPlot->xAxis2->setTicks(false); customPlot->yAxis2->setTicks(false); customPlot->xAxis2->setTickLabels(false); customPlot->yAxis2->setTickLabels(false); // set axis ranges to show all data: customPlot->xAxis->setRange(weekAgo, lastDate); customPlot->yAxis->setRange(0, highestVal); // show legend: customPlot->legend->setVisible(true); }
void PluginGauss::loadRefDatas()//const ProjectSettings& settings) { mRefDatas.clear(); QString calibPath = getRefsPath(); QDir calibDir(calibPath); QFileInfoList files = calibDir.entryInfoList(QStringList(), QDir::Files); for(int i=0; i<files.size(); ++i) { if(files[i].suffix().toLower() == "csv") { QFile file(files[i].absoluteFilePath()); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMap<QString, QMap<double, double> > curves; QMap<double, double> curveG; QMap<double, double> curveG95Sup; QMap<double, double> curveG95Inf; QTextStream stream(&file); while(!stream.atEnd()) { QString line = stream.readLine(); if(!isComment(line)) { QStringList values = line.split(","); if(values.size() >= 3) { double t = values[0].toDouble(); double g = values[1].toDouble(); double gSup = g + 1.96 * values[2].toDouble(); double gInf = g - 1.96 * values[2].toDouble(); curveG[t] = g; curveG95Sup[t] = gSup; curveG95Inf[t] = gInf; } } } file.close(); // The curves do not have 1-year precision! // We have to interpolate in the blanks double tmin = curveG.firstKey(); double tmax = curveG.lastKey(); for(double t=tmin; t<tmax; ++t)//t+=settings.mStep)//++t) { if(curveG.find(t) == curveG.end()) { // This actually return the iterator with the nearest greater key !!! QMap<double, double>::const_iterator iter = curveG.lowerBound(t); if(iter != curveG.end()) { double t_upper = iter.key(); --iter; if(iter != curveG.begin()) { double t_under = iter.key(); //qDebug() << t_under << " < " << t << " < " << t_upper; double g_under = curveG[t_under]; double g_upper = curveG[t_upper]; double gsup_under = curveG95Sup[t_under]; double gsup_upper = curveG95Sup[t_upper]; double ginf_under = curveG95Inf[t_under]; double ginf_upper = curveG95Inf[t_upper]; curveG[t] = interpolate(t, t_under, t_upper, g_under, g_upper); curveG95Sup[t] = interpolate(t, t_under, t_upper, gsup_under, gsup_upper); curveG95Inf[t] = interpolate(t, t_under, t_upper, ginf_under, ginf_upper); } else { curveG[t] = 0; curveG95Sup[t] = 0; curveG95Inf[t] = 0; } } else { curveG[t] = 0; curveG95Sup[t] = 0; curveG95Inf[t] = 0; } } } // Store the resulting curves : curves["G"] = curveG; curves["G95Sup"] = curveG95Sup; curves["G95Inf"] = curveG95Inf; mRefDatas[files[i].fileName().toLower()] = curves; } } } }