9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MATLABでベクター系で書き出してほしいのにビットマップ系になってしまう問題.

Last updated at Posted at 2022-01-31

卒研の学生さんが,
figureepscsaveasしてるのにビットマップで描画されるんですけど…」
とトラブっていたののシューティングに関与したので,共有のため記事を書きます.

どういうときにトラブるのか

学生が使っていたのは contourf 関数でしたが,公式のサンプルプログラムにsaveassvgpdfで書き出すときちんとベクター系になってくれます.

学生さんにやってもらっていたのは$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$は上のコードに書いた値以外もたくさん試しています.
sample.png

$10^2$あたりまではほぼ一定(多分ファイル形式の固定部分),それ以降$10^5$までは点数とともにファイルサイズが大きくなっていますが,$10^5$を超えるとファイルサイズが小さくなりました.ファイルを確認すると,$N>10^5$ではsvgで保存していますが中身はビットマップ(`png'かな?)になっています.拡大するとにじむ,

saveasが内部的にファイルサイズや処理のコストを考慮して判定しているのかな,と想像しますが公式サイトなどでは説明が見つけられませんでした.記述があったら教えてください.

(追記)Figureのプロパティでレンダラを指定できました.

コメントをいただきFigureのオプションを確認したところ,レンダラを明示することができるようでした.

    f=figure(1);
    f.RendererMode='manual';
    f.Renderer='painters';

上記コードでレンダラを明示したところ,どうやら大きな$N$に対してもベクター系で描画できるようです.

sample.png

「ようです」というのは,大きな$N$で作成したsvgファイルは開くのに非常に時間がかかり,すべてを確認できていないからです.保存時間も数分~数十分かかり,実用的ではありません.

公式の関数の出来栄えの良さに感心しております.

9
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?