卒研の学生さんが,
「figure
をepsc
でsaveas
してるのにビットマップで描画されるんですけど…」
とトラブっていたののシューティングに関与したので,共有のため記事を書きます.
どういうときにトラブるのか
学生が使っていたのは contourf
関数でしたが,公式のサンプルプログラムにsaveas
でsvg
やpdf
で書き出すときちんとベクター系になってくれます.
学生さんにやってもらっていたのは$200\times 300$くらいの行列のデータで,そのまま出力するとトラブってしまいました.
違いがあるとすればデータ形式やサイズです.「ひょっとしてデータのサイズが関係あるのかな?」 と推測して,こんなコードを書いてみました.
for k=1:40
N=ceil(1.6^k)
if N>1e6
break;
end
X=randn(N,1);
Y=randn(N,1);
figure;
plot(X,Y)
saveas(gca,['sample_' num2str(N,'%07d')],'svg')
end
$N$点をランダムで発生させてplot
してsvg
形式で保存します.データ点数が関係あるのでは?という予測です.
点数とファイルサイズの関係を図示してみました.$N$は上のコードに書いた値以外もたくさん試しています.
$10^2$あたりまではほぼ一定(多分ファイル形式の固定部分),それ以降$10^5$までは点数とともにファイルサイズが大きくなっていますが,$10^5$を超えるとファイルサイズが小さくなりました.ファイルを確認すると,$N>10^5$ではsvg
で保存していますが中身はビットマップ(`png'かな?)になっています.拡大するとにじむ,
saveas
が内部的にファイルサイズや処理のコストを考慮して判定しているのかな,と想像しますが公式サイトなどでは説明が見つけられませんでした.記述があったら教えてください.
(追記)Figureのプロパティでレンダラを指定できました.
コメントをいただきFigure
のオプションを確認したところ,レンダラを明示することができるようでした.
f=figure(1);
f.RendererMode='manual';
f.Renderer='painters';
上記コードでレンダラを明示したところ,どうやら大きな$N$に対してもベクター系で描画できるようです.
「ようです」というのは,大きな$N$で作成したsvg
ファイルは開くのに非常に時間がかかり,すべてを確認できていないからです.保存時間も数分~数十分かかり,実用的ではありません.
公式の関数の出来栄えの良さに感心しております.