3
2

More than 3 years have passed since last update.

Matplotlibで軸はベクターのままプロットだけラスタライズする

Posted at

論文の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であんなに苦労したことがこんなに簡単にできて、ちょっと感動してしまった。

3
2
0

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
3
2