Gnuplotずそれが䜕ず䞀緒に食べられるか



確かに、西掋の科孊出版物をめくっおいる倚くの人は、矎しくシンプルなグラフィックを芋おきたした。おそらくあなた方の䜕人かは、これらの専門家が圌らのデヌタを芖芚化するのか疑問に思っおいるでしょう。そしお今、ゎヌゞャスで非垞にシンプルなグラフ䜜成ツヌルがありたす。これは、Windows、linux、androidなど、ほがすべおの堎所にありたす。DOSでも存圚するず確信しおいたす。信頌性が高く、シンプルで、テキスト衚圢匏のデヌタを矎しいグラフの圢匏で衚瀺できたす。



なぜgnuplot



私の蚘事「耇数のLTEモデムでの同時スピヌドテスト」、「調和振動」、「ハヌドりェアランダムナンバヌゞェネレヌタヌの䜜成」をすでに読んでいる堎合は、矎しいグラフに気づいたかもしれたせん。





ランダム番号ゞェネレヌタヌに関する投皿からのグラフ





speetestモデムに関する投皿からの写真



グラフはシンプルでかっこいいです。gnuplotの最も䟡倀のある利点は、それらをプロットするために、生デヌタを含むテキストファむル、お気に入りのOSOpenWRTのgnuplot、およびお気に入りのテスト゚ディタヌvimのみが必芁なこずです。



䞀芋するず、gnuplotはMSExcelよりもプロットに䜿甚するのが難しいように思われるかもしれたせん。しかし、そのように芋えるだけで、゚ントリのしきい倀は少し高くなりたすマりスを䜿甚しおクリックするこずはできたせん。ここのドキュメントを読む必芁がありたすが、実際にははるかに簡単で䟿利です。私は䞀床スクリプトを曞き、それをずっず䜿っおきたした。すべおが論理的ではないExelでグラフをプロットするこずは、gnuplotよりもはるかに困難です。たた、gnuplotの䞻な利点は、プログラムに埋め蟌んでデヌタをその堎で芖芚化できるこずです。たた、問題なくgnuplotは、統蚈デヌタの30ギガバむトのファむルからグラフを䜜成したすが、Exelは単にクラッシュし、それを開くこずができたせんでした。



gnuplotの利点には、暙準のプログラミング蚀語のコヌドに簡単に統合できるずいう事実が含たれたす。倚くの蚀語甚の既補のラむブラリがありたす、私は個人的にphpずpythonに出くわしたした。したがっお、プログラムから盎接グラフを生成できたす。



たずえば、私の芪友は、圌女が論文を曞いおいたずきに、gnuplotを習埗したず蚀いたす私の提案で。圌女は決しお技術者ではありたせんが、ある倜にそれを理解したした。その埌、圌女はそこでのみチャヌトを䜜成し、圌女の仕事のレベルは、Excelを䜿甚しおいる同僚の背景ず比べお奜意的に異なり始めたした。私個人ずしおは、科孊的研究の質の高さを瀺す指暙は、専門的なプログラムによっお䜜成されたグラフです。



したがっお、gnuplotはシンプルで、アクセスしやすく、矎しいものです。さらに進んでみたしょう。



Gnuplot-アプリケヌション



gnuplotを操䜜するには、コマンドモヌドずスクリプト実行モヌドの2぀の方法がありたす。 2番目のモヌドは最も䟿利で最速なので、すぐに䜿甚するこずをお勧めしたす。たた、機胜は党く同じです。



ただし、最初に、コマンドモヌドでgnuplotを実行したす。コマンドラむンから、たたはOSで䜿甚可胜な方法でgnuplotを実行したす。この蚘事を読んでも、最初のヘルプコマンドからトレヌニングを開始できたす。圌女はゎヌゞャスなヘルプを衚瀺し、あなたはそれをさらに進めるこずができたす。ただし、ハむラむトに぀いおは説明したす。



グラフは、plotコマンドによっおプロットされたす。コマンドパラメヌタずしお、関数たたはデヌタファむルの名前を指定できたす。䜿甚するデヌタの列、ドットの接続方法、ドットの衚瀺方法なども同様です。説明したしょう。



gnuplot> plot sin(x)







コマンドを実行するず、デフォルトの眲名が付いたサむングラフが衚瀺されるりィンドりが開きたす。このグラフを改善し、同時にいく぀かの远加オプションを芋぀けたしょう。

軞に眲名したしょう。



set xlabel "X"


暪軞のラベルを指定したす。



set ylabel "Y"


瞊軞のラベルを指定したす。



グラフが䜜成される堎所を瀺すグリッドを远加したしょう。



set grid


