3.24.2023

WSLでxeyesを表示するまで

Windows11でWSL2を使ってxeyesを表示させたときのメモ。
VcXsrvを使った。
  • sudo apt install x11-apps
まずこれでエラーが出る。WSLの名前解決がデフォルトのIPではだめということなので、/etc/resolv.confで
  • nameserver 8.8.8.8
とかにすると良い。変更前はping google.comとか通らないが、この変更で通るようになる。
これで晴れてx11-appsがインストールできる。
その上でやることは、~/.bashrcとかに
  • export DISPLAY=192.168.1.***:0.0
とか書いてsource ~/.bashrcとかで読み込む。

このIPは、WindowsのcmdでipconfigなどしてWindows側(!= WSL側)のIPv4アドレスを確かめてから入れる。そのためこれが自動取得で変わるたびに設定も変えないといけないと言われる(けど基本的に家で使うくらいならあまり変わることは自分は観測していないので問題にならないのではと思っている)。

なおWSL側のIPをexportしなさいと説明しているサイトもあるので注意(引っかかった)。

これでめでたくxeyesが表示されました。




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が選択できるようになるはずです。

7.13.2021

matplotlibで3D表示のモジュールとオブジェクト生成時の引数

matplotlibで3Dの図を描くときのおまじないをよく忘れるのでメモする。

まず以下をimportする。

  • from mpl_toolkits.mplot3d import Axes3D
次に必要な作図のオブジェクト生成については色々やり方があると思うが、自分は1行でfig, axが得られるplt.subplots()が好き。これを使うときは引数subplot_kwで3次元であることを伝える。
  • fig, ax = plt.subplots(1, figsize=(8,8), subplot_kw={'projection':'3d'})
これで
 ax.scatter()
が3次元でできたり、見る角度を
 ax.view_init(elev=***, azim=***)
で変更できたり、3次元でやりたいことができる。