I want to understand how can I optimize the QCustomPlot to render many points showing on the plot at the same time.
For this particular example, I have plotted 600 000 points each on 2 seperate graphs (in total 1 200 000) points.
In my .h file, I have 2 vectors declared that hold information about all points:
QVector<double> qv_x,qv_y; QVector<double> qv_x_voltage,qv_y_voltage;
And in my .cpp, I have the following:
//Append list of qv_x and qv_y which contains all current meaurement points
void MainWindow::addPoint_current(double x, double y)
{
qv_x.append(x);
qv_y.append(y);
}
//Append list of qv_x_voltage and qv_y_voltage which contains all voltage measuremen points
void MainWindow::addPoint_voltage(double x, double y)
{
qv_x_voltage.append(x);
qv_y_voltage.append(y);
}
void MainWindow::setup_graph(QCustomPlot *customPlot)
{
current_upper_limit = 1;
current_lower_limit = 0;
voltage_upper_limit = 3;
voltage_lower_limit = 0;
QColor accentColor = QColor(Qt::red);
QColor themeColor = QColor(Qt::white);
QColor themeBackgroundColor = QColor(55, 57, 53);
foreach (QCPAxisRect *rect, customPlot->axisRects())
{
foreach (QCPAxis *axis, rect->axes())
{
axis->setLabelColor(themeColor);
axis->setBasePen(QPen(themeColor, 0));
axis->setTickPen(QPen(themeColor, 0));
axis->setSubTickPen(QPen(themeColor, 0));
axis->setTickLabelColor(themeColor);
axis->grid()->setPen(QPen(themeColor, 0.0, Qt::DotLine));
axis->grid()->setSubGridVisible(false);
axis->setSelectedTickLabelColor(accentColor);
axis->setSelectedLabelColor(accentColor);
axis->setSelectedBasePen(QPen(accentColor, 0));
axis->setSelectedSubTickPen(QPen(accentColor, 0));
axis->setSelectedTickPen(QPen(accentColor, 0));
}
}
customPlot->setBackground(QBrush(themeBackgroundColor));
// SETUP GRAPH 0 for Current
customPlot->addGraph();
customPlot->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle);
customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
QPen pen_current;
pen_current.setWidth(0);
pen_current.setColor(QColor(80, 200, 120));
customPlot->graph(0)->setPen(pen_current);
// SETUP GRAPH 1 for Voltage
customPlot->addGraph(customPlot->xAxis, customPlot->yAxis2);
customPlot->graph(1)->setScatterStyle(QCPScatterStyle::ssCross);
customPlot->graph(1)->setLineStyle(QCPGraph::lsLine);
QPen pen_voltage;
pen_voltage.setWidth(0);
pen_voltage.setColor(QColor(225,225,50));
customPlot->graph(1)->setPen(pen_voltage);
customPlot->xAxis->setLabel("Time(h:m:s)");
QSharedPointer<CustomTimeTicker> customTicker(new CustomTimeTicker);
customPlot->xAxis->setTicker(customTicker);
customPlot->yAxis->setLabel("Current (mA)");
customPlot->yAxis->setRange(current_lower_limit, current_upper_limit);
customPlot->yAxis2->setVisible(true);
customPlot->yAxis2->setLabel("Voltage (V)");
customPlot->yAxis2->setRange(voltage_lower_limit, voltage_upper_limit);
connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(xAxisChanged(QCPRange)));
customPlot->legend->setVisible(true);
customPlot->graph(0)->setName("Current");
customPlot->graph(1)->setName("Voltage");
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables | QCP::iMultiSelect);
customPlot->setSelectionRectMode(QCP::srmSelect);
customPlot->graph(0)->setSelectable(QCP::stDataRange);
customPlot->graph(1)->setSelectable(QCP::stDataRange);
customPlot->setNoAntialiasingOnDrag(true);
foreach (QCPAxisRect *rect, customPlot->axisRects())
{
rect->setRangeDrag(Qt::Horizontal);
rect->setRangeZoom(Qt::Horizontal);
}
for (double i = 0; i < 30000; i=i+0.05)
{
addPoint_voltage((i),1.0f);
addPoint_current((i),2.0f);
}
customPlot->graph(1)->addData(qv_x_voltage,qv_y_voltage);
customPlot->graph(0)->addData(qv_x,qv_y);
customPlot->replot();
}
As you can see from the setup code above, I have the drag enabled for the xAxis. The problem that I am having is very slow and laggy response when I am trying to drag the Plot left/right. As I move my mouse around, the plot is lagging for like 3-4 seconds. If I zoom in on the plot to ensure only 1000 or so points are visible, the dragging works without any issues. It only becomes problem as I zoom out so all the plotted points are visible at once, then the QCustomPlot cannot keep up with rendering so many points as the graph is being moved.
I would like to get some advice on how to reduce the lag and slow response of plot dragging when there are many points visible on the graph.