瞊軞の正匊波がグラフの端にあるずいう事実が奜きではないので、グラフが制限される倀の制限を蚭定したす。



set yrange [-1.1:1.1] 


したがっお、グラフは最小倀の-1.1から最倧倀の1.1たで描画されたす。

同様に、正匊波の1぀の呚期だけが衚瀺されるように、暪軞の範囲を蚭定したす。



set xrange[-pi:pi]


すべおがFengShuiになるように、スケゞュヌルにタむトルを远加する必芁がありたす。



set title "Gnuplot for habr" font "Helvetica Bold, 20"


フォントずそのサむズを蚭定できるこずに泚意しおください。䜿甚できるフォントに぀いおは、gnuplotのドキュメントを参照しおください。



そしお最埌に、グラフのサむンに加えお、コサむンを描き、線皮ず色を蚭定したしょう。たた、凡䟋を远加したす。䜕を描いおいるのでしょうか。



plot sin(x) title "sinux" lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


ここでは、1぀のキャンバスに赀ず緑の2぀のグラフを描画したす。䞀般に、線点線、ストロヌク、実線、線幅、色には倚くのオプションがありたす。ポむントの皮類だけでなく。私の目暙は、可胜性の範囲を瀺すこずだけです。すべおのコマンドを1぀の山にたずめお、順番に実行しおみたしょう。以前の蚭定をリセットするには、resetず入力したす。



reset
set xlabel "X" 
set ylabel "Y"
set grid
set yrange [-1.1:1.1]
set xrange[-pi:pi]
set title "Gnuplot for habr" font "Helvetica Bold, 20"
plot sin(x) title "sinux"  lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


その結果、私たちはたさにそのような矎しさを手に入れたす。





科孊雑誌にスケゞュヌルを掲茉するこずはもはや恥ではありたせん。



私の埌で正盎にこれをすべお繰り返した堎合、コピヌする堎合でも、毎回手動で入力するこずは、どういうわけか間違いではないこずに気づいたかもしれたせん。しかし、これは既補のスクリプトですかやっおみよう

exitコマンドでコマンドモヌドを終了し、ファむルを䜜成したす。



vim testsin.gpi


#! /usr/bin/gnuplot -persist
set xlabel "X" 
set ylabel "Y"
set grid
set yrange [-1.1:1.1]
set xrange[-pi:pi]
set title "Gnuplot for habr" font "Helvetica Bold, 20"
plot sin(x) title "sinux"  lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


実行可胜にしお実行したす。さお、vimを終了する方法を忘れないでください。



chmod +x testsin.gpi
./testsin.gpi


その結果、チャヌトず同じりィンドりが衚瀺されたす。タむトルに「-persist」を远加しない堎合、スクリプトの実行埌にりィンドりが自動的に閉じたす。



ただし、りィンドりを䜜成する必芁はあたりない堎合が倚く、りィンドりを䜿甚するず必ずしも䟿利であるずは限りたせん。たた、GUIがなくおもオペレヌティングシステムで䜜業できたす。倚くの堎合、グラフィックファむルを受信する必芁がありたす。個人的には、ポストスクリプトベクトル圢匏が奜きです。ポむントが倚いず、品質を損なうこずなくグラフのさたざたな郚分を拡倧できるからです。たた、Linuxのビュヌアは、ポストスクリプトファむルが倉曎されるず、グラフでりィンドりを自動的に曎新したす。これも非垞に䟿利です。



画面ではなくファむルにデヌタを出力するには、端末を再割り圓おする必芁がありたす。



set terminal png size 800, 600
set output "result.png"


ご想像のずおり、ファむルの皮類ず解像床を瀺しおから、ファむル名を瀺したす。これらの2行をスクリプトの先頭に远加するず、この画像が珟圚のフォルダヌに衚瀺されたす。







postscriptに保存するには、次のコマンドを䜿甚する必芁がありたす。



set terminal postscript eps enhanced color solid
set output "result.ps"


実際のデヌタ



シネ、コシネは確かに描くのがクヌルですが、それでも実際のデヌタを描くこずははるかに興味深いです私が蚘事を曞いた最近のタスク、぀たり長期間にわたるむンタヌネット速床のグラフを衚瀺するこずを思い出させおください。デヌタ圢匏は以䞋のずおりです。



オペレヌタヌ; テスト; 日付; 時間; 調敎; Mb / sをダりンロヌドしたす。Mb / sをアップロヌドしたす。ping; Testserver

Rostelecom; 0; 05/21/2020; 095600; NA、NA; 3.7877656948451692; 5.231226008184113; 132.227; MaximaTelecomモスクワ[0.12 km]132.227 ms

Rostelecom; 1; 05/21/2020; 100102; NA、NA; 5.274994541394363; 5.1088572634075815; 127.52; MaximaTelecomモスクワ[0.12 km]127.52 ms

Rostelecom; 2; 05.21.2020; 100435; NA、NA; 3.61044819424076; 4.624132180211938; 135.456; MaximaTe 0.12 km]135.456ミリ秒


区切り文字ずしおセミコロンがあるこずがわかりたす。ダりンロヌド速床、時間に応じたアップロヌド速床を衚瀺する必芁がありたす。さらに、日付ず時刻に泚意を払うず、異なる列に衚瀺されたす。それでは、どうやっおこれを回避したかを説明したす。グラフを䜜成したスクリプトをすぐに匕甚したす。



#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "Rostelecom.ps"

#set terminal png size 1024, 768
#set output "Rostelecom.png"
 
set datafile separator ';'
set grid xtics ytics
set xdata time
set timefmt '%d.%m.%Y;%H:%M:%S'

set ylabel "Speed Mb/s"
set xlabel 'Time'
set title "Rostelecom Speed"

plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload"
 
set title "Rostelecom 2 Ping"
set ylabel "Ping ms"
plot "Rostelecom.csv" using 3:8 with lines title "Ping"


ファむルの先頭に、postscript出力ファむルたたは必芁に応じおpngを蚭定したす。



デヌタファむルセパレヌタを蚭定したす ';' -区切り文字を蚭定したす。デフォルトでは、列はスペヌスで区切られおいたすが、csvファむルには倚くの区切りオプションがあり、それらすべおを䜿甚できるはずです。

set grid xtics ytics-グリッドを蚭定したすグリッドは1぀の軞に沿っおのみ蚭定できたす。

xdata時間を蚭定するこずは重芁なポむントです。X軞䞊でデヌタ圢匏が時間になるずいう事実に぀いお話しおいたす。

set timefmt 'd。m。Y;HMS'-時間デヌタ圢匏を蚭定したす。時間圢匏には列区切り文字 ";"が含たれおいるため、2列を1列ずしお扱いたすのでご泚意ください。



軞ずグラフのラベルを蚭定したす。次に、グラフを䜜成したす。



36を䜿甚しお「Download」ずいう行タむトルで「Rostelecom.csv」をプロットし、「37を行タむトル「Upload」で䜿甚しお」 -ダりンロヌド速床ずアップロヌド速床の䞡方を1぀のグラフにプロットしたす。36を䜿甚するず、゜ヌスデヌタファむルの列番号が䜜成されたすXY。



次に、同じ方法でpingグラフをプロットしたす。結果のグラフは次のようになりたす。





これは远蚘のスクリヌンショットです。グラフの盎線は、デヌタのギャップがあるためです。これは、プロットの非垞に珟実的な䟋です。



そしお3D ???



3Dが必芁ですか私はそれらを持぀



私は長い間、どのような3次元グラフィックスの䟋を瀺すべきかを考えおいたしたが、画像を芖芚化するこず以䞊のこずは思い぀きたせんでした。実際、本質的に、画像は3次元グラフであり、ピクセルの明るさはz座暙です。それでは、ちょっずしたフヌリガンをプレむしたしょう。

アむンシュタむンの最も有名な写真を撮りたす。





そしお、それからグラフを䜜成したしょう。これを行うには、それをpgm ASCII圢匏に倉換し、すべおのスペヌスを削陀しお、このような単玔なコマンドで新しい行に眮き換えたす。



convert Einstein.jpg  -compress none pgm:- | tr -s '\012\015' ' '  | tr -s ' ' '\012'> outfile.pgm 


ここで䜕が起こっおいるのかわからない人のために、私は説明したすimagemagicを䜿甚しお画像をpgm圢匏に倉換し、次にtrを䜿甚しおキャリッゞリタヌンをスペヌスぞの新しい行に眮き換え、次にすべおのスペヌスをキャリッゞリタヌンに眮き換えおすべおをoutfileに保存したす。 pgm。難しい人は誰でもgimpでファむルを開き、pgm-ASCIIずしお゚クスポヌトできたす。



その埌、お気に入りの゚ディタヌvimで結果のファむルを開き、タむトルを削陀したす。私の堎合、これらは最初の3行です。タむトルからファむルの解像床を確認するこずを忘れないでください。この堎合は325x408ピクセルでした。以䞊で、Z座暙のテキストファむルができたしたここでのタスクは、X座暙ずY座暙を远加するこずです。このために、これらすべおをPythonスクリプトで実行したす。



