6.19.2022

TeXで斜体ボールドにするbmのマクロを使うとき

\usepackage{bm}

を使うとき、

\newcommand{\vA}{\bm{A}}

\bmdefine{\vA}{A}

との違いは一見無さそうだけど、数式内の下付きとかで使うとき、前者は{}でくくらないとエラーが出るが、後者はエラーが出ない。

つまりA_\vAでエラーが出るかどうか。

後者の方が面倒でないけどお作法的には前者の方が{}を忘れないのでいいのかもしれない。(でもやはり面倒い。)

理由は知らない。

6.03.2022

matplotlibの数式でボールドかつイタリックにする方法

matplotlibで軸ラベルとか凡例とかで数式を書きたいことは多い。

単に$$で囲えば数式になってくれるし、デフォルトのサンセリフでかっこ悪いならmatplotlibrcでセリフを指定すれば解決する(過去記事)。

ベクトルを書くときには\mathbf{x}とかしないといけないが、そうすると立体のボールドになる。

変数扱いのシンボルならベクトルでも斜体がいいなと思うので、調べたらようやく解決方法が見つかった。参考はこちら。公式サイトにも説明がある。

使ったmatplotlibバージョンは3.5.1。

要するにLaTeXを直接使ってレンダリングするみたい。そうすればプリアンブルでパッケージを指定する方法が通常LaTeXと同様に使える。

そのためにはmatplotlibrcファイルに以下の2行を追加して保存。

text.usetex: True
text.latex.preamble: \usepackage{amsmath} \usepackage{amssymb} \usepackage{physics} \usepackage{bm}

プリアンブルの部分はお好みでかけて、自作のコマンド\newcommand{\xxx}{\yyy}とかも書けるみたい。

ところで失敗例としては、ググったらPythonの本文中で

matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]

と書くと良いとかいうのを見かけた(これとかこれ)けど、実行すると

MatplotlibDeprecationWarning: Support for setting an rcParam that expects a str value to a non-str value is deprecated since 3.5 and support will be removed two minor releases later.

とエラーが出る。新しいバージョンでは使えないということなのだろう。matplotlibrcに書くしかないのかもしれない。

なお$\bm{xxx}$をPythonで記述するときは注意が必要で、\bがバックスペースのASCIIに割り当てられているので数式として認識させたい場合にはr'$\bm{xxx}$'とか'$\\bm{xxx}$'とかしないとエラーが出る。

長年できなかったので実現して嬉しいー!

(追記)
これで解決はしたけど、TeXレンダリングが重すぎるのか、描画がものすごく遅くなった。インタラクティブな画面でぐりぐりするのも許容しがたいほど遅い。通常時はusetexとかはしない方が良さそう…面倒だけど必要なときのみmatplotlibrcからいじるしかないかもしれない。

5.31.2022

matplotlibのquiverとquiverkeyについて

図に矢印(メジャーだとベクトル場とか、マイナーなとこでは波数空間のスピンなど)を描きたいことは多い。

その矢印情報を配列に入れて引数で渡せば描画してくれるのがmatplotlibのquiver、凡例を示してくれるのがquiverkey。

これは便利なところもあるけど使い方がわかりにくい上にすぐ忘れるのでメモする。

基本的に情報は公式サイトから仕入れた。公式サイトによると基本的なのは以下15個。これに加えてlinewidthとかも使える(linewidthは矢印の縁取りの指定なので注意)。

  • X, Y
  • U, V
  • C
  • units {'width', 'height', 'dots', 'inches', 'x', 'y', 'xy'}, default: 'width'
  • angles {'uv', 'xy'} or array-like, default: 'uv'
  • scale
  • scale_units {'width', 'height', 'dots', 'inches', 'x', 'y', 'xy'}
  • width
  • headwidth, as multiple of shaft width.
  • headlength, as multiple of shaft width.
  • headaxislength, at shaft intersection.
  • minshaft
  • minlength
  • pivot {'tail', 'mid', 'middle', 'tip'}, default: 'tail'
  • color

quiverの引数には注意点が多い。2個はまったのを書く。

(1) unitsは長さについての引数ではないその他(太さや頭(head)の調整)に使われる。

公式説明には
The arrow dimensions (except for length) are measured in multiples of this unit.
とある。

(2) 矢印の向きをxy平面のスケールに合わせたいとき、scale_units='xy'とする

xy平面に合わせるなら'xy'とする。

その上ややこしいのはangles。デフォルトはxy平面の図に関係なくU,Vで決まる方向になる'uv'。

例えば45°方向を向くようにU, Vで指定(1と1とか)すると、デフォルト'uv'のままだとxとy軸で表示スケール比(アスペクト比と言うと良いか)が違ってもとにかく表示上は45°を向く。

