gnuplot を使おう。 その3
set xlabelとかで、ラベルの途中に改行を入れた時の 行間というか改行幅って調節できるんですかね? 2行目以降をset labelで細かく位置を調節すれば 色々自由にできるとは思いますが、 ちょっと行間を詰めたいだけなので、 簡単に設定できると嬉しいと思いまして。 とあるスクリプトからパイプでgnuplotにコマンド送ってイメージファイル作らせたりしてるんだけど、Ctrl+Cで中断させようとすると、スクリプトは終わるのにgnuplotは終わらずにエラーメッセージ吐いたりする。 gnuplotがSIGINT受けても止まらないせいだと思うんだけど、何かの設定で止まるようになんないかな。 ソース眺めてみたけどよーわからん。 OSはLIinux。 って誰もみてないか。 おお、ありがたや。 perlの例だけど、openでgnuplotにパイプをつないで、 コマンドとインラインデータを流し込む。 例えばこんな風。 ↓ for my $k (1 .. 200){ my $file = sprintf 'file%03d', $k; my @xdata = (1 .. 300); my @ydata; push @ydata,rand 1 for(0 .. 300); open my $fh, '|-', 'gnuplot'; print $fh <<EOD; set term postscript eps set output "$file.eps" plot "-" w l EOD for my $i (0 .. $#xdata){ print $fh "$xdata[$i]\t$ydata[$i]\n"; } print $fh "e\n"; } プロットするデータはここでは乱数で作ってるけど 実際は実験データとかを取り込んだもの。 あら、インデントは消えちゃうのね。 ひと組300行のデータからイメージファイルを作って、 それをループで回して200回も繰り返すからそれなりに時間がかかって、 途中でCtrl+Cで止めようとするとperlは止まるんだけど、 gnuplotは止まらず混乱?してplotのインラインデータ部分を コマンドとして解釈してエラーメッセージを出したり、 タイミングによってはepsファイルに行くべき文字列が stdoutに出てきたりする。 再現しないよ 783を例えばhogeというファイル名で保存して $ ./hoge 途中,Ctrl+Cするとgnuplotも止まる ゴメンゴメンperlが止まってエラーが出てないだけだった 外側のfor消して300の乱数データを時間が掛かるように適宜大きくしたら 以下のようなエラーが出た ... gnuplot> 168373 ^ line 160265: invalid command gnuplot> 168374 ^ line 160265: invalid command ... Androidに移植されたgnuplotいくつかあるみたいだけど、使ってる方でおすすめのあります? 以前は、Droidplot + android terminal emulator つてのを使ってたけど、ずっと更新されずAndroid9ではgoogle playに出てこなくなっちゃった 神ツールgnuplotが末長く神ツールでありつづけますように 制御構造入れたプロットをしたいなら スクリプトからgnuplotに食わせるより、雛形だけepsに吐かせてpsコードで書いた方がずっと楽よ 行列演算も組み込みだし数値扱うなら多分perlより使える言語 データ読み込みから画像生成までpostscriptに任せられるのはtsv/csvまでだな readline、substringで分割、cvr(conv to real)、dict/arrayに突っ込むだけ 10/16進数値以外は読めないので汚いデータはpsのregex(要外部ライブラリ)とか使うより前処理した方が楽かと あとgnuplotのようにlatex記法をサポートしてないので、gnuplotの吐くepsから拾うか、 ./makeplot.ps dat1 dat2 ...のように動的に数式を生成するコマンドにしたいなら、psからgnuplot -eやtexコマンドを外部呼び出しして出力を読み込むか あれ、意外とめんどくさそう… 逆にgnuplotをpsライブラリだと捉えよう、手動でスタイル合わせるより馴染むし gsなら%pipe%cmdがファイルハンドル返したり%stdin, %stdout使えて楽 gnuplotでもpython matplotlibでも最近はsvgはかせる。 svgならブラウザでviewできるし。仕上げはinkscape。 1/3ごろ gnuplot 5.4.3 がでてます。 数時間Windowsバイナリもアップされています。 パラメータ変えてplotコマンド打っても描画が新しくならないんだけど、なんでだろ? >>796 debian sidでgnuplot-x11の方です gnome41でwaylandな環境なんてすが 同じlinuxなでもxfce4にxorgのマシンだと問題ないんです waylandのせいかと思うんですが。 まぁ使えないわけじゃないけど、微妙に使い勝手悪いです。。 >>797 wxtターミナルではどうですか? x11やqtターミナルはドライバープログラム(gnuplot-x11やgnuplot-qt) が描画するけど wxtはgnuplot本体が描画するから、違いがあるかも。 後, Xと通信しない非対話型ターミナルではどうなんでしょう。 例えば set terminal png set output 'test1.png' a=1 plot a*x set output set output 'test2.png' a=2 plot a*x set output はちゃんと動作しますか? >>798 ありがとうございます。 起動するとデフォルトがwxtで、そちらだとたとえば gnuplot > plot sin(x) でサイン関数が描画され、次に gnuplot > plot cos(x) と続けて打ってもサイン関数のプロットのままで ウィンドウがアップデートされません。 ウインドウをグラブして拡大したりするとアップデートされます。 terminalに関しては試してなかったので、 termをx11にしたところ、上の例だとcos(x)を新たにプロットするとちゃんとウインドウも再描画されました。あとpngとかpostscriptでも問題ないので どうやらwxtの問題みたいです。 debianとかgnome4x系になってまだ間もないのでなにかのバグの可能性もあると思いましたが、他に報告が無いみたいなので自分の環境のせいかもしれないです。 とりあえずtermがx11だと問題ないのがわかったのでそれで使っていようと思います。 ありがとうございました、助かりました replotでも再描画されないです ウインドウの属性が変わらないとアップデートされないので、gnomeのバグかもしれないです gnuplot-qt on Debian bullseye は大丈夫だよ 最新のtestingのisoを使ってsidにクリーンインストールしたんですけど、qt版はたしか動かなかったです。基本、bullrsdys+って感じだと思います。 他のtesting入れてるマシンではqt版使ってて問題なかったので、試しにx11版に変えてみましたが、問題なしです。 こっちのマシンはずっとtestingで運用してるのでdisplay protocolはxorgのままです。 なんかwaylandとgnome4x系の問題な気がしてきました。 linuxはあまり使わないのでよくわかりませんが、linuxなら開発者のEthan氏が勧めるようにqt ターミナルがいいと思います。 動かないなら仕方ないけど。 linuxなら自分でビルドするのもそれほど苦ではないと思うのでqtターミナル、トライできないかな? windows11,WSL2,WSLg,gnuplot-5.4.3で qtだと文字列の末尾が数字の1だと表示がずれる wxtだと閉じるボタンだけで最大化、最小化ボタンが表示されない 原因がわかる方いますか? 色んな出力対応してるんだから片っ端から試して上手く動くの使えばいいよ、プレビュー用途ならなおさら こんなんあるんですね。知らなかった。つかって見よう。 A Jupyter/IPython kernel for Gnuplot https://github.com/has2k1/gnuplot_kernel >>806 状況がよくわかりません。wslならgnuplotはlinuxアプリですか? それともwindowsアプリをwslのterminal上でつかっているのですか。 状況を再現するコマンドやスクリプトを書いてください。 >>806 qtの方は意味不明のままですが、wxtの方はwxtターミナルのプロットウィンドウの右上部に並ぶ − □ × (それぞれ「最小化」、「最大化」、「閉じる」の動作を)ボタンのうち−、□(最小化、最大化)ボタンが表示されないということかと。 >>806 gnuplotは5.4.3 のlinuxバイナリということで、windows11,wsl2,wslgだということですね。 gnuplotの問題なのですか?wslgの問題かも知れません。VcXsrvもいれてみてこちらでも試してみてはいかがでしょうか。 Windows上でのpngcairoターミナルでフォントの表示の乱れがbug ticketに上がっています。 # pngcairo: uppermost pixel in key, label etc missing https://sourceforge.net/p/gnuplot/bugs/2512/ # Bad kerning with pngcairo and gnuplot 5.4.1 https://sourceforge.net/p/gnuplot/bugs/2397/ どちらもpangoライブラリが関係しているようです。 Ethanさんはpangoのフォントやバージョンを変えてみればいわれたので 色々なバージョンpangoをビルドして、ライブラリ置き換えてみましたが大きな改善はしませんでした。 また、windows上のpangocairoは既定ではWindows nativeのバックエンドを使っています。 環境変数PANGOCAIRO_BACKENDをfcにセットすることにより、バックエンドをfontconfig にすることができます。 この作業がworkaroundとして現状有効の様です。 brewからgnuplotインストールしたいんだけど、4時間以上やってもまだ終わらない 異常?正常? うちの環境Macだけど確か1日くらいかかった なんやかんやライブラリ、アホほどインスコされたよ プロットするデータの個数によって、with linesとwith pointsを自動切換えできないでしょうか? 多くのデータファイルから自動で2Dプロットを作成しています。 基本的には plot "file.dat" with lines でスッキリした線だけのプロットを描くのですが たまにX,Yのデータが1組しかないファイルがあり その場合プロットが目に見えない点だけになってしまいます。 そこでファイル中にデータが1組しかない時は plot "file.dat" with points に自動的に切り替えてくれるとありがたいです。 設定やplotコマンドの書き方でなんとかならないでしょうか? もしくは、データファイルの書き方で1組のX,Yデータでも 目に見えるポイントを出す方法があればそれでもいいです。 >>818 無いな スクリプト組んで記述を変えるのが正解だと思う そっかー マニュアル読み込んでみても確かにできる気がしない あるいは with linespoints とか? >>818 stats とif でできるかな。 データがないときはSTATS_recordsはUndefined になることに注意して (インデント消えるとおもうから,適当に足してくれ) stats 'data.dat' nooutput if (STATS_records == 1) { plot 'data.dat' with points } else { plot 'data.dat' with lines } statsうまくいきました!ありがとう! 統計情報なんて気にもとめてなかった。 ちなみにデータない時はエラーになって、STATS_recordsは元のままですね。 (初回ならundefined) 米澤先生のサイトはブックマークしてあったけど、忘れてた。。。 5.0系だとログスケールの時にstatsがエラーになるという謎仕様。 5.2以降だと大丈夫みたいだけど、うちの環境だと使いたい端末がインストールができないorz ところで5chの仕様変更でのせいか輪をかけて過疎化してるね >>828 > 5.0系だとログスケールの時にstatsがエラーになるという謎仕様。 そうなんですか。しかし,5.0系とは懐かしいですな。 > 5.2以降だと大丈夫みたいだけど、うちの環境だと使いたい端末がインストールができないorz 5.2でインストールできない terminal なんてなんでしょう。5.2でdeprecateになったterminalなのでしょうか。 >>830 あ、ウチ環なので一般的な話じゃないです。 LinuxやらSolarisやらMacやら、OSバージョンも複数あって インストールされてるライブラリもまちまちで どのマシンでも同じバージョンのgnuplotを動かそうとすると ライブラリが足りなくてmake失敗したりとか。 今んとこ全部のマシンで成功したのが5.0系というだけの話。 set term qt widget <id> の<id>って何を指定すればいいのかな? 他のアプリのウィンドウに表示できそうなんだけど違うのかな? マニュアルみてもよくわからない。 x11なら set term x11 window "<string>" でウィンドウIDを指定すれば別アプリに表示させられるから Qtでも出来そうな気がするんだけど違うかな。 そんな機能があったのね douyatte使うんだ? じぶんはTcl/TkのGUIアプリでウィジェットにgnuplotを表示させてます。 んでTkのscaleをぐりぐりするとグラフがぐりぐり動きます。 Tkinterならwinfo_idで出来そう 5.4.4beta (5.4.4 のプレリリース)が出てます。 しばらくしたら,正式に5.4.4がリリースされるでしょう。 >>841 5.4.4 の変更Gnuplot Q&A 掲示板を見てください。 New gnuplot subsystem "watchpoints" 開発版で実装されます。 gnuplot beta MLの当該ポストのアーカイブのURLです。 https://sourceforge.net/p/gnuplot/mailman/message/37703162/ ↑途中で失礼しました。 >>845 この実装をONにした開発版Windowsバイナリを以下に置いてます。 demo ディレクトリ下の watchmouse.dem, watchpoints.dem を実行してみてください。 >>849 watchpoints.demの結果をpdfにしてみました。 (watchmouse.demはマウスを動的に使って試すので略) http://tmacchant33.starfree.jp/Files/watchpoits.pdf ある数値aとbがあるとき、a±bを横長の帯として表したいんだが、どうしたらシンプルに実現できるかな? 0 a b 0.1 a b ... というファイルを作ってwith filledcurveでプロットすればそれらしく見えると思うけど、中間生成物を沢山作りたくない >>852 回答ではないかもしれないけどファイル作りたくないならデータブロックをりようすればよいのでは $data << EOF 0 a b 0.1 a b EOF >ある数値aとbがあるとき、a±bを横長の帯として表したい 伝わらん >>854 すみません >>855 そうです 横軸をx軸と呼ぶことにして、>>852 で書いた数値a、bはxによらないということです で、xによらない定数値としてグラフに描画したいということです 定数aを描画したいだけなら plot a で良いのですが、これにエラーをつけるにはどうしたら良いですかと言い換えることもできます sidのGnuplotなようやく修正されたぞ チラ裏 >>857 はい。 x軸方向のエラーバーではなく、y軸方向の定数値±定エラーバーを全てのxに渡って表示したいです >>859 こういうこと? $ cat data.dat 0 -1 2 0.1 -1 2 0.2 -1 2 $ cat plot.gp set xrange [-.1:.3] set yrange [-2:3] plot 'data.dat' u 1:2:3 with filledcurves pause -1 $ gnuplot plot.gp >>860 そうです 任意の面積の塗り潰しがやりたいことです >>861 860を実行すると塗りつぶした長方形となるんだが,やりたいのはそれなの。 yの値がxに依存する場合も考えるのかな? x, yのデータが与えられてぬりつぶしの幅を簡単に変えたい。 データの第3列目に書くのは面倒。 こんなことでいいですか? >>865 > 860を実行すると塗りつぶした長方形となるんだが,やりたいのはそれなの。 >>861 で申したように、そうです それを中間ファイルを用意せずにやりたいということです > yの値がxに依存する場合も考えるのかな? >>856 ,859で申したように、yもエラーの幅も横軸に依存しません > x, yのデータが与えられてぬりつぶしの幅を簡単に変えたい。 > データの第3列目に書くのは面倒。 > こんなことでいいですか? いいえ 与えられるのは定数値a、bだけです aはいわば中央値を、bはいわばエラーの幅を表します これらは定数なので、xによりません したがって、わざわざ x y ye なるフォーマットのファイルを用意するのが面倒だというのが>>852 で申したことです おそらく>>860 は回答のつもりで「こういうこと?」と聞いていて、質問者>>861 は見た目のつもりで「そうです」と言っているのですれ違いが起きている。 で、>>861 の「任意の面積」とは流れを踏まえれば明らかに「任意の矩形」という意味だが>>865 (>>860 ,862,867あたりと同じ人だろう) は額面通りに受け取ってしまったばかりにxに依存する何かを想定している。 視点によっては回答者が文盲にも見えるし質問者が問題を抱えているようにも見えるのだろう。 >>869 は間違い。 ただ単にfiledcuvesと使うと中心がaにはならないみたいだがあとは自分でやってくれ。 # begin a=-1 b=2 set print $data do for [i=0:10] { print 0.1 * i} unset print set xrange [-.1:1.1] set yrange [-2:3] plot '$data' u 1:(a):(b) with filledcurves set terminal pngcairo set output '852_02.png' replot set output set terminal @GNUTERM # end http://tmacchant33.starfree.jp/Files/852_02.png >>871 それはdataなるファイルを作ってるからお題にそぐわないのでは? あと、ファイルを作ってfilledcurveする案で妥協するなら、わざわざ中間の点を打つ必要はないと思う 両端だけ決めてfilledcurveするので十分 >>872 , 873 >それはdataなるファイルを作ってるからお題にそぐわないのでは? それはそうなんですが 外側にファイルを作らなければ実際上そう面倒にならない。 中間ファイルの役割をスクリプトの中に実現すために データブロックがgnuplotに実装されたのだから それを使って実現しても実際上そんなに問題でないとおもいます。 > 両端だけ決めてfilledcurveするので十分 それ書き込んでから気づきました。 中間ファイルが嫌ならスクリプトに含めりゃええがな >>871 を書き換えるなら $ cat plot.gp a=-1 b=2 set xrange [-.1:1.1] set yrange [-2:3] set terminal pngcairo set output '852_02.png' plot '-' u 1:(a):(b) with filledcurves 0 1 $ gnuplot < plot.gp read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる