c++ - 使用 gnuplot 动态绘制 volatile 数据文件

标签 c++ dynamic plot gnuplot

我已经看到一些类似的问题,我从中创建了一个适合我的系统,但我需要优化它,因为这个程序本身就占用了大量的 CPU 负载。

问题就在这里。

我有一个输入信号/数据流,需要实时绘制。我只想一次显示有限数量的点(比如 1024 个点),因此我根据 x 轴上 0-1024 的索引绘制沿 y 轴的数据点。传入数据的值范围为 0-1023。

我目前所做的(这一切都在 C++ 中)是我将数据放入一个循环中,每次数据更新时(或每第二个/第三个数据点),我写到一个文件中,然后使用管道,我使用 gnuplot 绘制该文件中的数据。

虽然这几乎完美地工作,但它会造成相当大的负载(根据输入数据速率,我发现我的 Core 2 Duo 的两个内核的使用率甚至达到 70%)。我将需要运行一些处理器密集型代码以及这个简短的程序,所以我觉得几乎有必要对其进行优化。

我希望可以做的是:我可以只绘制当前图和新数据之间的差异吗(或者绘制每个点,而不重新绘制整个图,使得 x 索引处的旧项目已移除)。

我在图表上有固定数量的点,因此重绘不起作用。我想删除那个 x 位置的旧点。

最佳答案

不幸的是,您想要完成的事情无法完成。您可以将数据文件标记为 volatile 或使用 refresh 关键字,但这些只会更新绘图而不会重新读取数据。您想要重新读取数据,然后只更新差异。

不过,有些事情可能会有所帮助。 1) 你的眼睛每秒只能记录 ~26 帧。因此,如果您有办法确保每秒仅向 gnuplot 发送 26x 数据,那可能会有所帮助。 2)你是如何写数据文件的?您是转储为 ascii 还是二进制?进行二进制转储可能会更快(对于写入和 gnuplot 读取)。您必须进行试验。

有一种 hack 可能不会使您的脚本运行得更快,但您可以尝试一下(如果您知道要设置的合理范围,并且正在使用点来绘制数据)...

#set up code:
set style line 1 lc rgb "blue"
set xrange [0:1023]
set yrange [0:1]
plot NaN notitle #Only need to do this once.
for [i=0:1023] set label i+1 at i,0 point ls 1  #Labels must have tags > 0 :-(

#this part gets repeated by your C code.
#you could move a few points at a time to make it more responsive.
set label 401 at 400,0.8              #move point number 400 to a different y value
refresh                               #show it at it's new location.

关于c++ - 使用 gnuplot 动态绘制 volatile 数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11438779/

相关文章:

python - matplotlib plot_surface 带有非线性颜色图的 3D 图

c++ - 有没有办法根据模板参数的类型在不同的类实现之间进行选择?

c++ - 从构造函数初始化结构

c++ - QPixmap over QUdpSocket - 无法读取正确的数据

jquery - 使用 jQuery 加载内容的积极因素是否超过 seo 消极因素?

matlab - 在 Matlab 中绘制动画时,如何防止轴动态变化?

c++ - 传递函数参数的求值顺序 - F1( int F2( int& x ), int x ) 的操作顺序

ios - 如何使用 Swift 在 Apptimize 中添加动态变量?

带有命名空间的 Javascript 动态函数调用

plot - 如何在 Octave 中更改工具包?