さて、上記の質問にはいくつかの誤解があります。これにはgnuplot 4.4を使用しています。100x1
まず、「 」の「」array=100x1:100x1
が100行と1列のデータセットを示していると私がどのように考えたかに注意してください-これは1D配列と同じです(インデックスが暗示されています)。しかし、そうではありません。言うことに注意してくださいhelp binary array
:
注: Gnuplot バージョン 4.2 では、 array=(128,128)ではなく、array=128x128 という構文が使用されていました。古い構文は廃止されましたが、
まだ機能する可能性があります [...]
座標は gnuplot によって生成されます。
配列の次元ごとに数値を指定する必要があります。たとえば、
基礎となるサンプリング構造が、
最初の (x) 次元に沿って 10 個のポイントを持つ2 次元array=(10,20)
であることを意味します [..]
したがって、 " 100x1
"が概念的には 1D 配列と同一である可能性がある場合でも、そのように記述するだけで、2D データをgnuplot
(たとえば、イメージ; これは、100 の 1D 配列とは異なる方法でインスタンス化されると予想されます) に指定しました。要素、内部的にgnuplot
)。だから、代わりに「 」と書くべきだったarray=(100):(100)
。原則として 1D では括弧を省略できることに注意してください。そのため、" " も問題ありませんでした。ただし、 (ファイルの最後まで読み取る) を次元としてarray=100:100
使用する場合は除きます。-1
そうしないと、エラーが発生します。
次に、複数のレコードの問題があります。これらの「複数のレコード」への参照はほとんど見つかりませんでしたgnuplot
-バイナリ構文の削減がありました[以前: 長い議論...] (gnuplot.devel) :
ファイル機能ごとに複数のレコードを捨てるのはどうですか。プロットするビッグ データ セットが複数ある場合は、複数のファイルを作成するだけです。
私は、彼らが複数のレコード機能を維持してくれたことをうれしく思いますが、それがよりよく説明されていることを願っています. Gnuplot で見つけた別のコメント、 Plot with sum of dataset :
... gnuplot (つまり 3.6) は、データの組み合わせを単一のレコードにプロットできますが、複数のデータセットはおろか、複数のレコードのデータを組み合わせることはできません。
これらの計算を行うプリプロセッサを作成する必要があります。
はhelp binary array
ちょうど言います:
コロンを使用して、複数のレコードのディメンションを区切ることができます。
たとえば、ファイルarray=25:35
に 2 つの 1 次元レコードがあることを示し
ます。
これにより、 " array=(100):(100)
" を 2 つの (複数の) レコードとして指定すると、これらのレコードにそれぞれusing 0:1
およびusing 0:2
ステートメントで "アクセス" できると思いました (疑似列 0 を使用してデータにインデックスを付けます)。結局のところ、そうではありませんorigin
-複数のレコードの仕様が可能にする唯一の機能は、および/またはパラメーターを介してそれらを制御する機能ですが、単一のプロット内でskip
のみ可能であるように私には思えます。
記録について言えば、以下もあることに注意してくださいhelp binary record
。
array
このキーワードは、同じ構文を持つと同じ機能を果たします。ただし、record
gnuplot は座標情報を生成しません。これは、そのような情報がバイナリ データ ファイルの列の 1 つに含まれている可能性がある場合です。
これはあまりわかりませんが、原則として、を使用している場合、データにインデックスを付けるために疑似列 0 を指定する必要record
があることを意味すると思います。しかし、それを行うべきではありませarray
ん。したがって、次の 2 つのコマンドは同等です。
plot "bin.dat" binary array=(50) format='%uint8' using 1 with lines
plot "bin.dat" binary record=(50) format='%uint8' using 0:1 with lines
... 最初の 50 サンプルを 1 次元データの最初の (そして唯一の) レコードとして取得し、その (唯一の) 列のデータをuint8
- としてフォーマットし、それをプロットします。
ご了承ください
record
just で実行using 1
すると、上記の同等のコマンドと同じ画像が生成されます。
- しかし、で行う
array
と0:1
、質問OPから行が生成されます!
1
のような「列識別子」の背後にある構造をデバッグして、これを何らかの方法で確認する明確な方法がないように見えるのは残念using 1
です。しかし、上記は次のことを意味すると思います:
- では
record
、 は1
1 列 (50x1) のデータセットを表します。したがって、別の 1 列のインデックスと組み合わせることができます。
- では
array
、 は1
実際には 2 列 (50x2) のデータセットを表しており、最初の列はインデックスです。これが、別のインデックス (疑似列 0) と組み合わせると、行が生成される理由です (インデックスの疑似列が最初の列と結合するため)。の列1
。これはインデックスでもあります。つまり、単調に増加する (または減少する) 整数のリストです) 。
次に、format
パラメーターに注意してください-help binary format
状態:
[...] たとえばformat="%uchar%int%float"
、unsigned 文字を最初の using 列に、int を
2 番目の列に、float を 3 番目の列に関連付けます。[...]
さて、これにより、2 つの 1-D 複数レコードを操作したい場合は、次のようなものを使用する必要があると思いました。
plot "bin.dat" binary array=(50):(50) format='%uint8%uint8' using 1 with lines
...生成します:
正弦と重なっている余弦部分が何らかの形で間違っていることはすぐにわかります。しかし、さらに興味深いのは、図がこれらの関数の全周期を 50 サンプルだけで示していることです。明示的にデータを生成したため、サインとコサインの両方が 100 サンプルの周期を持っています! エルゴ、データはどういうわけかリサンプリングされています-そして、問題はformat
.
" array=(50):(50)
" を指定することで、 1-Dである2 つの(複数の) レコードを指定し、それぞれ 1 つの (そして唯一の) 列を持ちます。ただし、" " は2 つのレコードの各列の形式を参照するのではなく、明らかに 2 番目の次元を参照します。2 つのレコードが 1D であることを考えると、レコードから 1 つおきのサンプルを取り除くだけです。format='%uint8%uint8'
gnuplot
したがって、format='%uint8'
プロット コマンドで " " を1 つだけ指定できます。
plot "bin.dat" binary array=(50):(50) format='%uint8' using 1 with lines
...そして、50 個のサンプルで半分のピリオドのみを取得します。
... 予想通り。しかし、それでもレコード間の重複は解決されません。
ここで、複数のレコードは常に 1 つの同じプロットに起因するように見えることを覚えておくことが重要です。オフセットはorigin
パラメータで調整できます。help binary keywords origin
状態:
配列をグラフの別の場所に配置するには、origin
キーワードで
gnuplot に、配列の左下の点を
タプルで指定された点に配置するように指示します。タプルは、 の場合は double でplot
、 の場合は 3 つである必要がありsplot
ます。
したがって、次のようなことができます。
plot "bin.dat" binary array=(50):(50) format='%uint8' origin=(0,0):(50,0) using 1 with lines
... 次のように解釈できます: 2 つの連続する 1D レコードを取得します。ここで、唯一の次元/列はuint8
- としてフォーマットされ、プロット上で最初のレコードを (0,0) だけオフセット/移動し、2 番目のレコードを (50,0) だけオフセット/移動します。 ) (+x 方向に 50 単位) プロット上。2 つのレコードが連結されると予想されますが、実際には次のようになります。
...これで、データの最初の 100 サンプルであると予想されるものを観察できます。
レコードが「同じプロットの一部」であることは、以前に一致した位置から 2 番目のレコードを少し (たとえば、10 ユニット左に) ずらすだけで、より簡単に確認できます。
plot "bin.dat" binary array=(50):(50) format='%uint8' origin=(0,0):(40,0) using 1 with lines
...線でプロット中:
これはもはや関数ではなく、原点のオフセットがどのような影響を与えたかがすぐにわかります。
そうは言っても、データ内のすべてのレコードとそのオフセットを明示的に指定することで、データ全体をプロットできるようになりました。
plot "bin.dat" binary array=(4):(100):(100):(30) format='%uint8' origin=(0,0):(4,0):(104,0):(204,0) using 1 with lines
...予想どおり、連結された4つのレコードを生成します-データセット全体を再作成します:
ノート:
- (読み取りから終了まで)を使用
array=(4):(100):(100):(-1)
すると、同じ画像が生成されます
origin=(0,0):(4,0):(104,0)
の 4 つのレコードで (leave out last) を使用array
すると、最後の 30 バイトが最初から重複します。
- (leave out last) を使用
array=(4):(100):(100)
すると、最後の 30 バイトがプロットから消えます (元のレコードが 3 つまたは 4 つある場合)。
最後に、skip パラメータを見てみましょう。help binary skip
状態:
[...] たとえば、ファイルがデータ領域の開始前に 1024 バイトのヘッダーを含む場合、おそらくplot '<file_name>' binary skip=1024 ...を使用したいと思うでしょう。
これらのコマンドはどちらも次のとおりであるため、これは少し誤解を招く可能性があります。
plot "bin.dat" binary array=(100) format='%uint8' using 1 with lines
plot "bin.dat" binary skip=4 array=(100) format='%uint8' using 1 with lines
... 同じプロットを生成します。
...スキップが表示されない場所。ただしskip=4
、キーワード リストの最後 ( の前using
) に移動すると、コマンドは次のようになります。
plot "bin.dat" binary array=(100) format='%uint8' skip=4 using 1 with lines
...そして生成します:
...実際、スキップが表示されます。
からも注意してくださいhelp binary skip
:
ファイルに複数のレコードがある場合は、それぞれに先行オフセットを指定できます。たとえば、最初のレコードの前に 512 バイト、2 番目と 3 番目のレコードの前に 256 バイトをスキップするには、
plot <file_name> binary record=356:356:356 skip=512:256:256 ...
それを説明しましょう-以下のコマンド:
plot "bin.dat" binary array=(100):(100) format='%uint8' origin=(0,0):(100,0) skip=4 using 1 with lines
... 2 つの 1-D レコードがあります (オフセットに追加origin
する必要があります。そうしないと、レコードが再びオーバーラップします)。スキップは 1 つだけです。これにより、基本的にシーケンス全体が 4 単位左に移動します。
コマンドのように、skip で両方のフィールドに対処する場合:
plot "bin.dat" binary array=(100):(100) format='%uint8' origin=(0,0):(100,0) skip=4:20 using 1 with lines
...出力に気付くことができます:
... 2 番目のレコードが左に 20 単位移動されたことを示します。最後に失われた 20 単位を補うために、次のレコードからの残りのデータ (プロット コマンドでは対処されません)。
ここで、元の質問に戻ることができます - 「サインとコサインのデータを別々の色で単一の図にプロットする」。
その前に、プロットごとに 2 つのデータ「関数」を使用すると、origin
パラメータが実際にプロット上のレコードを移動することが簡単にわかることに注意してください。たとえば、次のコマンドです。
plot "bin.dat" binary array=(100) format='%uint8' origin=(4,0) using 1 with lines, \
"" binary array=(100) format='%uint8' origin=(104,0) using 1 with lines
...結果:
...同じ最初の 100 サンプルのデータが、プロット内の 2 つの異なる場所に (異なる色で) レンダリングされます。
上記のすべての後、データを「解析」して「分割」しようとする-たとえば、「レコード」を使用して-プロットごとに2つのデータ「関数」を使用array=(4):(100):(100):(30)
することはあまり役に立ちません(暗示されているように)別々の色で); 単一のデータ「関数」のみ。
つまり、2 つのデータ関数の場合、次の 1 つの 1D レコードとその長さのみを指定できますarray
。その (唯一の) 列の形式。およびデータごとの「関数」によるオフセットskip
:
plot "bin.dat" binary array=(100) format='%uint8' skip=4 using 1 with lines, \
"" binary array=(100) format='%uint8' skip=104 using 1 with lines
...目的のレンダリングを取得するには:
binary array
最後の注意として -をbinary record
-に置き換えることで、まったく同じ図を得ることができusing 1
ますusing 0:1
。
plot "bin.dat" binary record=(100) format='%uint8' skip=4 using 0:1 with lines, \
"" binary record=(100) format='%uint8' skip=104 using 0:1 with lines
...この特定のケースであっても、using 1
同様に機能します。
さて、これが誰かに役立つことを願っています、
乾杯!