Subscribed unsubscribe Subscribe Subscribe

stuff log

あれこれ

matplotlib: 画像サイズの設定 と 保存

matplotlib

matplotlib でグラフ描画 → ベクター形式で保存 → イラレで編集 という流れで作業を進めることが多い。つまり、matplotlib で厳密な修飾はしなくていいものの、サイズの大きさが毎回あってるというだけでイラレでの編集が簡単になる。そこでサイズの変え方と保存方法について学ぶことにする!

matplotlib の初期設定では、8x6 inch、80 dpi のグラフを描くらしい(matplotlib 1.5.3、私の環境の場合 )。でもこれは多くの場合でかすぎる。よってサイズを小さめにする必要があるのだ。

最適なサイズ

  • A4 や Letter の横幅が約 8.5 inch
    • グラフは3 inch くらいがちょうどいい
  • PPT の標準スライドは 10x7.5 inch
    • 巨大グラフならば 8x6 inch
    • 小さめなグラフならば 3x3 inch

f:id:yashima1:20170215112510p:plain:h150 f:id:yashima1:20170215112647p:plain:h150

最適なDPI/PPI (png の場合)

  • 印刷の場合は 300 dpi
  • スクリーンの場合は 100 dpi で十分
    • macbook pro 15 inch は 220 ppi
    • プレゼンに使う 80 inch 巨大スクリーンも <100 ppi のものが多い

テキスト設定

1) テキストをイラレで編集できるようにする

  • matplotlib のデフォルトだと Type 3 font とやらに指定されているのだが、イラレで開くとアウトライン化されてしまう。テキストとして読み込むには True Type font に変える必要がある。そこで ~/.matplotlib/matplotlibrcファイル(なければ作る)に以下のように入力する。
pdf.fonttype: 42    # 42 が TrueType のことらしい (The answer to Life the Universe and Everything)
ps.fonttype: 42

2) フォントを変える

  • これも初期設定だとDejaVu Sans, Bitstream Vera Sansなどになっていて、イラレにフォントがないのでエラーがでてウザイ。そこでmatplotlibrcfont.sans-serif の一番最初に Arial などをもってくることで回避。
  • でも残念なことに Helvetica が使えない; mac OSX では Helvetica は dfont としてインストールされており、これを TrueType に変えることで matplotlib 出力として使えるようになる。でもべつにそこまでしなくても Arial でいい。

3) 最適なフォントサイズ?

  • 論文の場合 6-8 pt にしろと言われる
  • プレゼンの場合大事じゃない数字は12 pt くらい、大事な数字/ラベルは 20-30 pt
  • matplotlibの初期設定は 10 pt くらいなのでまあちょうどいい(変えるならば matplotlibrc など)

画像形式

  • matplotlib は png, pdf, svg, eps, ps などで保存できるらしい(私は eps と ps ができなかった)
  • イラレで開くならば pdf が最適

設定方法

import matplotlib.pyplot as plt

# Fig 作成時にサイズを指定
fig, ax = plt.subplots(figsize=3,3)

### この辺でデータを読み込んでプロットなどする

# 保存
fig.savefig('test.pdf', transparent=True)
fig.savefig('test.png', dpi=300)

以上まとめおわり


以下勉強メモ

Figure size & dpi の確認

画像サイズの初期設定は以下から確認

dpi = fig.get_dpi()
size = fig.get_size_inches()
print "DPI: %i" % dpi
print "Size in inches: %.2f x %.2f" % (size[0], size[1])
print "Pixels: %i x %i" % (dpi * size[0], dpi * size[1])

私は 80 dpi, 8 x 6 inch であった。初期設定を変えたい場合は ~/.matplotlib/matplotlibrc 内の figure.figsizefigure.dpi を変えればいい。

Figure size & dpi を設定する2つの方法

# 1) 最初から指定する
fig, ax = plt.subplots(figsize=(8, 6), dpi=100) # これが一番便利
plt.figure(figsize=(20,10))    # 20 inch x 10 inch

# 2) あとから指定する:面倒臭い
fig2 = matplotlib.pyplot.gcf()
fig2.set_size_inches(18.5, 10.5)
fig2.set_dpi(100)

# 保存:詳しくは下記
fig.savefig('test.png')
fig2.savefig('test2.pdf')
  1. ひとつめの方法は matplotlib.figure.Figure を使って最初からサイズをわたす。
  2. ふたつめの方法ではすでにつくった fig に対して fig.set_size_inches を使って設定

最適なサイズ:3 in for doc, 8 in for ppt

Type Inch mm pt in postscript
Letter 8.50 × 11.00 215.9 × 279.4 612 × 792
A4 8.27 × 11.69 210 × 297 595 × 842
ppt 10 × 7.5
  • 論文を書く場合
    • page の 1/3 くらいの fig をつくりたいならば 2.5-3 inch width くらい
    • 印刷用に 300 dpi 程度が無難
  • プレゼンなど
    • size
      • ppt 一面にバーンとだすならば 8 x 6 inch (デフォルト)とか
      • 画面の ¼ くらいのサイズならば 4 x 3 inch など
    • dpi
      • 印刷しないならば 100 dpi は十分すぎる
      • うちのラボで使っている 80 inch monitor: 69.7 x 39.2 in, 1920 x 1080 px = 27.54 ppi. (便利なサイト) 最高レゾリューションの Boe LCD prototype (10240x4320 @ 82 inch) は135 ppi, Samsung UE82S9W (5120x2160 @ 82 inch) も 67.7 ppi である
      • 私の mac は 15.4 inch display 2880 x 1800, 220 ppi である

保存形式: png or pdf を使う

  • .savefig メソッドを使う。
  • ピクセル形式:png
  • ベクター形式:pdf, ps, eps and svg …らしいが、私が eps と ps を指定するとファイルが壊れている。なぜ?
    • pdf がベスト
    • svg の場合、デフォルトだとテキストがアウトライン化される。rc パラメータ or matplotlibrc の svg.fonttypenone に変えればテキストデータとして保存される。ただしウェブ上で使う場合などブラウザなどによっては開けなくなるので気をつける。基本的に使わなくていい。
    • transparent=True とすれば、Fig, Axes, Axis などの背景が全て透明になる。