gnuplot を使おう。 その3
>>487 仕事で使っている人ですよ。私も仕事で使ってます。 掲示板便利ですよ。 >>488 やっぱり。かなり使い込んでそうだから。 データ分析とかに使うことが多いんですか? >>489 論文にのせる図の作成。 日頃の実験データの整理。 自作の機器制御プログラムでのリアルタイムプロット。 fitコマンドによるパラメータ最適化。 等々。 gnuplotに触らない日の方が少ない位です。 本格的データ解析はoctaveでやりますが、gnuplotの方が遥かに使用頻度が高いです。 >>490 大学の研究ですか。楽しそう。 実験データをまとめて比較したりしているんですかねえ。 使い方のノウハウとかプロセスとかたまってそうでうらやましいです。 >>487 takeno.iee.niit.ac.jp/~shige/gnuplot/gnuplot.html#info このぺーじは本当に情報の宝庫です。もしご存じなければご覧あれ。 gnuplot Q&A 掲示板にも頻繁に登場されておーと思う回答をされます。 >>492 リンクミス。 http://takeno.iee.niit.ac.jp/ ~shige/unix/gnuplot/gnuplot.html#info サイトの情報ありがとうございます。 読んでみます。 gnuplot+gawkの環境で、fileAの3列目を横軸に、fileBの5列目を縦軸にグラフを描くにはどうすれば良いですか? >>497 awkは基本的に一つのテーブル型のデータファイルを手抜きして操作できるスクリプト。 二つのデータファイルをあつかうにはpasteコマンドでファイルを連結させるのが常套。 pasteを使うのが前提ならばawkは不要。 http://folk.uio.no/hpl/scripting/doc/gnuplot/Kawano/datafile3.html#paste 時間分解能の違う2種類の時系列データで同時刻の際の相関を見るとかだと awkの連想配列が便利と言えば便利かもね >>498 ありがとうございました 思った通りに動作しました >>499 今回は同じだったので異なる場合を見るときは使ってみます 3次元のグラフの目盛の数字と目盛のラベルが他の軸だったり、軸の線と重なる ことがありますが、どうするのがいいのでしょうか? viewやoffsetを調整することはできるのですが、場当たり的な対応であり、 手間もかかるので、うまい対処方法はないでしょうか? >>501 これは、難しい。3Dだから。自分にはいわれている場当たり的対応しか、思い付かない。statsも2次元だし。 ダメもとでgnuplot Q&A 掲示板で聞いてみるとか。 >>501 gnuplot Q&A 掲示板 に投稿してみた。 3140番です。 >>502 viewの角度を元にoffsetを調整することを思いついて試してみたんですが gnuplotが目盛の表示位置を調整しているため、うまく行かないです。 zを25度回転したあたりで1文字分ずらすようです。 ソースを読めば動作が分かるんでしょうがそこまでできないでいます…。 >>501 >>505 gnuplot Q&A 掲示板の3142番の回答のようにバグの可能性があります。 bug ticketsに登録できますか? やり方がわからないならアシストします。 z軸の回転角度を26〜154度にするとy軸の目盛が急に軸に近づくのは おかしい気はしていました。バグなんですかねえ。 bug ticketsに登録したことはないので自信はないです…。 Statusはopenで、Ownerは空でいいと思うし、内容は何とか書けないこともないと思うんですが Milestone、Priority、Labelsはどうするんだろうという感じです。 .scに書き込んでしまったので念のため.netからも。 > Milestone、Priority、Labelsはどうするんだろうという感じです。 ここらは、全部空欄でいいですよ。 私がレポートするときはじめは、気にしてましたが、今は気にしてません。 最初だけは、Anonymousで書き込めますが、やりとりをするにはsourceforgeのアカウントが必要です。アカウント名は、ハンドルネームでもかまいません。 gnuplot Q&Aの回答にあったスクリプトはつけておくことをおすすめします。 >>509 なるほど。登録してみます。 ちなみにviewの角度を元にoffsetを調整する関数が書けそうなのでそれを 完成させてから合わせてbug ticketsに登録しようと思います。 なお、>>507 さんに対応して下さいということではないです。 誰かに対応してもらえるかなあ?という思いを率直に書いただけです。 あしからず。 >>513 登録確認しました。 デベロッパ側の返事があるといいですね。 dgrid3dによる変換後のデータと元データを同じグラフで描画する方法は あるのでしょうか? イメージとしては以下の両方のコマンドを描画したいです。 splot "scatter.dat" using 1:2:3 with impulses set dgrid3d splot "scatter.dat" using 1:2:3 with lines ところが、それをしたいと思って以下を実行すると impulsesも変換後のデータを使ってしまいます。 set dgrid3d splot "scatter.dat" using 1:2:3 with lines, \ "scatter.dat" using 1:2:3 with impulses >>515 解決しました。 set table $dataに一度出力してから$dataとscatter.datを描画すればよかったです。 >>516 解決したと思ったら問題がまだ残っていました。 dgrid3dで作成されるデータは元データが存在する範囲に限られるので取り得る値であっても データがなければ曲面は描画されません。 例えば100点満点のテストのグラフを描画したいのでグラフの範囲は[0:100]だけど 実際の最低点は30点で、最高点は90点だった場合、どのように示すのがいいでしょうか? そのままグラフを示すと曲面が0〜100点を示していると誤解する人が出そうです。 グラフの範囲を[30:90]にするというのも一案だとは思いますが、 グラフの範囲は[0:100]だという前提で、曲面の範囲は30〜90点であることも 誤解なく示すにはどうするのがいいかアイデアを頂きたいです。 >>517 3項演算子はつかえませんか? 具体例は『3項演算子 gnuplot』で検索してみて下さい。 >>518 よく考えたらimpulsesの根元が元データの分布を示していることに気が付きました。 必要であればstatで最小値・最大値が分かるのでデータの範囲をbaseの位置に示してもいいでしょうか。 ただ、当初の質問から派生した疑問としてある曲面の上にあるデータと曲面の下にある データで色分けするにはどうすればいいのでしょうか? 2次元グラフで3項演算子を活用する方法は分かったのですが、3次元の場合の 方法は見つけられていません。 ばらついて分布する元データからdgrid3dで格子の曲面を生成し、 元データがその曲面の上下どちらにあるかを分かりやすく示したい といった利用方法を想定しています。 >>667 このあたりのことは、gnuplot Q&A 掲示板でよく登場される竹のさんが深い造形わをお持ちです。 こちらで回答がつかない場合は、gnuplot Q&A 掲示板で質問されたほうが いいと思います。 >>515 >>516 >>517 >>519 もっと具体的にモデルデータをつけでもらえませんか。ver. 5ならデータブロックでスクリプト内にデータがかけるので。 また、 set dgrid3d splot "scatter.dat" using 1:2:3 with lines, \ "scatter.dat" using 1:2:3 with impulses set tableで外部ファイルに吐き出させたデータ(長ければ、その一部)も書いてもらえませんか? 具体的なことがわからないとどこで質問しても答えはつかないと思います。 >>521 2つの変量が結果に作用する傾向を確認したいといったケースを想定しています。 データにはあまり依存しないと思いますので、 例えば以下のデータをプロットする場合はいかがでしょうか。 # 要因A 要因B 結果 30 50 20 60 80 90 50 70 80 30 60 60 55 60 55 40 70 60 30 80 20 80 80 40 40 50 95 >>520 面白いスクリプトを書かれていらっしゃるのを拝見しました。 状況を見てgnuplot Q&A 掲示板の利用も検討してみます。 >>522 サンプルデータありがとうございます。 まだ、なさりたいことを完全に把握しきれてないので。 >例えば100点満点のテストのグラフを描画したいのでグラフの範囲は[0:100]だけど 実際の最低点は30点で、最高点は90点だった場合、どのように示すのがいいでしょうか? そのままグラフを示すと曲面が0〜100点を示していると誤解する人が出そうです。 グラフの範囲を[30:90]にするというのも一案だとは思いますが、 グラフの範囲は[0:100]だという前提で、曲面の範囲は30〜90点であることも >誤解なく示すにはどうするのがいいかアイデアを頂きたいです。 この点は、 set xrange [0:100] set yrange [0:100] set zrange [0:100] ではだめですか? >>524 そのような方法もあると思います。 元のデータが分布している範囲を明示する必要があれば>>519 の前半の方法も あるかと思います。 同じような悩みを持った方がいらっしゃいましたらどうしたか アイデアを共有して頂きたいと思ってました。 俺もどういうものを作りたいのかいまいちよくわからんけど、grid3dとpm3dの組み合わせとかでいいんけ? それとも、 ttp://www.phyast.pitt.edu/~zov1/gnuplot/html/bargraphs.html の一番下のbargraphみたいなの作りたいの? 作りたいグラフっぽい図を示してもらった方が的を射た答が返ってくると思うよ 連投(´・ω・)スマソ 曲面の上と下のデータってどういう意味? grid3d使ったら、データはすべて曲面上に乗るんじゃないの? >>519 >ばらついて分布する元データからdgrid3dで格子の曲面を生成し、 >元データがその曲面の上下どちらにあるかを分かりやすく示したい といった利用方法を想定しています。 dgrid3dは格子ごとの平面を生成します。 まず、x, y座標からどの格子に属するのを知る必要があります。 これは、原点を考慮した割算とfloor関でできると思います。 また、格子の座標がわかるので格子の平面の方程式がわかり、それがわかれば格子上のz座標がわかります。 与えられたデータのz座標が格子上の z座標より大きいか小さいかてでプロットをかえる三項演算子の実装をします。 文章でいうとこんなところです。 スクリプトにするには、色々考えないといけませんが、今のgnuplotのスクリプトの強力さを考えると実装できると思います。 >>526 >>517 は、こんなグラフを作るにはどうすればいいの?って疑問じゃなくて こういう場合はどういうグラフにするのがいいんだろう?って疑問なので どんなグラフがいいのか私も分かりません。 >>519 のやり方で対応することにします。 もしも、同じような疑問を持たれた方がいらっしゃいましたら経験を 共有して頂ければ十分です。 >>528 生データとそれを元に生成したgrid3dの曲面の両方を描画します。 生データとgrid3dの曲面はずれますので曲面の上下に位置することになり、 そのずれを見やすく色分け表示したいと思いました。 >>529 2次元の場合でも3次元も場合でも三項演算子の使い方は基本的には同じなんですね。 dgrid3dの曲面は式では与えられないので交点のデータから判定するための 条件を自分で記述する必要があるということですか。 方針はイメージできました。ありがとうございます。 $dataに格納されたデータにアクセスするコマンドって用意されているんでしたっけ? 配列のようにアクセスできれば理想ですが、そこまでできないにしても そもそも部分的にデータを取り出すにはどうするんでしょう? 私が知らないだけかも知れませんが。 $dataに限らずデータファイルでもいいんですが plot、splot以外から行や列を参照する方法ってあるんですか? >>531 次のようなスクリプトを書きました。 # スクリプト $data_dgrid3d << EOD # 要因A 要因B 結果 30 50 20 60 80 90 50 70 80 30 60 60 55 60 55 40 70 60 30 80 20 80 80 40 40 50 95 EOD set dgrid3d set table 'dgrid3d_table.txt' splot $data_dgrid3d using 1:2:3 unset table unset dgrid3d unset logscale xyz set xrange [0:100] set yrange [0:100] set zrange [0:100] set xlabel 'x' set ylabel 'y' set zlabel 'z' splot 'dgrid3d_table.txt' using 1:2:3 with lines, \ $data_dgrid3d >>531 適当にマウスで回転させてスクショをとったのが下。 http://www.geocities.co.jp/tmgpltwin/Files/20160420.png ようするになさりたいことはこのグリッドの上と下でマーカの種類や色を変える ということですよね。 >>535 あえてtableへのプロットをデータブロックにしないで、ファイルにして先頭のほうだけ書いたのがこれ # Surface 0 of 1 surfaces # Curve title: "$data_dgrid3d using 1:2:3" # IsoCurve 0, 10 points # x y z type 80 50 58.7832 i 80 53.3333 58.5131 i 80 56.6667 58.2234 i 80 60 57.8866 i 80 63.3333 57.5448 i 80 66.6667 56.982 i 80 70 56.0251 i 80 73.3333 53.6147 i 80 76.6667 49.451 i 80 80 40 i >>534 なお,最近の開発版ならarrayがあり配列が使える。 データファイルから配列に格納するやり方は以下を参照。 FILE = 'orbital_elements.dat' stats FILE index 2 using 2 prefix "A" array Data[A_records] stats FILE index 2 using (Data[int($0+1)] = $2) prefix "B" >>538 statsで1行だけ読み込むとはすごい裏技です! > よく考えたらimpulsesの根元が元データの分布を示していることに気が付きました。 そうか。これをつかえば、平面の方程式なんていらないし、 tableで書き出してみてデータ構造みてみて statsでデータを取り出していくとよいかも。 >>542 ちと勘違い。 impulsesはdgrid3dでは格子点に降りるのであった。 >>542 に書いたことは忘れてください。m(__)m。 >>511 開発版で対応してくれたようです。良かったですね。 テストスクリプトではかなり改善されていると思います。 >>544 ほんとですね! 対応してもらえると期待してなかったので感激です。 >>544 CVSに上げてもらえたのはうれしいんですが、CVSからダウンロードしてビルドは やったことないです。 Windowsのコンパイル環境はcygwinとかが必要になるんでしょうか?ってレベルです。 やってやれないことはないと思いますが、悩む感じです。 「改善されている」と言うことですが、ざっと動作確認をして頂いたということでしょうか? もし、そうであればそれで動作確認ができたと報告してしまおうかと。 >>544 It may need to be larger, however. とコメントがありましたが 軸とラベルの間の隙間は狭い(元のまま)のでしょうか? この辺りは好みもあると思いますので、xlabelとylabelとzlabelでバランスが おかしくなければといったとこですが、どうなんでしょう? CVSのバイナリが公式ページに上がっているのを見つけました。 わざわざビルドして頂いたのでしょうか? テスト中です。 解決されているのを確認できました。 ただ、角度によっては目盛のラベルが軸に寄り過ぎている場合があるので 余裕があったらそこまでやってもらえるとうれしいといった感じで コメントしておきます。 ありがとうございます。 >>548 http://www.tatsuromatsuoka.com/gnuplot/Eng/winbin/ のことですか。 これは有志(私ですが)が定期的にwindowsバイナリをビルドして配布しているところです。 その他にもう一つ同じようなサイトがあります。 と思ったらリンクされてるだけでした。 開発の中心メンバーとして活躍されてるんですね。 Jane Styleに慣れてないのでミスしてばっかりm(__)m。 開発の中心にはいませんが,サポートメンバーの一人であることは確かです。 公式リリースの64ビット版のwindows版バイナリは私がビルドしたものです。 gnuplotは日本人がかなり活躍しているオープンソース系のプロジェクトの 一つです。’(ほかにもありますが) 私のパソコンで動いてるgnuplotをビルドして頂いていたとは存じ上げませんでした。 いつもありがとうございます。 >>546 遅レスですが, >Windowsのコンパイル環境はcygwinとかが必要になるんでしょうか? windows 上でビルドするには, 1.msys2上で,通常のwindows版をビルドする方法と 2.cygwinでcygwin版をビルドする方法 3.Microsoft Visual Cでwindows版をビルドする方法 があります。 3.は私がわからないので略。 以前は,2.のほうが楽だったのですが,msys2が登場し,充実してきたので, 今では,1と2では難易度はほとんど変わりません。 msys2上でのgnuplotのビルドは >>465 をご覧ください。 zshみたいな感じで補完とか履歴にまつわる挙動カスタマイズできたりしないの? >>560 ビルドインのreadlineを使うか、GNU readlineを使うかで違ってくると思う。 私は窓使いなのでビルトインのreadlineしか使えない。 昔に比べるとビルトインのreadlineの性能は良くなった。良くしたいならば自分でコミットするしかない。 GNU readlineはわからないが履歴の操作はある程度できるんじゃないかな。 その辺はGNU readlineを学ぶしかないと思う。 times.datは以下の形式で 2015/12/29 1 2015/12/29 2 2015/12/29 3 ... times.gpは set xdata time set timefmt "%Y/%m/%d" set format x "%Y/%m/%d" set xtics rotate by -45 set xrange ["2015/12/29":"2016/05/15"] plot "times.dat" using 1:2 notitle with linespoints pointtype 7 persist これで gnuplot times.gpで描写されない 何が間違っているのだろうか? >>653 検証ありがとう gnuplot-x11 をインストールしたら動いた 昔はgnuplot で行けたような気がしたが type set to unknown になるので -x11の方installで解決 >>564 x11 ターミナルは、昔からgnuplot-x11 がないと原理的に動かない。今は、wxtとかqtとかが主流だからx11はオプションインストールになったのかな。 >>560 >>561 ビルトインのreadline.c をちょっと読んでみた。 http://gnuplot.cvs.sourceforge.net/viewvc/gnuplot/gnuplot/src/readline.c?revision=1.64& ;view=markup 補完もヒストリもあるけど、ソース中のコメントにもあるようにGNU readlineのサブセットのようだ。 自分の使っているreadlineがどちらかを調べることから始めたらいかがですか。また、Unix上ならgnuplotのビルドさほど難しくないし、確かGNU のライブラリとdevをいれていれば、GNU readlineがconfigureで優先されるはず。 >>565 debian系は昔からGUI抜きで動くのがgnuplotってパッケージ 画像ファイルの出力に使う x11なしの実行形式を出来るだけ作るのがdebian系の流儀で昔から変わらない >>567 ubuntu 14.04 では、gnuplotでsynapticでインストールするとwxtがデフォルトのgnuplot-4.6.4がインストールされ、ついでにgnuplot-x11インストールされました。 interactive terminalなしのgnuplotは、gnuplot-noxでした。 Debianとubuntuでは違うのかな? >>569 まあ、ubuntu 14.04のgnuplotは、古すぎるので自分でビルドしたものを使ってますが。 >>560 補完やヒストリーを設定するには、GNU readlineをリンクしてビルドするまたはしてあることが必要なようだ。 GNU readlineをリンクしてあればinputrcにカスタマイズを書くことができると思う。 私は、窓上ではxyzzy 上で動くwgnuplot-modeを linux上ならならemacsのgnuplot-modeを使っているので readlineのお世話になることがほとんどない。 >>572 質問が曖昧なのでなんとも言い難いですが。 これは、例えばプロットの四角形の領域を軸ラベルの設定などに影響されないようにしたいということですかね。 私もやりたいのですが、いまはターミナルのサイズを調整してやっている。 それなら私も教えて欲しいです。 >>572 >>573 gnuplot Q&A 掲示板 3182 を見てください。 set size ratio と set margin を上手く使って下さい。 それぞれのhelpやマニュアルをご覧下さい。 100x + 200y = 5000が表す平面を描画するにはどうすればいいのでしょうか? zの関数としては記述できなさそうなので、どうすればいいか分からないです。 100x + 200y = 5000 は直線の方程式では? X=100は点か?線か?面か? 3次元の話ししてんだからその式も面だろ >>579 確かに面ですね。すいません。m(__)m。 また、媒介変数を使わないとgnuplotでは描けない面です。 一列分の数値列をプロットするときに、一行目の数値で全数値を割ったものをプロットすることは可能? ほんとは最大値で割りたいが、この場合はとりあえず一行目の数値が最大値であるとする >>585 すみませんm(__)m。 バージョン 5からの機能と勘違い。 4でもあるバージョンから使えるよう。 お使いのgnuplotで help stats で確認してください。 >>585-586 こりゃ便利だな ありがとう 昨日は結局自作関数を作ったが、今後はこちらを使おうと思う 複数のファイルに対応する場合は順番に読み込んで覚えるしかないのかもしれんが read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる