7.15.2019

matplotlibでグラフ上のフォントのボールドを変更できない問題

matplotlib.pyplotを使っていると、軸タイトルとかレジェンドがボールドに勝手になる上にmatplotlibrcでフォントを指定しても直らないデッドロックに陥った。以下にその解決方法とmathtextの変更方法等を記す。

1. ボールド解除方法


色々調べた結果以下のサイトが参考になった。



要するに、

import matplotlib.font_manager as font_manager

をインポートしてから、

del font_manager.weight_dict['roman']
font_manager._rebuild()

で勝手にボールドが選択されている状態を解除する。その後は、

font = font_manager.FontProperties()
font.set_family('serif')
font.set_name('Times New Roman')
font.set_weight('light')

とか書いて自由にいじれば良い。デフォルト設定を変更したい場合やmathtextを使いたい場合とかはmatplotlibrcを編集すれば良い。


2. mathtextのフォント変更方法

mathtextに関連して、Times系のフォントにするための方法は
http://satemochi.blog.fc2.com/blog-entry-56.html
を参照。ざっと言うと2つ方法があって、

texuse : false
font.family : serif
font.serif : Times New Roman
mathtext.rm : serif
mathtext.it : serif:italic
mathtext.bf : serif:bold
mathtext.fontset : cm

などをmatplotlibrcに記入する(お好みで)、もしくは、

from matplotlib import rc
def draw():
    rc('mathtext', **{'rm': 'serif',
                      'it': 'serif:itelic',
                      'bf': 'serif:bold',
                      'fontset': 'cm'})

を書いて適当な場所で呼び出せば良いとのこと。

(追記)
ベクトルなどボールドかつイタリックにしたいときがあるが出来ない。
mathbfでは立体のボールドになる。
stackoverflowに同様の悩みがあったので真似てSTIXではなくてcm (computer modern)でやったけどだめだった。あるいはmatplotlibrcで

mathtext.bf: italic:bold

としたら良さそうだけどやっぱり立体のまま。いい方法ないかな。

(追記の追記)
いい方法があったので新しく記事を書いた。)

3. 編集すべきmatplotlibの場所の調べ方

最後の注意点としては、matplotlibrcは色々な場所に出現しうるので、現状のコード上でどのファイルを参照しているかどうかを調べる必要があること。そのためには、

import matplotlib
matplotlib.matplotlib_fname()

として返り値を見れば良い。jupyter notebookを使っていればそのまま結果が出るはず。

0 件のコメント:

コメントを投稿