November 20, 2010

Matlabが出力したepsを編集して一部の線を破線にする

Matlabをグラフの出力として使うことがありますが、そのグラフをちょっとばかり編集したいということがあります。特に今回は、図が白黒でしか出せないために、図の線の一部を破線にしたいという事態に見舞われました。このようなときには、そのグラフを出力するための元になったmスクリプト、あるいはfigファイルを探して編集して再出力するのが王道だと思いますが、探すのが面倒くさいです。
そこでMatlabが吐いたepsを直接編集して、破線に変えることにしました。もちろんイラストレータなんぞは使いません。epsをテキスト編集をするのでメモ帳でも可能です。

肝心のやり方ですが、まずは以下のコードを%%EndSetupの直前に挿入します。

/dpi2point 12 def
/bdef {bind def} bind def
/SO { [] 0 setdash } bdef %solid
/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef %dotted
/DA { [6 dpi2point mul] 0 setdash } bdef %dashed
/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4 dpi2point mul] 0 setdash } bdef %dotdash

そして、数字が羅列していてSで終わる部分が実際に線を引いているところなので、対象となる線の部分をみつけて、直前にDO(破線)やDA(ダッシュ)、DD(ダッシュ破線)をいれ、その直後にSO(元の直線)をいれると完成です。たとえば、以下のコードのようにするとダッシュになります。

% 修正前
/DeviceRGB {} CS
[0 0 1] SC
11843.6 7528.4 m
12137.6 7528.4 l
S

% 修正後
/DeviceRGB {} CS
[0 0 1] SC
DA
11843.6 7528.4 m
12137.6 7528.4 l
S
SO

Sが線を引け、という命令です。その前の数字は線の座標を指定しています。そしてDeviceRGBや[0 0 1](この場合は青)の表記が、色を指定している部分です。こういったものをもとに検索にすれば、対象とする線が比較的簡単に見つかると思います。そしてダッシュや破線の線間隔の調整には、はじめに指定したdpi2pointの値を12から変化させることでできます。

なお、このようなことができるのはMatlabが吐くepsのほとんどが人間に可読な形で『どこに線を書け、色を変えろ』等の命令でできているためです。epsのベースとなったpost scriptはそれこそスタック『言語』なわけですから、可読である以上、気合を入れれば脳内デバックが可能です。

なおgnuplotが吐いたepsでのやり方は、普段僕が大変お世話になっている『Gnuplot not so Frequently Asked Questionst』『図を描いたその後は...(その3) 』を参考にするとできそうです。

00:04 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/776
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。