GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/16

図を描いたその後は...(その2)

1 | 2 | 3

グラフをPNG等のイメージに変換したい.

gnuplotが直接生成することができるイメージのフォーマットは,ppmと png です.また,gnuplot3.7からは直接GIFを出力することが可能になりまし た.しかしgnuplotが作るGIFは,LZWの特許の関係か,圧縮されていないよう です.また,gnuplot3.8からはGIFはサポートされていません.GIFで出力する 目的の多くは,結果をWeb に載せることではないでしょうか.それなら,GIF を使うのを止めてPNG(Portable Network Graphics)形式で出力することを推奨 します.最近のWebブラウザはPNGをサポートしていますし,ファイルの圧縮率 も大きいのでネットワークへの負担も小さくなります.

任意のフォーマットに変換する方法は沢山ありますが, 主だったものを挙げると...

  • X11の画面に表示したものをxwdでファイルにダンプし,それを xvやImageMagick, Gimpで変換する.
  • ppmで出力しておき,ImageMagickやxv,pbmplus, netpbmで変換する.
  • PostScriptで出力し,GhostScriptで変換する(gsがサポートしている フォーマットのみ).
  • PostScriptで出力し,それをGhostScriptで画面表示したものをxwdで ファイルにダンプし,それをxvやImageMagickで変換する.

等があります.自動的に変換するならppmで作っておいてppmtoXXXで変換するのが 便利でしょう.簡単なのは,Xの画面をxwdでダンプする方法でしょう.

まずgnuplotで何かを画面に表示します.別のターミナルを使うか, gnuplotのshellコマンドでshellを起動し,xwdで図を表示しているウィンドウ をダンプします.

gnuplot> set yrange [-6:6]
gnuplot> set hidden3d
gnuplot> set isosample 40
gnuplot> splot x*sin(y)
gnuplot> shell
% xwd > screen.xwd
% exit
exit

gnuplot>

このscreen.xwdをxvやgimp, Imagemagickのdisplayコマンドで読み込み,他 の画像フォーマットで保存します.あるいはnetpbmを使って

% xwdtopnm < screen.xwd | ppmtopng > screen.png

でも変換できます.次の図は,ダンプした画面をPNGに変換したものです.

fig/sample8.3b

GhostScriptで変換するには,使っているgsがどのイメージフォーマットを サポートしているかを調べる必要があります.これには, -helpのオプション付きでgsを起動します.

% gs -help
GNU Ghostscript 5.10 (1998-12-17)
Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA.  All rights reserved.
Usage: gs [switches] [file1.ps file2.ps ...]
Most frequently used switches: (you can use # in place of =)
-dNOPAUSE           no pause after page   | -q       `quiet', fewer messages
-g<width>x<height>  page size in pixels   | -r<res>  pixels/inch resolution
-sDEVICE=<devname>  select device         | -dBATCH  exit after last file
-sOutputFile=<file> select output file: - for stdout, |command for pipe,
embed %d or %ld for page #
Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PDF
Available devices:
x11 x11alpha x11cmyk x11gray2 x11mono ml600 npdl epag escpage lbp310
lbp320 lips2p lips3 lips4 lips4c lips4v lips4vc fmpr mjc180 mjc360 mjc720
mj500c pr150 jj100 bj10v bj10vh md5000 dmprt deskjet djet500 laserjet
.....

ここでは,gsを使ってjpegに変換する方法を説明します.まずgnuplotで EPSの図を作っておきます.このEPSファイルをgsで変換します.

% gs -dNOPAUSE -sDEVICE=jpeg -sOutputFile=test.jpg -q
-dBATCH -g500x350 test.eps

上の例では行を折り返していますが,実際は一つの行です. -sOutputFile で出力ファイル名を指定します. -sOutputFile=- とすると標準出力になります.-gでイ メージファイルのピクセル数をしていますが,ここの数値はgnuplotのEPS で書き出したときに,図が大体収まる大きさを適当に与えているものです. 図によってははみ出したり余白が大きくなりすぎたりするかもしれません.

ここではjpegに変換してみましたが,図のプロットの様にコントラストが強 く境界線がはっきりしたイメージに対しては,jpegは向いていません.イ メージデータにするなら,やはりGIFやPNGが無難です.

fig/sample8.3c
gnuplotで作ったEPSをgvで表示
fig/sample8.3d
gsを使ってjpegに変換
up