読者です 読者をやめる 読者になる 読者になる

maxima でデータを読み込んでプロットする

参考 Maxima 5.38.1 Manual: 73. numericalio

書き出したデータを(リストとして)読み込むには read_nested_list を使う。ファイル hoge.data の内容は

1 2
3 4
5 6
7 8
...

のようなものとする。read_nested_list("hoge.data") の返すリストは

[[1,2],[3,4],[5,6],[7,8],...]

のようになる。

カンマ区切りのデータなら

read_nested_list("hoge.data", ",")

とデリミッタを与えてやればいい。

read_list という関数もあるが、これはリストを flatten したものが返る。

[1,2,3,4,5,6,7,8,...]

プロットは

plot2d([discrete, read_nested_list("hoge.data")]);

とする。

以下は無用でした。discrete の場合でも [x,xmin,xmax], [y,ymin,ymax] で OK.ずっと勘違いしていました。

ついでの tips として x,y の範囲を指定したい場合にオプションとして [gnuplot_preamble, "set xrange [xmin:xmax]; set yrange [ymin:ymax]"] のように一々書くのも面倒なので

xrange(min,max):=[gnuplot_preamble, printf(false, "set xrange [~a:~a]", min, max)];
yrange(min,max):=[gnuplot_preamble, printf(false, "set yrange [~a:~a]", min, max)];

こんな関数を用意しておけば

plot2d([discrete, read_nested_list("hoge.data")], xrange(0,1));

のように使いやすくなる。

gnuplot を直接使うよりは maxima から使ったほうが便利ではないかと思う。プロットオプションもそれなりに用意されている(Maxima 5.38.1 Manual: 12. Plotting)。maxima にプロットオプションがない場合は上のように [gnuplot_preamble, "..."] として gnuplot のコマンドを直接文字列で渡してやることになる。

追記
xrange,yrange は同時には効かないようなので

xyrange(x,y):=[gnuplot_preamble, printf(false,"set xrange [~f:~f]; set yrange [~f:~f]",first(x),second(x),first(y),second(y))];

として

plot2d([discrete, read_nested_list("hoge.data")], xyrange([1,2],[3,4]);

とする