将ruby Gnuplot写入文件

时间:2017-04-27 09:45:44

标签: ruby gnuplot

我将Gnuplot保存到文件时遇到问题。这是我的代码:

def plot(a, b, name)

  o = Gnuplot.open do |gp|
    Gnuplot::Plot.new( gp ) do |plot|
      plot.title "Wykres funkcji"
      plot.autoscale
      #plot.output name+".svg"
      plot.term "jpeg"
      plot.ylabel "x"
      plot.xlabel "y"
      plot.grid
      x = (a..b) .collect { |v|v.to_f }
      y = x.collect { |v| value(v)}
      plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
        ds.with = "lines"
      end
    end
    File.open("test.jpeg", "w"){|to_file| Marshal.dump(o, to_file)}
  end
end

我不想使用Gnuplot的输出,但我想通过File执行此操作。我的代码创建了一个空的文件,或者给我一个错误,如:

 Error interpreting JPEG image file (Not a JPEG file: starts with 0x04 0x08)

我可以通过将文件作为函数的参数来实现吗?

1 个答案:

答案 0 :(得分:0)

项目中有一个example如何将图像输出到文件中(如README中所述):

$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
require "gnuplot"

# See sin_wave.rb first
Gnuplot.open do |gp|
  Gnuplot::Plot.new( gp ) do |plot|

    # The following lines allow outputting the graph to an image file. 
    # The first set the kind of image that you want, while the second
    # redirects the output to a given file. 
    #
    # Typical terminals: gif, png, postscript, latex, texdraw
    #
    # See http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/gnuplot_primer/gptermcmp.html
    # for a list of recognized terminals.
    #
    plot.terminal "gif"
    plot.output File.expand_path("../sin_wave.gif", __FILE__)

    # see sin_wave.rb
    plot.xrange "[-10:10]"
    plot.title  "Sin Wave Example"
    plot.ylabel "sin(x)"
    plot.xlabel "x"

    plot.data << Gnuplot::DataSet.new( "sin(x)" ) do |ds|
      ds.with = "lines"
      ds.linewidth = 4
    end

  end
end
puts 'created sin_wave.gif'

乍一看,原来的问题看起来只是设置plot.term而不是plot.terminal造成的?

此外,我不明白为什么你需要使用Marshal.dumpFile.open - 你可以使用plot.output写一个给定的文件名,如示例所示以上。在这里使用Marshal.dump甚至无法工作,因为您正在转储整个Gnuplot对象 - 这不仅仅是一个JPEG文件。

如果确实想要实现你的方法来获取File对象,而不只是使用文件名(字符串),那么你可以考虑告诉Gnuplot写到Tempfile,然后将Tempfile复制到您自己的File对象中?