Ruby中的动画3d散点图与ruby gnuplot

时间:2013-07-06 23:38:42

标签: ruby gnuplot data-visualization

是否可以使用gnuplot gem在Ruby中创建动画三维散点图?

我已经查看了宝石源代码,一堆示例和gnuplot手册,但还没有设法弄清楚要做什么。

我在想我必须分叉并添加一些do-loop功能 - 但在我这样做之前,我想知道是否有一种很好的方法。

以下是我的代码的摘录,显示了我到目前为止所拥有的内容。

Gnuplot.open do |gp|
  Gnuplot::SPlot.new( gp ) do |plot|
    plot.title 'Orbital Simulation'

    N.times do | i |
      objects.each { | key, object | object.calc_tick(objects.except key) }
      objects.each { | key, object | object.apply_tick }

      x = []
      y = []
      z = []

      objects.each do | key, object |
        x << object.get_x
        y << object.get_y
        z << object.get_z
      end

      plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
        ds.with = "points"
        ds.notitle
      end
    end
  end
end

1 个答案:

答案 0 :(得分:0)

方法调用Gnuplot::Splot.new(gp) {...}将给定块中定义的命令(包括splot命令和内联数据)发送到IO对象gp。因此,请依次循环调用Gnuplot::Splot.new并在其后插入一些等待行为(休眠)。

例如,以下代码生成动画3d散点图(实际上仅包含一个点)。

require "gnuplot"

Gnuplot.open do |gp|

  1000.times do |k| ### loop
    Gnuplot::SPlot.new( gp ) do |plot|
      plot.title 'Orbital Simulation'
      plot.xrange "[-2:2]"
      plot.yrange "[-2:2]"
      plot.zrange "[-2:2]"
      x = [Math.sin(k*0.05)]
      y = [Math.cos(k*0.05)]
      z = [Math.sin(k*0.07)]
      plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
        ds.with = "points ps 2 pt 7"
        ds.notitle
      end
    end
    gp << "\n" ### this is needed to separate line after inline data
    gp.flush   ### flushing popen buffer
    sleep 0.1  ### waiting 
  end
end