グラフ描画ツールについての考察

初版   1999.2.16
大幅更新 2000.11.17
最終更新 2006.3.13

(注意) 2010.3
この記事は現在の状況をサポートしていません。古くなっている箇所が 多数あると思われます。

 

1. はじめに

工学や理学では大抵の場合、結果をグラフで表示します。 だから、グラフ描画ツールというのは研究において一番重要なツールです。 現在、研究のプラットフォームとしては Windows と Unix の 2 つが主要なプラットフォームであると思われます。 事務処理においては Windows 全盛の世の中ですが、 研究用としては Unix の方が ふさわしい場合が多いと思います。Unix では 1 台のマシンに 複数の人間が同時に login できるので、 資源を有効に活用することが出来ます。 Linux や FreeBSD などの PC-Unix の急速な普及もあり、 大抵の大学の数値計算関係の研究室では PC-Unix で研究をしている所が 多いと思います。従って、ここでは Unix 上における フリーのツールについて話を進めていきます。
( Windows 上のツールは「窓の杜」や「ベクターデザイン」に 行けば、沢山のツールがあります。また、Unix 上の 有料のツールとしては Mathematica や Matlab のグラフ 描画機能を使う方法が有力だと思われます )

2. Unix でのグラフ描画における問題

Windows では図形や文字を描画するのに描画オブジェクトに 対して描画命令を出します。描画オブジェクトが「ウィンドウ」の 場合は画面に描画し、描画オブジェクトが「ファイル」の場合は ファイルに出力します。たぶん「プリンタ」に出力する のも同じでしょう。つまり、「画面に書く」「ファイルに書く」 「プリンタに書く」のを同一のコードで実現できます。

描画先をファイルに設定した場合に 生成されるファイルが Windows Metafile です。つまり、 Windows Metafile は GDI 関数の種類と引数を記録した ものです。Windows Metafile をクリップボード へ貼り込むことにより、他のアプリケーションで取り込む ことができます。また、プリンターへの出力は、プリンタドライバ が各プリンタの差を吸収してくれるので、如何なる種類の プリンタからも出力することができます。

文字の描画に関しては、Windows は OS としてフォントを サポートしており、そのフォントはアウトラインフォント である TrueType ですから、 美しい文字出力が得られます。Windows は OS として 図形の描画をサポートしています。

それに対して、Unix は描画の環境については 全く絶望的な状況です。 Unix が開発された時代はタイプライタ 端末の時代なので、Unix は OS として 描画機能をサポートしていません。 ゆえに、「画面に書く」 「プリンターに出す」「他のソフトに取り込める形式で書く」 の 3 つの描画が共通に出来ません。Unix が開発された時代は、 CPU パワーをはじめとしてあらゆるデバイスが貧弱だったので、 WYSIWYG は夢の話でした。また、画面に出すこととプリンターに出す ことは全く別のこととして認識されていたようです。

Unix においては、図をディスプレイに描画したい ときは X-Window の API をコールします。

プリンターに関しては、Unix では PostScript プリ ンター ( 以下 PS と略 ) が事実上の標準となっています。 TeX に取り込みが可能なのは PostScript 形式だけですし、 その他のプリンターから出力する時は、PS ファイルを ghostscript に よって各プリンタの形式に変換するのが慣例なので、 プリンターからの出力は Postscript だけをサポートすれば よろしい。

まとめると、Unix では画面に描画する時は X Window の API を コールし、プリンターに出すときには PostScript ファイルを 作成する必要があります。 そして、X-Window の API と PostScript 言語は、水と油のように、 全く異なる世界です。 おまけに、X-Window に描画する時は X 付属のフォントを 使い、PS プリンターから出力する時は PS プリンターの 内蔵フォントを使います。そして、X と PS がサポートしている フォントが同一とは限りません。さらに、 PS プリンター内蔵のフォントの情報はプリンター外からは 見えません。

