是否可以使用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
答案 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