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());
}
Результат: