Matplotlib Tips

$Id: tips-plots.html,v 1.4 2024/11/05 07:10:01 daichi Exp $
TeXのテキストに\bm等を使いたい
usetexをオンにする. そうするとticksのフォントが変になるので, 下のようにしてカバー
mpl.rc('text', usetex=True)
mpl.rcParams['text.latex.preamble'] = r"\usepackage{bm}\usepackage{helvet}"
plot (xx, yy, label=(r'$\bm{\alpha}$ Fixed'))
fmt = mpl.ticker.StrMethodFormatter("{x}")
gca().xaxis.set_major_formatter(fmt)
gca().yaxis.set_major_formatter(fmt)
matplotlib標準でサポートされている文字のリスト (anacondal3の場合)
/opt/anaconda3/lib/python3.9/site-packages/matplotlib/_mathtext_data.py
凡例を図の外に配置する
legend (loc='upper left', bbox_to_anchor=(1.05,1))
Colorbarの細かい目盛りをオフにする&ラベルの縦位置を調整
cbar = colorbar (ticks=[1,0.5,0.2,0.1,0.01])
cbar.ax.minorticks_off ()
cbar.ax.set_yticklabels(['1', '0.5', '0.2', '0.1', '0.01'])
cbar.set_label (r'$p(z|d)$', rotation=0, labelpad=30, y=0.57, fontsize=24)
x軸, y軸の目盛の間隔を, 最小値・最大値を使わずに指定したい
from matplotlib.ticker import MultipleLocator
gca().xaxis.set_major_locator (MultipleLocator(100))
のようにする. 下のような関数を書いておくと簡単にできて便利.
def xtickwidth (n, ax_=None):
    ax = gca() if ax_ is None else ax_
    ax.xaxis.set_major_locator (MultipleLocator(n))
boxplotのラベルのフォントの大きさを変える
boxplotに直接変えるオプションはなさそうなので, 以下のようにする.
from matplotlib import rcParams
rcParams['xtick.labelsize'] = 28
scatterのマーカーを白抜きにしたい
facecolor='none', edgecolors='k' のように指定する.
データのヒストグラムと密度を, 違うy軸のスケールで一緒にプロットしたい
ax.twinx() を使う. 密度の方でset_ylim()をしないと底が合わないので注意.
fig,ax = subplots ()
ax.hist (data, color='gray') # こちらを先に描かないと隠れる
ax2 = ax.twinx()
ax2.plot (xx, yy)
ax2.set_ylim (0, 0.01)
プロットの色指定のcolormapを反転させたい
単に, 名前の最後に "_r" をつければOK. "RdBu_r" など.
日本語テキストのフォントを綺麗にしたい.
japanize_matplotlibやmatplotlib_fontja (Python 3.12以降, pip install matplotlib-fontja でインストール可能) でラベルなどのテキストに日本語が使えるが, フリーフォントのため, フォントがあまり綺麗ではない.
ヒラギノ明朝などを使って綺麗に出すには, 次のように設定する.
import matplotlib.font_manager as fm

jpfont = fm.FontProperties (fname=fontpath)
xlabel ('ほげ漢字', fontproperties=jpfont)
fontpathは*.ttcや*.otfのフルパス. 以上を行う jpfont.py を作っておくと, 単に日本語テキストを入れる際に fontproperties=jpfont() を入れるだけで, 綺麗な日本語フォントが使える. この場合, from jpfont import jpfont としておく.
プロットの相対位置でテキストを出力したい.
対数軸の場合など, プロットの座標ではなく, 相対的な座標でテキストを出力するには, ax.text (transform=ax.transAxes) を使う. こうすると, プロットの左下が(0,0), 右上が(1,1)となる相対座標で指定できる. 具体例:
ax = gca()
ax.text (-0.5, 0.5, 'パープレキシティ', fontproperties=jpfont(), transform=ax.transAxes)
プロットのylabelの縦位置を変えたい. 特に, ラベルに日本語を使った場合に上にずれる傾向がある.
text()で直接書けばもちろん変えられるが, ylabel()には実は y= というオプションがあり, [0,1]の相対位置を指定できる. 例:
ylabel ('頻度', fontsize=24, labelpad=38, rotation=0, y=0.445,
                fontproperties=jpfont())
3次元プロットのz軸ラベルが回転できない.
デフォルトでは縦読みになってしまうが, ax.set_zlabel (text, rotation=0) だけでは回転されない. 先に ax.zaxis.set_rotate_label (False) を指定して, 自動回転を止める必要がある.

daichi
Last modified: Sun Nov 10 08:48:45 2024