Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need fast c++ qt/qwt scatter plot

Tags:

c++

plot

qt

qwt

I have a huge array of 2D points (about 3 millions of pairs), which I need to render with reasonable speed in a Qt-based application.

I've tried using QGraphicsScene, but its very slow even on 400000 primitives, so I was looking into the qwt library instead.

It has a scatter plot example screenshot on its sourceforge page, which looks like exactly what I need, but I cannot find neither any kind of actual code that can be used for this data, nor an according API in qwt docs - it mentions only different types of curves.

So it would be good to get some pointers for scatter plot examples and some advice on its performance. Suggestions for other c++ qt-compatible plotting libraries which can cope with this amount of data are also welcome.

like image 900
Daniel Kluev Avatar asked Jul 07 '11 13:07

Daniel Kluev


4 Answers

Scatter plot is contained in the "realtime" example: what you want is the IncrementalPlot class. I'd also suggest that drawing all the 3 million points isn't reasonable, since modern screens have only about 2 million pixels :) Thus it seems better to simplify the plot beforehand by merging the adjacent points into one with a threshold dependent on the zoom factor.

like image 182
vines Avatar answered Nov 19 '22 05:11

vines


As viens pointed out, generating scatter plots with 3 million points is probably not a good idea.

I have achieved good performance generating 3D scatter plots with 30.000 points using OpenGL. OpenGL is fast and integrates well with Qt. However, it is a low level API that forces you to do a lot of tedious coding.

VTK may be another option.

like image 23
Johan Råde Avatar answered Nov 19 '22 03:11

Johan Råde


MathGL is free (GPL) cross-platform plotting library. It was written in C++ and have Qt widget. Also it is rather fast, but 3 millions points ... it take about 30 seconds to plot in my laptop.

like image 3
abalakin Avatar answered Nov 19 '22 04:11

abalakin


You'd suggest using OpenGL as @vines said, and in particular exploiting or display lists glGenList or vertex buffers. Some million points as primitives vertices shouldn't be that difficult.

like image 2
linello Avatar answered Nov 19 '22 04:11

linello