2016年05月18日

MatplotlibのLaTeXにrがいる


PythonのMatplotlibで、分数を表示したいとき
r"$frac{1}{2}$"
なら表示されるが、
"$frac{1}{2}$"
だと表示されない。rが先頭にいるらしい。

rが入ると、\を書いた通りに残してくれる。
だから、LaTeXに渡す前に変化せずに、書いた通りの形で渡せる。

>>> print "aaa\nbbb"
aaa
bbb
>>> print r"aaa\nbbb"
aaa\nbbb
>>> c = 60
>>> print r"aaa"+str(c)+r"bbb"
aaa60bbb

u"abc"だとunicodeの文字列。
こんな感じで、小文字全部試してみた。
>>> a"abc"
File "", line 1
a"abc"
^
SyntaxError: invalid syntax
.
.
.
.
.
.
>>> z"abc"
File "", line 1
z"abc"
^
SyntaxError: invalid syntax

が、検索したら全部載ってた。

b"abc"バイト文字 python2では無視らしい。
r"abc" raw 文字列 (raw string) エスケープシーケンスの解釈が違うらしい。
u"abc" Unicode 文字列 (Unicode string)

ちょっと話はそれますが、

上記のリンクを読んでいて、http://docs.python.jp/2/reference/lexical_analysis.html#lexical-analysis字句解析器 (lexical analyzer) という所に目が付いた。
lexicalって、pygmentのコマンドの引数の-lの事じゃなかろうか。
pygmentize -l python -f html -O noclasses=True
これの事。いや、lexerで、lexicalではないのか...いやいや、
https://en.wikipedia.org/wiki/Lexical_analysisに載ってた。
字句解析するようなプログラムの事を、lexerと呼ぶらしい。レクサーとか、トークナイザーとか、スキャナーとか呼ぶらしい。通常、レクサーは、パーサーとひとまとまりになっている。
lexerは、lexical analyzerなのか。
この分の概略の後ろの方、
...!and so forthなんて初めて見たよ。「など」だと!?。and so onでいいじゃん。

https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90
構文解析(こうぶんかいせき、syntactic analysis あるいは parse)らしい。

...parserって重要ですな。
FIR&FFTを作っていたとき、cx_freezeでプログラムを配布する形式にしていたら、身に覚えの無いモジュールが勝手にバンドルされていたので、不要だと判断してどんどん消していった。その中に、どうしてもexcludeできないparser.pycというモジュールがあった。実際にはexcludeできるんだけれども、excludeすると動かなくなる。調べてもよく分からんし、結局放っておいた。

構文解析するモジュールなんだぁ。。。

LaTex
まあ、LaTexは、r"$$"の、$の間にはさめば出来ますよという内容なんだけど。
実際、やったらどうなったのかというと、
raw_string.png
geditはいいなぁ。ちゃんと表示してくれる。なんでwindows上だとあんなにもっさりしているんだろうか。

コマンドラインで手打ちすると、LaTexこうなった。

>>> label1 = ["0", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]
>>> print label1
['0', '$\\frac{1}{2}\\pi$', '$\\pi$', '$\\frac{3}{2}\\pi$', '$2\\pi$']

文字列の中では、\は、\n(改行)みたいに、特殊な意味を持つから、\自体を入力する場合\\とする。
r""の中で、\と入力すると、"\\"と勝手に表示してくれる。楽。

逆にrが無いと、、、何かよく分からん事になる。
>>> label2 = ["0", "$\frac{1}{2}\pi$", "$\pi$", "$\frac{3}{2}\pi$", "$2\pi$"]
>>> print label2
['0', '$\x0crac{1}{2}\\pi$', '$\\pi$', '$\x0crac{3}{2}\\pi$', '$2\\pi$']
\はそのままに、fが、x0cと表示されている。もう知らない。

それぞれのlabelを入力すると、こうなる。



x軸のLaTexで書いた部分のフォントが、y軸のフォントと異なっている。
このままでは気持ち悪い。

rc_paramをいじればいいみたいに書いてあるけど、地雷が設置してあった。

plt.show()等をすると、けたたましいerrorの嵐

途中を省略するが、下の様になった。

No pages of output.
Transcript written on c5383a18897d5b8dd569836a32b6a2df.log.
と、最後に表示された。

http://matplotlib.org/users/usetex.htmlに書いてあった。

windowsの場合は、"環境変数のPATHを、latexと、dvipngと、ghostscriptの実行ファイルがある所に通してください"とのこと。WINでは3つもやるのか。

macの場合は...The fonts look terrible on screenと書いてあるけどどういうことか分からない。
まあ不具合があるんでしょう。
macが使っているdvipngが古いからだそうです。
matplotlibrc ファイルを探して、text.dvipnghack : Trueと設定すればいいそうです。

"ubuntuとかgentooでは、基本的なtexliveインストールでは、type1cmパッケージをインストールしません。"(ちょっと英訳が間違っているかもしれない。)

まぁ、省略してしまったエラーの中から、下のような記述もあったし、
単純にtype1cmが無いということでしょう。
! LaTeX Error: File `type1cm.sty' not found.

~$ sudo apt-get install type1cm
[sudo] password for :
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ type1cm が見つかりません
~$ sudo apt-get install python-type1cm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ python-type1cm が見つかりません

...まぁ、検索で調べるからいいです。
http://tex.stackexchange.com/questions/39771/finding-a-ubuntu-package-for-a-sty-file
にあったので、まんま使用する。↓

$ sudo apt-get install texlive-latex-extra
"""
省略
"""
アップグレード: 0 個、新規インストール: 21 個、削除: 0 個、保留: 0 個。
616 MB のアーカイブを取得する必要があります。
この操作後に追加で 908 MB のディスク容量が消費されます。
続行しますか? [Y/n]

この操作後に追加で 908 MB のディスク容量が消費されます。
却下。


http://exolete.com/matplotlib-tex-rendering-packages/
ここを参考に↓
~$sudo apt-get install texlive-fonts-recommended texlive-fonts-extra
"""
省略
"""
この操作後に追加で 1,678 MB のディスク容量が消費されます。
続行しますか? [Y/n] n
中断しました。

この操作後に追加で 1,678 MB のディスク容量が消費されます。

でかすぎ。

908MBの方をインストールした。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
#matplotlib.rcParams['text.usetex'] = True
#matplotlib.rcParams['text.latex.unicode'] = True

plt.rc('text', usetex=True)
#plt.rc('font', family='arial')
#plt.rc('font', family='sans-serif')

plt.rc('font', family='ubuntu')


theta1 = np.linspace(0,np.pi,2001)
theta2 = np.linspace(0,2*np.pi,2001)

x1 = theta1 / np.pi
x2 = theta2 / np.pi

y1 = np.sin(theta1)
y2 = np.sin(theta2)

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)


ax1.plot(x1, y1)
ax2.plot(x2, y2)

ax2.tick_params(labelbottom='off')
ax2.tick_params(labeltop='on')



ax1.set_ylim(-1, 1)
label = [r"$0$", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]

#plt.xticks(ax2.get_xticks(),label)
ax2.set_xticklabels(label, x=ax2.get_xticks())

f.tight_layout()
f.set_size_inches(7.2,4.05)

f.savefig("019.png", dpi=266, facecolor='w', edgecolor='w',
orientation='portrait', papertype=None, format=None,
transparent=False, bbox_inches=None, pad_inches=0.1,
frameon=None)

plt.show()

どうも、plt.rc('text', usetex=True)を設定してからおかしい。
Latex01.png
フォントが変わっちゃう。なんで。
デフォルトのsans serifじゃないフォントになっている。
LaTeXとは同じになっているから、統一感はあるけれども。。。

https://mkacky.wordpress.com/2013/09/15/rcparamstext-usetex-true-%E3%81%A8-sans-serif-matplotlib/
に書いてあった。
plt.rc('text', usetex=True)をすると、全てLaTeXの設定になってしまうそうです。

import matplotlib.pyplot as plt
import numpy as np

plt.rc('text', usetex=True)
plt.rcParams['text.latex.preamble'] = '\usepackage{sfmath}'

theta1 = np.linspace(0,np.pi,2001)
theta2 = np.linspace(0,2*np.pi,2001)

x1 = theta1 / np.pi
x2 = theta2 / np.pi

y1 = np.sin(theta1)
y2 = np.sin(theta2)

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)


ax1.plot(x1, y1)
ax2.plot(x2, y2)

ax2.tick_params(labelbottom='off')
ax2.tick_params(labeltop='on')

ax1.set_ylim(-1, 1)
label = [r"$0$", r"$\frac{1}{2}\pi$", r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]

ax2.set_xticklabels(label, x=ax2.get_xticks())

f.tight_layout()
f.set_size_inches(7.2,4.05)

f.savefig("019.png", dpi=266, facecolor='w', edgecolor='w',
orientation='portrait', papertype=None, format=None,
transparent=False, bbox_inches=None, pad_inches=0.1,
frameon=None)

plt.show()

019.png
よしうまくいった。
πとかθとかは無理みたい。
いや、探せばありそうだが、もうこれ以上探さない。
posted by yuchan at 07:00| Comment(0) | python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: