Lua & gnuplot : gnuplot モジュール初版

2016-12-12 :  PCクリニック
Python、C言語、Perl、化学業界、硝子業界、グルコサミン、Firefox
先月下旬(2016-11-27)の記事「Lua 学習:gnuplot モジュール自作」その後、
学習の結果、“gnuplot”モジュールの初版を完成させた。


モジュール内で定義されている関数は、以下:

  gp.Open( )         ----- 画面表示用
  gp.Open( 'ファイル名' )  ----- ファイル出力用 ( '.plt' 無しなら付加 )

  gp.Pdf( 'PDFファイル名' ) ----- PDF出力用 ( '.pdf' 無しなら付加 )

  gp.Close()

  gp.Com( c )    ----- 任意の コマンド用:文字列 c をそのまま出力

  gp.Set( s )    ----- set コマンド用:'set' に続けて文字列 s を出力
  gp.UnSet( s )   ----- unset コマンド用

  gp.Table( fn )   ----- table コマンド用

  gp.Title( 'タイトル文字列' [ , <フォントサイズ> ] )

  gp.Xlog()     ----- X軸を対数スケールに
  gp.Ylog()

  gp.Xlabel( 'X軸ラベル' [ , <フォントサイズ> ] )
  gp.Ylabel( 'Y軸ラベル' [ , <フォントサイズ> ] )

  gp.Xrange( 'X軸範囲' )  ----- 例えば '[1:10]' の様な文字列
  gp.Yrange( 'Y軸範囲' )

  gp.KeyOff()       ----- 凡例 非表示

  gp.Plot( '<plot のパラメータそのまま>' )
  gp.RePlot( p )      ----- replot コマンド用

  gp.Data( b, n, x, y )  ----- Plot で、特殊ファイル '-' を使った場合用
    x, y は、倍精度実数の1次元配列で、
    n は、要素数。 b は、添字のオリジン( 0 か、1 )

  gp.DataBlk( BN, b, n, x, y, ... )  ----- データブロック用
    x, y, n, b は、上記 gp.Data と同じ。
    BN は、データブロック名(文字列)
    ... は、b==0 の場合のみ可。


それで、
定義実体は、以下:
local gp = {}

local SF = string.format
local SS = string.sub
local function split_path( p ) return string.match( p, "(.-)([^\\]-([^%.]+))$" ) end

function gp.Open( fn )
if fn == nil then
GP = io.popen( 'gnuplot -persistent', 'w' ) ----- ファイル名無し:画面出力
else
local Dir, FN, ext = split_path( fn )
if ext ~= 'plt' then FN = FN..'.plt' end ----- .plt 無し なら付加する
GP = io.open( FN, 'w' )
end
GP:write( 'set term wxt size 800, 600\n' ) ----- 窓サイズ
GP:write( 'set term wxt font "sans,12"\n' ) ----- フォント
GP:write( 'set size 1.0, 0.98\n' ) ----- グラフサイズ
end

function gp.Pdf( fn )
local Dir, FN, ext = split_path( fn )
if ext ~= 'pdf' then FN = FN..'.pdf' end ----- .pdf 無し なら付加する
GP:write( 'set term pdf size 8, 6\n' ) ----- ページサイズ
GP:write( 'set term pdf font "sans,12"\n' ) ----- フォント
GP:write( SF('set output "%s"\n', FN ) ) ----- PDFファイル名
end

function gp.Close() ----- ファイルclose
GP:close()
end

function gp.Com( c ) ----- 任意の コマンド用
GP:write( SF('%s\n', c ) ) ----- コマンド&パラメータ
end

function gp.Set( s ) ----- set コマンド用
GP:write( SF('set %s\n', s ) ) ----- パラメータ
end

function gp.UnSet( s ) ----- unset コマンド用
GP:write( SF('unset %s\n', s ) ) ----- パラメータ
end

function gp.Table( fn )
if fn == nil then
GP:write( SF('set table\n', fn ) ) ----- table コマンド用
elseif SS(fn,1,1) == '$' then
GP:write( SF('set table %s\n', fn ) )
else
GP:write( SF('set table "%s"\n', fn ) )
end
end

function gp.Title( t, s )
if s == nil then s = 36 end
GP:write( SF('set title "%s"\n', t ) ) ----- タイトル
GP:write( SF('set title font "serif,%d"\n', s ) ) ----- フォント
end

function gp.Xlog()
GP:write( 'set logscale x\n' ) ----- 対数目盛
end

function gp.Xlabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set xlabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set xlabel font "serif,%d"\n', s ) ) ----- フォント
end

function gp.Xrange( s )
GP:write( SF('set xrange %s\n', s ) ) ----- 範囲
end

function gp.Ylog()
GP:write( 'set logscale y\n' ) ----- 対数目盛
end

function gp.Ylabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set ylabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set ylabel font "serif,%d"\n', s ) ) ----- フォント
end

function gp.Yrange( s )
GP:write( SF('set yrange %s\n', s ) ) ----- 範囲
end

function gp.KeyOff()
GP:write( 'set key off\n' ) ----- 凡例無し
end

function gp.Plot( p ) ----- 引数そのママ
GP:write( SF('plot %s\n', p ) ) ----- Plot コマンド
end

function gp.RePlot( p )
GP:write( SF('replot %s\n', p ) ) ----- replot
end

function gp.Data( b, n, x, y ) ----- b:origin
local px, py = x, y
if b==0 then ----- 1 or 0
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
end
for k=b,n-(1-b) do
GP:write( SF('%.3f %.3f\n', px[k], py[k] ) )
end
GP:write( 'e\n' )
end

function gp.DataBlk( BN, b, n, x, y, ... ) ----- BN:Block名
local t, pt = {...}, {} ----- 3列以上は、b==0 の場合のみ可
local px, py = x, y ----- b==1 では無視
if b==0 then
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
for i,p in ipairs(t) do pt[i]=ffi.cast('double*', t[i] ) end
end
GP:write( SF('%s << EOD\n', BN ) )
for k=b,n-(1-b) do
GP:write( SF('%.3f %.3f', px[k], py[k] ) )
for i,_ in ipairs(pt) do GP:write( SF(' %.3f', pt[i][k] ) ) end
GP:write( '\n' )
end
GP:write( 'EOD\n' )
end

return gp
で、一応動くようダ。


先月末(2016-11-30)の記事「gnuplot で Fitting」では、
  ・・・・・
  ・・・・・
  “test.plt”を作って実行。
  ・・・・・
  ・・・・・
だった。


これに対して、今回のモジュールを使ったら、・・・・・
local gp = require'gnuplot'

gp.Open()
gp.Set( 'fit quiet' )
x = matrix.vec{ 5, 7, 8, 9, 10, 13, 15, 17, 18 }
y = matrix.vec{ 0.67, 0.84, 1.29, 1.25, 0.69, 0.35, 0.18, 0.09, 0.02 }
gp.DataBlk( '$D', 1, 9, x, y )
gp.Com( 'f(x)=a*x**3+b*x**2+c*x+d' ) ----- フィッティング関数
gp.Com( 'fit f(x) $D via a,b,c,d' ) ----- フィッティング実行
gp.Close()

IN=io.open('fit.log')
for w in IN:lines() do if string.sub(w,1,1) == '=' then break end end
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'a='..a )
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'b='..b )
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'c='..c )
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'd='..d )
IN:close()
os.remove( 'fit.log' )

_=io.read(1)
こんな感じ?


本日はここまで。


GSL Shell & gnuplot 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


161105,08
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク