gnuplotのグラフに画像を埋め込む

gnuplot 4.2.2 以降ではバイナリデータをプロットすることができます。この機能を使うと画像をグラフに埋め込むことができます。

gnuplot 4.4以降では下記の方法がうまくいかない場合があるようです。(32ビットのバイナリファイルをプロットしようとすると真っ黒になってしまう)。代わりに4.4以降ではこちらに書いてあるように、PNGやJPG等の画像ファイルをプロットすることが可能ですので試してみてください。

画像ファイルの準備

gnuplotでは現状、bmp、gif、png、jpgなど通常の画像ファイル形式を埋め込むことはできません。これらのファイルをまずはgnuplotが理解できる形に変換する必要があります。以下では一つの例としてImageMagickを用いてrgb形式に変換する方法を説明します。

まずはImageMagickをインストールする必要があります。ImageMagickのフォルダにPathを通した後、埋め込みをしたい画像ファイル(仮にサイズが400×300のfig.bmpとします)のあるフォルダに移動して、コマンドラインから以下のように入力します:

convert fig.bmp -size 400x300 -format rgb -depth 32 -define quantum:format=floating-point fig_400x300x32.rgb

するとfig_400x300x32.rgbというファイルが生成されます。

なお、gnuplotのsystemコマンドを用いて、スクリプトファイル内に以下のように記述しておけば、いちいちコマンドラインを開くことなくrgbファイルを生成してくれます。

system("convert fig.bmp -size 400x300 -format rgb -depth 32 -define quantum:format=floating-point fig_400x300x32.rgb")

画像ファイルの埋め込み

バイナリファイルをプロットするにはplot "ファイル名" binary ...というコマンドを使います。特に画像の埋め込みとしてこの機能を使う場合はwith rgbimageをつける必要があります。詳しくはgnuplotヘルプのbinaryの項目をご覧下さい。

以下に例を示します。

set xrange [0:]
set yrange [0:]
set title "enbedding a figure into a graph"
plot "../img/test_400x300x32.rgb" binary array=400x300 \
     format="%float" flipy using 1:2:3 with rgbimage notitle

この例ではarray=400x300の部分で画像ファイルの大きさを指定しています。また、format="%float"は画像ファイルのフォーマットを指定しています。上の例では32bitのrgbファイルを使っていますが、よりピクセルあたりのビットサイズの小さいrgbファイルを使う場合はformat="%uchar"format="%int"としなければなりません。

このスクリプトを実行すると、以下のようなグラフが生成されます。グラフの中に画像が埋め込まれていることがわかります。当然この上に通常のグラフを書くこともできますし、またTerminalを変えてPost ScriptやPNG形式で出力することもできます。

画像ファイルの拡大・縮小・移動・回転など

画像ファイルはデフォルトではgraph座標系の原点(0,0)に画像の左下隅がきて、画像のサイズと同じだけgraph座標上を占めます。これでは、別のグラフと重ね合わせるときに不便です。画像ファイルのサイズや位置を変えるキーワードとして、以下のようなものが用意されています。

dx=** dy=**
画像の1ピクセルをgraph座標のどれだけの距離と対応させるかを指定します。
origin=(**,**)
画像の原点(左下隅)を移動します。
center=(**,**)
画像の中心が(**,**)に来るように移動します。
rotate=**
画像をoriginまたはcenterを中心にして回転します。

以下は例です。240×180ピクセルのfrog.bmpを用いています。

# 画像形式の変換
system("convert frog.bmp -size 240x180 -format rgb -depth 32 -define quantum:format=floating-point frog_32bit_240x180.rgb")

set size ratio 0.75
set xrange [0:24]
set yrange [-9:9]
set samples 1000
plot "frog_32bit_240x180.rgb" binary array=240x180 format="%float" flipy\
      dx=0.1 dy=0.1 origin=(0,-9)  using 1:2:3 with rgbimage notitle,\
     (x<12 ? 1/0 : 0.5+sin(x*5)*((x-12.0)/5)**2) \
     with l lw 3 lt 1 lc rgb "blue" title "loud voice!"

このスクリプトの実行結果は以下のようになります。今度は画像が[0:24][-9:9]の範囲に納まっています。