日本語は全ての文字が等幅なので、別のフォントで代替しても 原則としてレイアウトは崩れませんが、 欧文フォントは各文字の 横幅が異なります。だから、X-Window と PS プリンタでの文字の 見栄えを同じにするには、X と PS で各文字の横幅が同じフォント を使う必要があります。X と PS の両方に Helvetica , Century などの フォントがありますが、フォントの横幅情報を得ると、 X のフォントはドット単位で得られるのに対して PS プリンター のフォントの横幅は有効数字 3 桁で得られます。 つまり、X と PS のフォントは異なると言えます。

余談ですが、2001.3 の時点で XFree86 に付属する スケーラブルフォントな欧文フォントは Courier のみ であり、Helvetica などの他のフォントは bitmap しか付属して いません。スケーラブルな Helvetica を使うには plotutils-2.2 など に付属して付いてくる PS クローンのスケーラブルフォントを インストールする必要があります。

PostScript フォントをサポートする ツールの多くは、何らかの方法で PostScript フォントの各文字の 横幅情報をプリンター外へ取り出し、その情報を ツール自身が定数として保持しています。 そうでないと、文字列をセンタリングしたり TeX で取り込む時に 必要となる BoundingBox を設定することが出来ません。

このように、X と Postscript はフォントが共通でない上に、 Postscript のフォント情報はプリンター外から見えないので、 文字を扱う時には多大な苦労が必要です。

次に、作成した図を Tgif や idraw などの CAD ソフトで 取り込んで編集したい場合、 Unix では Windows メタファイルのような 共通の形式がないので、 それぞれの CAD ソフトの独自形式に変換する コンバータを個別に作る必要があります。

最近では、学会発表などのプレゼンテーションでは PowerPoint の シェアが圧倒的です。いずれ、プロジェクターが一般的になると、 PowerPoint を使わざるを得なくなるでしょう。 ゆえに、今後は、Unix 上のツールと言えども、 作成した図をベクトルデータである Windows Metafile 形式で PowerPoint に取り込める機能が必須となるでしょう。

フリーのツールである pstoedit ( pstoedit_win.zip という名前でネットワークのどこかに あるでしょう ) を使うと、原理的に PS ファイルを Windows Metafile に変換することが可能です。 ここ に詳細を述べてあります。 ただし、日本語が通らなかったり、いくつか難点があります。

「プリンターに出す」「 X-Window に描画する」「他の CAD ソフトで 編集できる形式に変換する」を満足するために、 Unix のグラフツールは「 Windows Metafile に相当する 図形を表す中間ファイルを独自形式で保持する」という ツールが多いようです。

以上のように、Unix は OS として描画情報を管理する機能を 持っていません。特にフォントを OS 自身が持っていないのが 致命的です。だから、Unix 上で図形を描画するソフトを作成するのは 原理的に非常に困難な世界です。

何と言ってもフォントの管理が一番の問題なので、 フォントの観点から Unix 上のグラフツールを 3 つに分けると以下のようになります。

  1. フォントをグラフライブラリ自体が保持する

    元々汎用機で動いていたツールはこの方式が多いようです。 このタイプのツールは、例外なく hershey font というフリーの フォントを使っています。hershey font はストロークフォント ( 線で 表したフォント ) なので、 TrueType のようなアウトラインフォントに比べると かなり見劣りがしてしまいます。また、ストロークフォントは拡大しても 線の幅が変わらないという欠点もあります。 今となっては、ストロークフォントを使うツールが作成する 図はかなり見劣りがしたものになってしまいます。

    このグループに属するツールはスケーラブルフォントを持たない テクトロニクス端末にも表示できるメリットがありますが、 今となってはテクトロニクス端末は時代の遺物でしょう。

    理論的には TrueType フォントをインストールして VFlib ( 広島大学の角川裕次さん製作のライブラリ ) を使えば アウトラインフォントを自分で管理することが出来るようです。X への表示も プリンターからの出力も TrueType フォントを使えます。しかし、 プログラミングが繁雑になるためか、この方式のツールは まだ無いようです。また、この方式のツールでは文字は 塗りつぶし図形として表現されますので、作成した図を Tgif や idraw で再編集して文字を付加した場合、 Tgif や idraw で付加した文字は PS フォントを使うので、 文字のバランスが悪くなると思われます。

  2. X に表示する時は X 付属のフォント、PostScript プリンターから 印刷する時は PS プリンター内蔵フォントを使用する

    X-Window と PS プリンターのどちらにも Helvetica, Courier という PostScript フォントがあるので、これらのフォントを使います。 このタイプのツールの多くは PS Printer 内蔵フォントの横幅情報を ツール自身が保持しています。 X-Window にスケーラブルフォントがインストールされていない場合、 X-Window における見かけはプリンターから印刷されるもの とは若干異なる可能性があります。

  3. 出力先としては PostScript だけをサポートし、X への 表示は ghostscript、他の CAD ソフトで編集可能な 形式への変換は pstoedit を使う

    この方式は X への表示のレスポンスが悪くなってしまうので、 CPU が Pentium 200 MHz 以下の時代は快適ではありませんでしたが、 CPU のクロックが最低でも 1 GHz という今では有力な方式かも知れません。 この方法は、作成した図を Windows に持ってくるのが難しいという 欠点があります。pstoedit には色々と難点があり、日本語が 使えません。

以上のように、Unix 上でのグラフ描画ソフトの 開発は Windows に比べて大変に厄介です。

解決の糸口として、2000.10 頃に W3C で決まった SVG ( scalable vector graphics ) というフォーマットがあります。 こちら の SVG の項で分かりやすく解説されています。 Web ブラウザで表示するベクトル図形データ の標準規格だそうです。すでに、Illustrator 9.0 は SVG 形式 での出力に対応しています。XML 形式で書かれており、 少し見たところ、作成するのは容易そうですが、読み込んで理解 するのは難しそうです。SVG ファイルの X-Window での ビューワと Postscript 形式へのコンバータが開発されたら、 グラフは SVG 形式で出力するのが良いのかも知れません。 SVG のビューワは Adobe で配布されており、2003.3 の時点では Win98-XP 版と Mac 8.6-9.1 版しか用意されていません。

3. 研究に必要なグラフとは

誰もがやったことが無いことを行うのが研究ですから、研究でグラフを 書く場合、独自のグラフを書くことが多いと思います。だから、gnuplot の ような汎用ツールではかゆい所に手が届かない場合もあります。

グラフを書くためのツールをプリミティブな度合という観点で分類すると、 次のようになるでしょう。

  1. 線を書く、文字を書くという基本機能のみをサポートする
  2. 上に加えて、座標軸を書く、等高線を書くなどの機能をサポートする
  3. gnuplot のように、データや命令を用意すれば、グラフ描画用のインタープリタとして動作する

順番に解説して行きましょう。なお、以下の情報は 1999.2 頃の 調査結果に若干の修正を加えたものであり、誤っている可能性が あります。

3.1 線を書く、文字を書くという基本機能のみをサポートするツール

3.1.1 PostScript ファイルを直接書く

PostScript ファイルを直接書くというのが一番原始的な方法です。 moveto lineto setlinewidth stroke closepath showpage fill setgray を 知っていれば塗りつぶしを含む線画は書くことが出来ます。 文字を書く場合は、 それに加えて findfont setfont scalefont show を 覚えれば良いです。ですから、直接 PS ファイルを書くことはそんなに 難しいことではありません。 ここで簡単な解説をしています。 PS ファイルを書くことに関しては アスキー出版局から出ている 「PostScript チュートリアル & クックブック」( 通称 青本 ) が非常に分かりやすくお奨めです。また、PostScript を本気で扱う場合、 結局「PostScript リファレンスマニュアル」( 通称 赤本 ) が 必要になるようです。 Web 上では以下のページが非常に有用です。
ftp://ftp.kek.jp/kek/unix4hep/chap13.txt
3.1.2 C や Fortran からコールして使うツール

3.1.3 邪道なやり方?

3.2 座標軸を書いたり等高線を書いたりする機能を持つライブラリ

3.1 節での方法では、座標軸を書いて数値を付けるのも自力でする必要があります。 この手間を省くため、座標軸を書いたりする汎用的な機能を持つ ライブラリがあります。たとえば、

    call setlinewidth(4)
    call draw_axis(xorg,yorg,xlength,ylength,xmin,xmax,ymin,ymax)
    call draw_line(xarray,yarray,n)
のような感じで、サブルーチンを次々に呼ぶことにより、 グラフを書くことが出来ます。 この形式のライブラリとしては私が調べたところ次のようなものがあります。

3.3 データを用意し、グラフ描画用インタープリターを呼ぶ方法

データを用意して、グラフ描画用のアプリケーションを使って 図を書く方法があります。以下のようなツールがあるようです。 ここでのツールは全て出力フォントとしてはアウトラインフォントを サポートしています。

以下のツールは私は使ったことがないので、誤っている可能性があります。

4. グラフ描画ツールを紹介しているページ

東京電機大学の松田七美男さんは gnuplot に関する国内随一のサイト を開いておられ、Linux Japan(今は休刊) という雑誌での連載記事などでも有名な方ですが、松田さんのサイトの中に データの可視化と解析ツール というページがあります。 このページで多数のグラフ描画ツールの描画結果を画像で比較することが 出来ます。このページは全く素晴らしい。

以下のページは興味深い情報を提供しています。

また、 Linux 上で動く科学技術計算のアプリケーションのページ というページもあります。このサイトには科学技術計算 のためのあらゆるアプリケーションが集められているようです。 英語のページであり、そこで紹介されているソフトも全て 海外製のものなのでかなり敷居が高いですが、そこを見ると、 グラフ作成のためのアプリケーションは 100 個以上も並べられています。 一つづつ試すのは不可能に近いので、ソフト名をキーワードにして google や Infoseek で使い方を紹介した日本語のページを探すことにより 選択の参考とすると良いでしょう。

5. おわりに

グラフィックツールとして何が優れているか? というのは難しい 質問です。私が思うに、特殊なグラフを書くためにはどうしても ソースファイルレベルでのカスタマイズなどが必要となることが多い ように思えます。こうなると「内容を把握したものが一番良い」という ことになります。つまり、「最小限の機能がコンパクトに実装 されている」ものが優れたツールだと思います。 だから、私は自作の calcomp ライブラリと xygraph , nsgraph を 使っています。「内容を把握しやすい」という点から考えると あまり大規模なパッケージは使いにくいかも知れません。

ここで紹介したものは、無料かつソースファイルも公開されています。 Unix の世界ではこのように数々の優れたツールがソースファイルつきで 公開されています。ソースファイルが公開されている ので、自分専用に改造することも出来ます。それに比べて、Windows の 世界は「窓の杜」を見る限りバイナリのみしか 公開されておらず、 Sma4Win などのように過半数がシェアウェアです。 Unix の世界では今でも「ソースを公開する」という良い伝統が 受け継がれているようです。

私が卒業した同志社大学は理学部がありません。 今勤めている大阪府立大学も理学部がありません。 ですから、私にとって理学部はかなり遠い存在で工学部は身近な 存在でした。グラフを書くツール → コンピューター → 情報工学 or 電子工学 と いう連想により、私はほとんどのグラフ描画ツール類は工学部の人々が 作っているのだと思っていました。ところが、実際は ほとんどが理学部の人の手によるもので、特に東大の理学部の人々は 広範囲な貢献をしていました。これは私にとって新しい世界を 覗いたような非常な驚きでした。

なお、人名は google や Infoseek での検索を考えて、出来るだけ 姓名全てを載せるようにしています。また、敬称は大学の先生で あっても「さん」で統一しました。