論文のFig1とかでexample traceが激重で全然表示されずイライラ、ということは多いけど
いざ自分でmatlabでごりごりとプロットすると、重いプロットだけラスタライズするのはとても面倒だった。
そんな面倒なラスタライズも簡単にできる。そう、pythonならね (ネタが古い)。
やりたいこと
上に書いた通り、散布図でもなんでも良いのだけど、プロットだけラスタライズして
それに乗っているテキストや軸などはベクターのまま持ってpdfなどに出力したい。
簡単な方法を以下で見つけたので自分用メモ。
https://oku.edu.mie-u.ac.jp/~okumura/python/rasterize.html
やりかた
とりあえずmatplotlibを使う前提で。
1つのプロットを全部ラスタライズするなら、ax.set_rasterized(True)
で良い。
が、これだと軸などもラスタライズされてしまう。
そこで、ax.set_rasterization_zorder(z)
というヤツを使う。
これは、zorderが引数より小さいプロット要素だけをラスタライズする、というコマンド。
こいつを上手く使うために、プロットするときにzorder
というプロパティを仕込んでおく。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, zorder=-10) #このzorderがポイント
ax.set_rasterization_zorder(-5)
といった感じ。あとは出力するときにdpi=300
くらいに設定しておけば、そこそこキレイでまぁまぁ軽いプロットができる。
余談
ちなみにMatlabでは良い方法が見つからず、一度プロットのサイズぴったりのfigureを作ってプロットし
axis off
にしてから画像ファイルに書き出して
もう一度そのファルを読み込んで軸と一緒にPDFに出す、という面倒くさいことをやったりしていた。
(描画されている絵を直接取り込むと解像度がとても低かった)
matlabであんなに苦労したことがこんなに簡単にできて、ちょっと感動してしまった。