gnuplot + bash + Avidemuxを使用したアニメーショングラフィックス

科学会議でのプレゼンテーションのほぼ不可欠な部分はグラフィックです。 ある時点でいくつかの依存関係のグラフを見るだけでなく、この依存関係が時間とともにどのように変化するかを見るのも興味深いことがあります。 これは、多数のグラフを作成し、それらからビデオを収集することで非常に明確に表示できます。 これを行う方法のオプションの1つについて、私の投稿になります。



美しいグラフィックは多くのプログラムで作成できます:独自のGrapherとOrigin、無料のgnuplot、QtiPlot、Veuszなど。 最も人気のあるグラフ作成プログラムには、脳に負担をかけずに出版品質のグラフをすばやく作成できるインタラクティブなグラフィカルインターフェイスがあります。 しかし、今度は別のタスクがあります-多くの写真に同じ種類のグラフィックをスタンプする必要があります。 手動で各チャートを編集するのはありがたい仕事なので、魅力的なOriginではなく、説明のないgnuplotを使用します。 その強みは、事前に決められたシナリオに従ってチャートを作成できることです(つまり、gnuplotには独自のスクリプト言語があります)。 次に、簡単なスクリプトを使用して、必要な量のグラフィックをすばやく描画する方法を示します。



gnuplotのインストール



Windowsユーザーの場合。 プロジェクトのウェブサイトにアクセスします。 そこで、「ダウンロード」をクリックして、ダウンロードに適切なオプションを選択します。 その後、通常どおりインストールします。

Linuxoidの場合。 お気に入りのパッケージマネージャーを使用してパッケージをインストールします。 Ubuntu Lucidユーザーには、 このPPAをお勧めします -新しいバージョンには追加の特典があります。



例1.スケジュールの変更



ガラス状態への移行時に液体のペア相関関数がどのように変化するかのアニメーションを作成しましょう。 初期データは、さまざまな時点でのペア相関関数の値を含むファイルです。 次のようになります。

0 100 1 0.0284366 0 2 0.0853097 0 ... 99 5.60201 1.0403 100 5.65888 1.01337 1000 100 1 0.0284366 0 2 0.0853097 0 ...
      
      





最初の行は、時点とポイント数Nです。 次に、フォーマットにN行があります

  _X _Y
      
      





その後、2つの改行が繰り返されます。 ブロック間の改行は重要です-gnuplotは複数の改行で区切られたブロックを異なるものとして扱います。 したがって、1つのブロックのみに一致するグラフを作成できます。



gnuplotを実行します-プログラムのコマンドインターフェースに移動します。 募集します

 plot "rdf.txt" using 2:3 with lines
      
      





これはどういう意味ですか? plot-チャートをプロットするコマンド。 「Rdf.txt」-データの読み取り元ファイルへのパス。 2を使用すると、 3は「列2をX値、列3をY値として使用する」ことを意味します。 with lines-データポイントを結ぶ線のみをグラフに表示するように要求します。



このコマンドの結果は次のようになります。



ご覧のとおり、ファイルに含まれるすべてのグラフが描画されます。 一部のポイントのみでグラフを描くには、 indexキーワードを使用します 。 たとえば、最初の100行のデータのみを使用してグラフを作成します。

 plot "rdf.txt" index 0 using 2:3 linewidth 5 with lines
      
      





ここで、線幅5は、線が通常より太くなることを示しています。 結果:



このタイプのスケジュールが私たちに適していると仮定します。 次に、入力ファイル内のすべてのレコードを実行し、それらすべてのグラフを作成して、画像にエクスポートする必要があります。 いくつかのbashスクリプトを使用してこれを行いました。 実際、組み込みのgnuplotツールを使用して取得できます(Unixにバインドしないため、より優れています)。 スクリプトをanimator.gpanimate.gpにします。 animator.gpで 、チャートとターミナルを構成します。

 #!/usr/bin/gnuplot set xrange [2:5.66] #   X set yrange [0:4.5] #   Y set palette model RGB defined (0 "green", 0.5 "blue", 1 "dark-violet") unset colorbox set terminal png font "Droid, 14" size 750,750 set key off set size square iterations=100 #   iterator=0 offset=0.0 load "animate.gp"
      
      





animate.gpでは、実際に写真の生成を行います。

 iterator=iterator+1 offset=iterator/(iterations+1.0) #1.0 ,      float if (offset <= 1.0)\ set output "figures/".iterator.".png";\ plot "./rdf.txt" index iterator using 2:3 smooth csplines linewidth 5 linecolor palette frac offset;\ reread
      
      





グラフの色を徐々に変えたいので、パレットを緑から紫に設定しました。 オプションは、 カラーボックスの設定を解除しキーをオフに設定します -チャートへのパレットと凡例の出力を無効にします。