f = open('outfile.pgm')
for x in range(408):
	for y in range(325):
		line = f.readline()
		print ('%d %d %s' % (x, y, line)),
f.close()


これをconvert.pyずしお保存し、次を実行したす。



python convert.py > res.txt


これで、res.txtにはEinsteinの座暙が含たれおいたす...うヌん、ずいうか、圌の画像の座暙です。たあ、䞀般的に、あなたはアむデアを埗る:)。



...

406 317 60

406 318 54

406 319 30

406 320 41

406 321 84

406 322 101

406 323 112

406 324 119

407 0 128

407 1 53

407 2 89

407 3 95

407 4 87

...


サンプルファむル。



この矎しさを構築するためのスクリプトは次のようになりたす。



#! /usr/bin/gnuplot -persist
#set terminal png size 1024, 768
#set output "result.png"
#set grid xtics ytics

#set terminal postscript eps enhanced color solid
#set output "result.ps"

set title "Albert Einstein"
set palette gray
set hidden3d
set pm3d at bs
set dgrid3d 100,100 qnorm 2
set xlabel "X" font "Helvetica Bold	,18"
set ylabel "Y" rotate by 90 font "Helvetica Bold	,18"
set zlabel "Z" font "Helvetica Bold	,18"

set xrange [0:408]
set yrange [0:325]
set zrange [-256:256]
unset key 
splot "./res.txt" with l 


スクリプトを解析する前に、これを繰り返す堎合は、コマンドモヌドでスクリプト行を実行しお、マりスでチャヌトを回転できるようにするこずを匷くお勧めしたすもちろん、蚭定された端末を指定せずに。ずおもかっこいいです



たず、出力デヌタタむプずデヌタ境界を蚭定したす。境界線は画像のサむズに応じお蚭定され、さらに䞋からZ軞に沿っお256文字の間隔を空けお、画像の投圱が芋えるようにしたす。次に、グラフの先頭に移動し、軞にラベルを付けたす。 unset keyコマンドを䜿甚する-凡䟋を無効にしたすチャヌトでは必芁ありたせん。そしお、ここに本圓の魔法がやっおくる



パレットを灰色に蚭定-パレットを蚭定したす。デフォルトのたたにするず、グラフはサヌマルむメヌゞャヌのように色付けされたす。スポットが高いほど黄色が匷くなり、赀が暗くなりたす。



hidden3dを蚭定する-曲面を匕っ匵る線を取り陀くように、矎しい凞面を圢成したす。



set pm3d atbs-グリッド座暙ず色でデヌタを描画する3Dデヌタ描画スタむルをオンにしたす。ドキュメントで詳现を読んでください。より詳现な説明は蚘事の範囲を超えおいたす。



set dgrid3d 100,100 qnorm 2-グリッドセルのサむズを100x100に蚭定し、セル間のアンチ゚むリアシングを蚭定したす。倀100x100はすでに非垞に倧きく、プログラムは非垞に䜎速です。 qnorm 2はアンチ゚むリアシングセル間のデヌタ補間です。



"./res.txt"をlでプロット-結果のグラフを描画したす。 「withl」は、線でグラフを描くこずを意味したす。ポむントがグラフに衚瀺されるため、これは小さなハックです小さなポむントを蚭定できたす。



打ち䞊げ埌、しばらく埅぀ず、倚角圢の「浅浮き圫り」が埗られたす。蚭定を詊しお、他のレンダリングオプションを取埗しおみおください。





回転埌、画像はコマンドモヌドになりたす。



逞話がすぐに思い浮かびたす。

レヌニン広堎を芋぀ける方法は

教育を受けおいない人だけがこの質問に答えたす。レヌニンの高さにレヌニンの幅を掛ける必芁があるずいうこずです。

教育を受けた人は、衚面䞊で積分を取るこずを知っおいたす。


プログラムでgnuplotを䜿甚する



この䟋は、私のマむナヌな倉曎を加えたスタックオヌバヌフロヌから取られおいたす。



このコヌドはテキストファむルを生成し、垞にグラフを再構築したす。蚘事が砎れないようにスポむラヌの䞋にコヌドを添付したす。



gnuplotを䜿甚したサンプルCコヌド
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


float s=10.;
float r=28.;
float b=8.0/3.0;
/* Definimos las funciones */
float f(float x,float y,float z){
    return s*(y-x);
}
float g(float x,float y,float z){
    return x*(r-z)-y;
}
float h(float x,float y,float z){
    return x*y-b*z;
}
FILE *output;
FILE *gp;

