関連記事 … psqlから起動したScilab、RTMPフォルダにゴミを残す場合
Contents


6回へのリンク

No.DateSoftwarePlatform
12016.8.3gnuplot 5.0.3Cygwin
22016.8.6gnuplot 5.0.4Windows
32016.8.7Gnu Octave 4.0.3 〃
42016.8.10R 3.3.0 〃
52016.8.11pyxplot 0.9.2Cygwin
62016.8.13Scilab 5.5.2Windows

1回はCygwingnuplotdumbターミナルのみ使用し、コンソールに疑似的なグラフ(いわゆるASCII Plot)を出しました。同じことは第2回のWindows版でもやったので、以下ではCygwin版は取り上げません。


実行環境

• Windows7 x64 + Cygwin 2.5.1 + ConEmu 150813g
• Cygwinpsql(パッケージpostgresql-client 9.5.3でインストール)
• Windowsの管理者権限ユーザ

psqlを使うには何らかDBサーバに接続する必要があるため、とりあえずWindowsPostgreSQL 9.5.3を使いました。


導入のしやすさ(今回経験した範囲で)

SoftwarePlatformしやすさコメント
gnuplotWindows☆☆☆インストーラかポータブル版を使うだけ
OctaveWindows職場のPCでグラフ出ず
RWindows☆☆☆インストーラかポータブル版を使うだけ
pyxplotCygwin×LaTeX環境を整えて自分でビルド
ScilabWindows職場のPCで起動せず

OctaveScilabの回で書いたとおり職場のPCは標準ユーザ権限、自分が管理してないし仕方ない面があります。でもPostgreSQL、Cygwin、gnuplot、Rは普通に使えているので、それに比べると実行環境を選ぶのは事実。


psqlで、グラフ出力前に実行するコマンド

各ソフトウェアの実行を簡単にするための環境変数と、クエリ結果を「半角空白区切り、データのみ」にするもの。前者のうちpyxplotCygwin上でビルド&インストールしたのでパスが通っており、特に設定しません。あとRでロケール関係の警告が出ないよう、シェルのLC_CTYPECに変更。
-- set path or environmental variables
# \setenv gnuplot 'd:/works/gnuplot/current/bin/gnuplot -e'
# \setenv octave 'd:/works/octave/current/bin/octave-cli -q --eval' 
# \setenv r 'd:/works/r/current/bin/x64/rscript -e'
# \setenv SCIHOME 'd:/works/scilab/current'
# \setenv scilab `echo $SCIHOME`'/bin/Scilex -nb -e'

-- set output format
# \f ' ' \\ \t on \\ \pset format unaligned

-- suppress warning about locale on win R
# \setenv LC_CTYPE 'C'


これで、カレントの位置に関わらず各ソフトウェアを起動できます。Scilabのみプログラムフォルダの位置を環境変数SCIHOMEに入れる必要あり。-e(Octaveのみ--eval)はコマンドを渡すオプション。


psqlから起動&コマンド実行して戻るテスト

gnuplot、octave、Rは単純にコマンドを書くだけ。pyxplot-eオプションがなく、パイプでコマンドを渡します。Scilabは対話シェルに留まるのがデフォルトなので、exitを入れて明示的に対話シェルに復帰。
# \! $gnuplot 'print(1)'
# \! $octave 'disp(1)'
# \! $r 'print(1)'
# \! echo 'print(1)' | pyxplot 
# \! $scilab 'disp(1); exit'


場面1… コンソール内に簡単なグラフを出す

gnuplotset term dumbすれば可能。他のソフトウェアについては調べてません。下はすぐpsqlに戻る例。
# values (2),(1),(6),(8),(14)
  \g | $gnuplot 'set nokey; set term dumb; plot "-" w boxes' 


↓ グラフを出して対話シェルに留まるなら、コマンド最後にハイフンを付けます。グラフを再度出しそうな場合に便利。データをパイプで渡すと1回しか呼び出せないので(標準入力だから)一時ファイルを経由します。
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $gnuplot 'set nokey; set term dumb; plot "gtmp" w lines' - 
gnuplot>


場面2… 別窓にグラフを出し、閉じたらpsqlに戻る

gnuplot、Octave、Scilabで可能。Rは無理が多いためここでは省きます。


gnuplot(コマンドに-pオプションを付ける)
# values (2),(1),(6),(8),(14)
  \g | $gnuplot 'plot "-" w lines' -p 


Octave(パイプは使えず一時ファイル経由)
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $octave 'd=load("gtmp"); plot(d); waitfor(gcf); exit' 


