QCustomPlot добавляет точки разброса поверх существующего графика

После создания сюжета с помощью qcustomplotКак я могу, основываясь на существующих значениях X, извлечь значения Y, а затем построить точки в этих местах?

Моя попытка ниже:

Создать сюжет:

Эта функция создает график, добавляет некоторые данные (даты) по оси X и некоторые значения по оси Y:

void Qt_PlotTest::createPlot(){    
   QCustomPlot* customPlot = ui.widget;
   customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom));

   //Set some data:
   double now = QDateTime::currentDateTime().toTime_t();
   QVector<double> yData, xData;
   for (int i = 0; i < 100; i++){
      xData.push_back(now + i*24.0 * 3600.0);
      yData.push_back(pow(double(i), 2) + 550.0*sin(double(i)/4.0));
   }

   // create graph and assign data to it:
   customPlot->addGraph();
   customPlot->graph(0)->setData(xData, yData);

   //Fix axes:
   //Set date axis:
   QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
   dateTicker->setDateTimeFormat("d. MMMM\nyyyy");
   customPlot->xAxis->setTicker(dateTicker);   
   customPlot->xAxis->setLabel("Time");
   customPlot->yAxis->setLabel("Value");   
   customPlot->rescaleAxes();
   customPlot->replot();

   //Set interations:
   customPlot->setInteraction(QCP::iRangeDrag, true);
   customPlot->setInteraction(QCP::iRangeZoom, true);           
}

Что приводит к:

График случайных данных против дат

Установить точки разброса:

Эта функция должна построить несколько точек рассеяния в правильных положениях x/y на основе значений x. (Мне нужно прочитать соответствующее значение Y из существующего графика).

void Qt_PlotTest::setScatterPoints(){

   QCustomPlot* customPlot = ui.widget;

   //The locations where scatter points should be plotted:
   QDate qd1(2018, 03, 26), qd2(2018, 03, 30), qd3(2018, 05, 11), qd4(2018, 06, 15);
   QVector<double> dates = { (double)QDateTime(qd1).toTime_t(), (double)QDateTime(qd2).toTime_t(), (double)QDateTime(qd3).toTime_t(), (double)QDateTime(qd4).toTime_t() };

   //Use tracer to find data at these dates:
   QVector<double> values;
   QCPItemTracer *tracer = new QCPItemTracer(customPlot);
   tracer->setGraph(customPlot->graph(0));
   tracer->setInterpolating(true);
   for (int i = 0; i < 4; i++){
      tracer->setGraphKey(dates[i]);
      values.push_back(tracer->position->coords().y());
   }

   //Plot points at these locations:
   QCPGraph* dwPoints = new QCPGraph(customPlot->xAxis, customPlot->yAxis);
   dwPoints->setAdaptiveSampling(false);
   dwPoints->setLineStyle(QCPGraph::lsNone);
   dwPoints->setScatterStyle(QCPScatterStyle::ssCircle);
   dwPoints->setPen(QPen(QBrush(Qt::red), 2));

   dwPoints->addData(dates, values);
   customPlot->replot();        
}

Что приводит к: Разброс точек на участке

Так очевидно, что QCPItemTracer не нашел правильные значения Y. (У меня также есть несколько дополнительных осей, которые я не хочу.)

Является QCPItemTracer что я хочу использовать для достижения того, чего я хочу? Я также видел пример использования QCPDataMap чтобы найти Y-значения на основе X-значений. Но насколько я понимаю, QCPDataMapбольше не находится в qcustomplot,

1 ответ

Решение

Я решил свою проблему:

Мне пришлось позвонить tracer->updatePosition() на самом деле получить координаты в системе координат, в которой находится трассировщик.

Оси, которые я не хотел, были фактически визуализацией трассера в конечном местоположении трассера. Я просто должен был позвонить tracer->setVisibile(false) чтобы скрыть это.

Так в пустоте Qt_PlotTest::setScatterPoints У меня есть это:

QCPItemTracer *tracer = new QCPItemTracer(customPlot);   
   tracer->setGraph(customPlot->graph(0));
   tracer->setInterpolating(true);
   tracer->setVisible(false);    
   for (int i = 0; i < 4; i++){
      tracer->setGraphKey(dates[i]);
      tracer->updatePosition();
      values.push_back(tracer->position->coords().y());
   }

Результат:

Другие вопросы по тегам