これらのスクリプトの主なコマンドは次のとおりです。

 set terminal png font "Droid, 14" size 750,750 set output "figures/".iterator.".png"
      
      





1つ目は、グラフを750x750のサイズとDroidフォントのpngにエクスポートすることです。2つ目は、 プロットコマンドが指定されたときにファイル名を設定します。 2番目のコマンドでは、gnuplotが文字列と整数(「フロート」ではない)を「連結」できるという事実を利用しました。



2番目のスクリプトのifコマンドは、条件が満たされたときに次のコマンドを実行します(if-a本体のすべてのコマンドは同じ行にあり、セミコロンで区切られている必要があることに注意してください)。 rereadコマンドは、スクリプト全体を最初から読み取ります。つまり、 一種のサイクルが判明します。

スクリプトは、 animator.gpファイルを実行する権限を追加するだけで、その後の起動(Unixで)またはコマンドによって実行されます。

 load "animator.gp"
      
      





gnuplotコマンドライン(すべてのOS)。

スクリプトを実行すると、figuresフォルダーに多くの画像があります:1.png、2.pngなど。 それらから、アニメーションを収集することはすでに可能です。 これは無料のAvidemuxビデオエディターで行いました。



アニメーションの収集は簡単です。 エディターを開き、「開く」をクリックして、シーケンスの最初の画像(私の場合は「1.png」)を選択します-完了し、アニメーションが読み込まれます。 [再生]をクリックして、すべてが正常であることを確認できます。 次に、必要な形式でアニメーションを保存します。 私の結果は次のとおりです。





例2.図面にグラフを重ねる



もっと難しいタスクは同じことをすることですが、背景は白ではなく、写真である必要があり、それでもアニメーション化する必要があります。 分子動力学(MD)の結果に応じて、2相システムの毛細管の変動を視覚化する必要があるときに、このようなニーズがありました。 原則として、例えば、サイクロンの境界を地図上に重ね合わせることができ、ノズルのビデオである種の速度場を視覚化することができますが、それ以外のことはわかりません。 それでは、始めましょう。



4.4以上のgnuplotバージョンが必要です(Ubuntuユーザーは10.04以降のバージョンのリポジトリを持っています。10.04の場合、指定されたPPAからダウンロードしてください)。 実際、このバージョンでは、gnuplotはアルファチャネル付きのpngファイルをチャートにロードできます。 png形式のMDセルのスナップショットを含む約1,000個のファイルと、インターフェイスの座標を含む同数のファイルがありました。 animator.gpはほぼ同じままです。

 #!/usr/bin/gnuplot set xrange [0:242.4] set yrange [0:242.4] set xtics 0 242.4 # ,      #       set ytics 0 242.4 set terminal png font "Droid, 14" size 750,750 set key off set size square iterations=100 #   iterator=0 load "animate.gp"
      
      





animate.gpで 、pngファイルから画像のロードを追加します。

 iterator=iterator+1 if (iterator <= iterations)\ plot "pic_".iterator.".png" binary filetype=png dx=0.327567568 dy=0.327567568 format='%uchar' using 1:2:3:(160) with rgbalpha;\ #    replot "../surf_z/surface.".iterator.".cfg" using 2:3 smooth csplines linewidth 5;\ #replot       #smooth csplines -    ,   set output iterator.".png";\ replot;\ reread
      
      





PNGは次の形式のコマンドによってロードされます

 plot "pic.png" binary filetype=png dx=0.327567568 dy=0.327567568 format='%uchar' using 1:2:3:(160) with rgbalpha
      
      





with rgbalphaオプションでは、グラフに4つの「軸」が必要です(チャンネルR、G、B、アルファ、奇妙なことに十分)。 背景画像にアルファチャンネルがなく、値を(160)に設定しただけです。 透明度の値は、科学グラフの方法によって選択されたため、オーバーレイされたグラフが表示され、背景が薄すぎることはありませんでした。



前回と同じ方法で開始し、同じAvidemuxによって画像が生成され、ビデオに収集されます。 結果は次のとおりです。





もちろん、軸、凡例などの美しい署名をグラフに追加できます。 これを行うには、いくつかのコマンドをスクリプトに追加する必要があります。 興味のある方には、以下の情報源をお勧めします:

  1. 公式gnuplotガイド
  2. 本「Gnuplot in Action」-gnuplotで利用できるあらゆる種類のトリックを説明しています。
  3. DebianのNotesブログ -gnuplotなどについて。


注:Origin、QtiPlot、および場合によっては他のグラフィックエディターにも独自のスクリプト言語があります。 しかし、著者は、gnuplotへの強いコミットメントのため、それらを学ぶことを気にせず、彼が知っていることについて書いています。

UPD: bashではなくgnuplotを使用して反復。 情報を提供してくれたzelibobaに感謝します。



All Articles