我将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)
我可以通过将文件作为函数的参数来实现吗?
答案 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.dump
和File.open
- 你可以使用plot.output
写一个给定的文件名,如示例所示以上。在这里使用Marshal.dump
甚至无法工作,因为您正在转储整个Gnuplot
对象 - 这不仅仅是一个JPEG文件。
如果确实想要实现你的方法来获取File
对象,而不只是使用文件名(字符串),那么你可以考虑告诉Gnuplot
写到Tempfile
,然后将Tempfile
复制到您自己的File
对象中?