Scilab(Octaveとほぼ同じ。動作中はコンソールの色が変わる。グラフ内をクリックしても閉じる)
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $scilab 'd=fscanfMat("gtmp"); plot(d); xclick; exit' 


場面3… 別窓にグラフを出し、対話シェルに留まって何かする

これもgnuplot、Octave、Scilabで可能。パイプから起動すると常に非対話モードなので、すべて一時ファイルを経由します。R-eオプションでコマンドを渡すと対話モードにならず使えません。動作時の様子はほぼ前項と同じ(コンソールの最後で対話シェルに入るのが違うだけ)なので省略。

gnuplot(コマンド未尾にハイフンを付ける)
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $gnuplot 'plot "gtmp" w lines' - 
gnuplot> ...
gnuplot> ...


Octave(コマンドに--persistを付ける)
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $octave 'd=load("gtmp"); plot(d)' --persist 


Scilab(コマンド追加は不要。フォーカスも対話シェルに移る)
# values (2),(1),(6),(8),(14)
  \g gtmp \\\! $scilab 'd=fscanfMat("gtmp"); plot(d)' 


場面4… R、pyxplotが役立つのは

これまでの場面1gnuplotだけ、2・3gnuplot、Octave、Scilabだけで、影が薄いRpyxplotですが、次のような場面では中心になると思います。

R… クラスやパッケージで定型化されたグラフを出す時。例えばデータをRに渡し回帰分析をlm関数で行えば、そのオブジェクトをplotするだけで回帰診断の整ったグラフが4つまとめて出力される。

pyxplot… 色を印刷用のCMYKで指定したい時。また数値ラベルを含め「グラフ中の文字」全体をLaTeXで統一したい時。あと、周囲の誰も知らないpyxplotを使って「何それすごい」と言われたい時(爆


補足1… データをパイプで渡せるのは「1回だけ使う」場合

gnuplotRはデータをパイプで渡せて便利ですが、コマンド内でそれを1回受け取ると標準入力は空になり、次から使えません。例えばRで試すと ↓ こんな感じ。
$ echo 1 | d:/works/r/current/bin/x64/rscript -e 'read.table("stdin"); read.table("stdin")' 
  V1
1  1
Error in read.table("stdin") : no lines available in input
Execution halted


Rなら標準入力を読み込んだ時に変数に入れれば済みますが、gnuplotはそもそも変数に「値の集合」を入れられない。だから複数回使うにはファイルに保存し直すことになり、だったら最初から一時ファイル経由にした方が簡単。

gnuplotは何列もあるデータからグラフに使う列を短く指定でき(u 1:2とか)、データを一度に渡して複数のグラフを作るのが簡単だけど、うっかりパイプで渡すとかえって面倒になります。


補足2… Octaveでの数値ラベルの問題はロケールが原因

Octaveの回を書いてた時は ↓ こんな風にグラフの数値ラベルが変でした(文字化けというよりグシャッとなってる。画像を拡大すれば見えます)。


ところが今日は ↓ 正常に数値が表示されました。


あれ~Octaveの設定は変えてないのに?と不思議でしたが、
準備の時にR用にLC_CTYPEを変更したのを思い出し、LC_CTYPEja_JP.UTF8に戻してOctaveを使ったら確かに問題が再現。つまりWindowsでは、RだけでなくOctaveでもLC_CTYPECに変更することが必要でした。(Octaveも警告を出してくれればいいのに)


補足3… 各ソフトウェアの起動までの軽い・重い(体感)

これはgnuplotが群を抜いて速いです。数値計算ソフトでもプログラミング環境でもないから当然。コマンド実行から間髪入れずグラフウィンドウが開く感じ。次に速いのがR、残りのOctave、Pyxplot、Scilabは最初のコマンド実行で数秒待ち、Scilab2回目以降
もそんな状況。PyxplotCygwin上なので仕方ないかもしれません。


最後に

今回はコンソールで全ての入力を完結させ、スクリプトファイルは使いませんでした。グラフをいろいろ調整していくとコマンドが増えるので、スクリプトにする場面も多いと思います。その際のpsqlとの連携はまたいずれ。

出力形式について、今回はグラフを別窓に出すのを中心にしました。ファイル出力して見る場合、ビュワー起動やフォーカス、読み込み(更新)がどうしても面倒。とくにノートPCのように狭い画面だと…。文書等に貼り込む素材を作る場合は別として、普段は別窓に出す方が自分はいいです。今回整理したのを機に、PostgreSQLpsql→ グラフというフローをもっと活用していこうと思います。