でもxy平面に応じた矢印の向きにするには(x, y軸のスケールに合わせたいなら)、angles='xy'で明示する必要がある。('uv'を指定する場合があるのか疑問)

公式説明にあるように、x軸とy軸で同じ単位なら

To plot vectors in the x-y plane, with u and v having the same units as x and y, use angles='xy', scale_units='xy', scale=1.

とすると良さそう。

あるいは矢印の向きを角度指定するならanglesに角度を指定した配列を与えても良いみたい。

(quiverkeyについては後で書く)

1.15.2022

matplotlibrcの編集について

Python3.10にアップデートしたついでにAnaconda3にさようならを告げた。Cドライブの容量が3GBくらい増えたので嬉しい。仮想環境とか使っていなかった上に別にPython3.6とか入れてモジュールのアップデートとかぐちゃぐちゃしてたので非常にすっきりした。

matplotlibもインストールし直したので、matplotlibrcも再編集しないと元の表示に戻らない。

図中の文字がボールドになって直せない問題について悩んだことがあったので、再編集で元に戻るか心配だったが、ボールド問題もなく簡単に元に戻せた。

まずmatplotlibの書式設定のファイルの場所は、

import matplotlib
matplotlib.matplotlib_fname()

で確認可能。デフォルトのパスは元のPythonがあるパスからの相対値で

site-packages/matplotlib/mpl-data/matplotlibrc

にあるはず。このファイルを編集すると書式が色々変更できるが、このファイルを開いてみると最初に

## You should find a copy of it on your system at
## site-packages/matplotlib/mpl-data/matplotlibrc (relative to your Python
## installation location).  DO NOT EDIT IT!

と書いてある。以下の場所にコピーして編集しなさいということらしい。

##     Unix/Linux:
##         $HOME/.config/matplotlib/matplotlibrc OR
##         $XDG_CONFIG_HOME/matplotlib/matplotlibrc (if $XDG_CONFIG_HOME is set)
##     Other platforms:
##         $HOME/.matplotlib/matplotlibrc

matplotlib.matplotlib_fname()のコマンドではデフォルトのパスの前に上の移動先のパスを見に行くみたいなので、コピーしたらそっちが優先される。

たぶんだけど、デフォルトの場所にあるmatplotlibrcは全部基本##で2個コメントアウトがあって、ここを直接変更するときには#が1個でも有効になるのではと思う。実際上のコメントを読まずにデフォルトファイルを直接編集していたら”Duplicate key in file WindowsPath ...”と警告が出た。どうやら一つの項目を重複して記述していたみたい。でもコピーしたファイルで全く同じ編集をすると警告は出なかった。

あとはお好みに。コメントアウトの文章はよく読むべきですね。

1.14.2022

Jupyter notebookにvimキーバインディングを導入する方法 (Windows)

Jupyter notebookは便利です。でもvim key bindingが実現するともっと便利です。

昨今はVS Codeの拡張機能でそれを実現してしまえという話もあると思いますが、Jupyter notebookのnbextensionsでvimキーバインディングができるようになっておくことも有益でしょう。

そのありがたいextensionの大元はこちらです。インストールのガイダンスは載っていますが、Linuxを想定した書き方なので、初心者かつWindowsユーザーの自分にはつらいです。

そのためPCが変わったときなど未来の自分のためにメモを残します。

  1. まずnbextensionsをpipでインストールする。詳細はぐぐってください。
    pip install jupyter_contrib_nbextensions
  2. LinuxでいうところのhomeのWindows版は”C:\Users\***”です。この下に.jupyterというフォルダができているはずです。その下にnbextensionsというフォルダを作ります。
    (2022/8/12)
    これは間違いでした。というよりjupyterが参照するフォルダを"jupyter_data_dir()"で確認したらたぶんデフォルトはここじゃなくて、
    \user\AppData\Roaming\jupyter\
    なので、ここにnbextensionsフォルダが入っているはず。以下このフォルダについて述べていると思ってください。
  3. 上記と同じリンクからZipファイルで丸ごとダウンロードしてきます(右上の”Code"ボタンから可能)。
  4. (2022/8/12)
    コマンドラインで
    jupyter contrib nbextension install --user
    としてnbextensionをインストールする必要があると記事で読んだのでこれを実行。本当に必要があるかどうかは不明。nbextensionsにたくさん項目が増えたけど、vimだけでいい場合はこれいらないのでは?

    zipファイルを解凍してnbextensionsフォルダに置けば完了(フォルダ名はたぶん任意)。

これで、Jupyter notebookを立ち上げたときのnbextensionsタブからVIM bindingが選択できるようになるはずです。