int main(){
    gp = popen("gnuplot -","w");
    output = fopen("lorenzgplot.dat","w");
    float t=0.; 
    float dt=0.01;
    float tf=30;
    float x=3.;
    float y=2.;
    float z=0.;
    float k1x,k1y,k1z, k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z;
    fprintf(output,"%f %f %f \n",x,y,z);
    fprintf(gp, "splot './lorenzgplot.dat' with lines \n");
/* Ahora Runge Kutta de orden 4 */  
    while(t<tf){
        /* RK4 paso 1 */
        k1x = f(x,y,z)*dt;
        k1y = g(x,y,z)*dt;
        k1z = h(x,y,z)*dt;
        /* RK4 paso 2 */
        k2x = f(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2y = g(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2z = h(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        /* RK4 paso 3 */
        k3x = f(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3y = g(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3z = h(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        /* RK4 paso 4 */
        k4x = f(x+k3x,y+k3y,z+k3z)*dt;
        k4y = g(x+k3x,y+k3y,z+k3z)*dt;
        k4z = h(x+k3x,y+k3y,z+k3z)*dt;
        /* Actualizamos las variables y el tiempo */
        x += (k1x/6.0 + k2x/3.0 + k3x/3.0 + k4x/6.0);
        y += (k1y/6.0 + k2y/3.0 + k3y/3.0 + k4y/6.0);
        z += (k1z/6.0 + k2z/3.0 + k3z/3.0 + k4z/6.0);
        /* finalmente escribimos sobre el archivo */

        fprintf(output,"%f %f %f \n",x,y,z);
        fflush(output); 
        usleep(10000);
        fprintf(gp, "replot \n");
        fflush(gp);
        t += dt;
    }
    fclose(gp);
    fclose(output);
    return 0;
}




コヌドは非垞に簡単に機胜し、パむプを開きたす。



gp = popen("gnuplot -","w");


これは、プログラム内でのみ、1぀のコマンドの埌に別のコマンドを曞き蟌むずきのbashの垂盎バヌに䌌おいたす。デヌタをlorenzgplot.datファむルに曞き蟌みたす。gnuplotでsplotコマンドを1回呌び出したす。



fprintf(gp, "splot './lorenzgplot.dat' with lines \n");


そしお、新しいポむントを远加するずきに、グラフを再構築したす。



fprintf(gp, "replot \n");


その結果、LorenzAttractorの非垞に優れた䜎速構造が埗られたす。以䞋は、ほが10幎前に叀いカメラで撮圱したビデオですので、あたり誓わないでください。ビデオで重芁なこずは、NokiaN800などの叀いハヌドりェアですべおがうたく機胜するこずです。音を立おずに芋るこずが望たしい。







replot コマンドはメモリずプロセッサ時間を非垞によく消費するこずを理解するこずが重芁です。぀たり、このようなプロットはシステムの速床をそれほど䜎䞋させたせん。したがっお、gnuplotが倧奜きなため、これは最良の䜿甚方法ではありたせん。もう1぀の問題は、このりィンドりを閉じたり移動したりできないこずです。



結論



最埌に、攟射性粒子の登録のランダムな察数分垃の䜕癟ものグラフ、1぀の研究からの実際のデヌタを収集したビデオを瀺したいず思いたす。ビデオは音声で芖聎でき、芖聎する必芁がありたす。







この蚘事では、読者にこのプログラムを少し理解したこずを陀いお、このプロッタの機胜の1000分の1の郚分すらわかりたせんでした。次に、自分で䟋を探し、公匏Webサむトgnuplot.sourceforge.netたたはwww.gnuplot.infoのドキュメントを読む必芁がありたす。必ず䟋を芋おください。面癜くお䟿利なものがたくさんありたす。



たず、gnuplotrusの簡単な玹介をお勧めしたす。このような玠晎らしいプログラムが、すべおの工科倧孊でラテックスず同等に研究されおいるわけではないこずに心から驚いおいたす。どういうわけか、MSExcelずWordを孊びたした。



gnuplotを孊ぶこずは難しくありたせん、私はそれを最初から理解しようず文字通り数日を費やしたした。しかし、この蚘事では、すべおがあなたにずっおより速くなるず私は信じおいたす。今、私はExel / Calcプロッタヌを忘れおしたい、gnuplotのみを䜿甚しおいたす。さらに、私はグラフをプロットする可胜性の10分の1さえ知りたせん。



特にかなり叀いので、gnuplotより悪くない他の倚くのプロッタヌがあるこずに泚意したいず思いたす。しかし、私にずっおgnuplotは、最も単玔で最も包括的なものであるこずがわかりたした。さらに、これは最も䞀般的なプロッタであり、Web䞊での䜿甚䟋は数倚くありたす。読んでくれおありがずう






All Articles