34.1.9 Using

最もよく使われるデータファイルの修飾子は using です。

書式:

     plot 'file' using {<entry> {:<entry> {:<entry> ...}}} {'format'}

もし、フォーマット (format) が指定されれば、C のライブラリ関数 'scanf' を使ってデータファイルの各行をそのフォーマット文字列に従って読み込みま す。そうでなければ、行はスペースまたはタブの所で列に分割されて読み込ま れます。時系列フォーマットデータ (time-format data) の書式はこの方法で は指定できません (代わりに set xdata time を使ってください)。

データは entry の指定に従った列に並び直されます。各 < entry> には、 データを選び出すための単なる列の番号、カッコで囲まれた数式を指定するか、 あるいは何も指定しません。数式中では、最初の列の値を読み込むために $1、 2 番目の列の項目を使うために $2、といった書き方を使用できます。 また、column(x)valid(x) といったものも使うことができます。 ここで、x は結果として整数になる任意の数式です。column(x) は x 番目の データを返します。valid(x) は x 番目のデータが有効な値かをテストします。 列番号の 0 は、各点毎に 0 から始まる番号を表し、それは 2 行の空行が 来たところでリセットされます。列番号の -1 は 0 から始まるデータ行の 番号を意味します。これは 1 行の空行毎に 1 ずつ増加し、2 行の空行が来た ところでリセットされます。列番号の -2 は index を意味します。これは 2 行の空行が来たところで 1 ずつ増加します。< entry> に何も書かなければ その entry のリストの順にデフォルトの値が使われます。例えば using ::4using 1:2:4 と解釈されます。

注: call コマンドも $ を特別な文字として使います。call の引数リスト の中に列番号を含ませる方法の詳細については、以下参照: call (p. [*])

using にただ一つの entry を指定した場合はその < entry> は y の値とし て使われ、データ点の番号が x として使われます。例えば "plot 'file' using 1""plot 'file' using 0:1" と同じ意味です。 using に 2 つの entry を与えた場合、それらは x, y として使われます。 さらに entry を追加すると、それらは x および/または y の誤差に使われま す。誤差情報を使った plot スタイルの詳細については、以下参照:set style (p. [*])。そして、回帰曲線法での誤差情報の使用については、以下参照:fit (p. [*])

'scanf' 関数では色々なデータ形式の数値入力が使えますが、gnuplot は全 ての入力データを倍精度浮動小数とみなしますから、gnuplot では %lf が本質的に唯一の数値入力指定、ということになります。 書式文字列には、少なくとも一つ、そして 7 つ以下の、そのような入力指定子を入れる必要があります。 'scanf' は数と数の間にホワイトスペース - 空白、タブ (" \ t")、改行 (" \ n")、 または改ページ (" \ f") - があると期待します。それ以外の入力は明示的にスキップされるべきです。

" \ t", " \ n", " \ f" を使うときはシングルクォートよりむしろダブルクォートを 使うべきであることに注意してください。

例:

次の例は、1 番目のデータに対する 2 番目と 3 番目の和の値を plot します。 書式文字列は、各列データがスペース区切りでなく、カンマ区切りであること を指示していますが、同じことが set datafile separator "," を指定する ことでも可能です。

     plot 'file' using 1:($2+$3) '%lf,%lf,%lf'

次の例は、より複雑な書式指定でデータをファイル "MyData" から読み込み ます。

     plot 'MyData' using "%*lf%lf%*20[^\n]%lf"

この書式指定の意味は以下の通りです:


     %*lf        数値を無視
     %lf         倍精度浮動小数を読み込む (デフォルトでは x の値)
     %*20[^\n]   20 個の改行以外の文字を無視
     %lf         倍精度浮動小数を読み込む (デフォルトでは y の値)

3 項演算子 ?: を使ってデータをフィルタする一つの芸当を紹介します。


     plot 'file' using 1:($3>10 ? $2 : 1/0)

これは、1 列目のデータに対して、3 列目のデータが 10 以上であるような2 列目のデータを plot します。1/0 は未定義値であり、gnuplot は未定 義の点を無視するので、よって適切でない点は隠されることになります または、あらかじめ定義されている値 NaN を使っても同じことになります。

カッコで始まっていない限りは定数式を列番号として使うことができます。 例えば using 0+(複雑な式) の様なことができます。そして、その数式は、 カッコでスタートしていなければ数式の値が一度評価され、カッコでスタート していれば個々のデータ点を読み込むためにその値が一度評価される、という 点が重要です。

時系列フォーマットデータを使っている場合、その時間のデータは複数の列に 渡らせることができます。その場合、他のデータの開始位置を計算するとき、 時間のデータに空白が含まれていることに注意してください。例えば、データ 行の最初の要素がスペースが埋め込まれた時間データであるならば、y の値は 3 列目の値として指定されるべきです。

plot 'file'plot 'file' using 1:2、そして plot 'file' using ($1):($2) には微妙な違いがあることに注意してくださ い。1) file が 1 列と 2 列のデータを持つ行をそれぞれ含んでいるとする と、データが 1 列のみの行に対しては、最初のものは x の値を作り出し、2 番目のものはその行は無視し、3 番目のものはそれを未定義の値として保存し ます (折れ線で plot している場合 (plot with lines)、その未定義の点を通 過する線を結ばないように)。2) 1 列目に文字列を含んでいるような行がある 場合、最初のものはエラーとして plot を中止しますが、2 番目と 3 番目の ものはその不要な行を読みとばします。

実際、最初に単に


     plot 'file' using 1:2

と指定することで、大抵の場合どんなにゴミのデータを含む行を持つファイル をも plot することが可能になります。しかし、どうしてもデータファイルに 文字列を残しておきたいならば、そのテキスト行の第一列にコメント文字 (#) を置く方がより安全でしょう。

http://www.gnuplot.info/demo/using.html弱々しい using のデモ

gnuplot が configure 時に -enable-datastrings オプションをつけてイン ストールされているなら、さらにデータファイル中のテキストファイルを処理 する using の追加修飾子を使うことができます。以下参照: datastrings (p. [*]),using xticlabels (p. [*]), using title (p. [*])


竹野茂治@新潟工科大学
2008年9月29日