ちょっと困ったので備忘録です。
環境は Python 3.8.0、matplotlib 3.1.2 です。
事案
matplotlibで変数a
を上付き文字として出力しようと思って以下のようなコードを書きました。
import numpy as np
import matplotlib.pyplot as plt
a = 14
x = np.arange(0, 1, 0.1)
y = x**a
plt.plot(x, y, label=rf'$y=x^{a}$') # 問題の箇所
plt.legend()
plt.show()
いざプロットしてみると、以下のような図が得られました。
残念ながら、変数a
の一文字目のみが上付き文字として識別されてしまいました。
ごめんごめんと思って、$y=x^{{a}}$
のように波括弧を1つ増やしてプロットしてみたら、$y=x^a$ と表示されてしまいました。
解決策
結果として、以下のように三重に波括弧を増やすことで解決しました。
import numpy as np
import matplotlib.pyplot as plt
a = 14
x = np.arange(0, 1, 0.1)
y = x**a
plt.plot(x, y, label=rf'$y=x^{{{a}}}$') # ズバッと解決
plt.legend()
plt.show()
なぜか
Pythonドキュメントに書いてました。
文字列のうち波括弧の外にある部分については書いてある通りに扱われます。ただし二重の波括弧 '{{' または '}}' は、それぞれに対応する一重の波括弧に置換されます。
つまり最初の波括弧が一重の場合「f'{a}'
」では、a
が14
に置換され波括弧が消されて処理されたので、一文字目だけが上付きになったんですね。
次に二重の場合「f'{{a}}'
」では、二重の波括弧が一重の波括弧に置換され、そしてa
はそのままで{a}
が処理されたので、$y=x^a$ と表示されてしまったんですね。
なので三重「f'{{{a}}}'
」にすれば二重の波括弧が一重の波括弧に置換され、そしてa
は14
に置換され{14}
が処理されたので、正しく14
が上付き文字として認識されたんですね。
以下のような感じです。
a = 14
print(f'x^{a}') # x^14
print(f'x^{{a}}') # x^{a}
print(f'x^{{{a}}}') # x^{14}
Tex構文として正しいのは一番下ですね。
以上です。Python頑張ります。