【寄り道】Matplotlibで図表と数式(TeX)

デープランニングのコースからは外れますが、このブログを書くのに数式や図、表なども描きたいと思う。せっかくPython の画像プログラムとされるMatplotlib 使えるようにしたので、Python 使い方トレーニングとして図表を描くことにする。 ネット検索していると、TEXを使った数式の紹介もあった。 ワードで書く数式の限界に欲求不満状態はかねてより。TEXを使った数式を是非に使いたいと思った。 使い方をネット検索して、理解に苦労しながらなんと出来たのものを紹介します。 

 目標は、

 ・ TeX(ティフ)による綺麗な数式を表示と、デープランニングに使う図、表、数式の記述が出来ること。

 出来るだけシンプルにしたい。 あえて、LaTeX やPatch を使わない範囲にしました。今後、限界を感じたらPachも使う事になるかもしれません。


1)matplotlib での文字表示

matplotlib ではグラフの annotation(:注釈)としてtextで文字をプロット出来ました。 

まずは、PythonにMatplotlib.pyplot をインポートします。matplotlib だけではText をサポートしていないらしいので、pyplot までをインポートする必要が有りました。

Text は、表示する位置をx、y座標(左下が原点の0,0)で指定。デフォルトはX=1,Y=1が最大で、文字の大きさは0.3インチらしいです。

matplotlib のサイトでmatplotlib.pyplot.text の説明があります。パラメータの意味や設定方法がよく判らないのですが、 実際に使ってみれば各説明の意味がよく理解できました。プログラムの習得は習うより慣れろ、やはり、百読は一慣に如かず(>百聞は一見に如かず)です。 

まずは簡単なプログラムでテスト。

.・matplotlib.pyplot をインポートして

・ plt.textで 「Test」の文字を書きます。位置は、グラフのサイズを縦横の全体を1.0として、真ん中のx≂0.5,y=0.5 を設定。 文字は’’(クォーテーションマーク)で挟みます。

最後に出来上がった図を plt.show()で表示します。 

 結果は

さらに、テキストの大きさと色を設定して比べてみました。

・ x,yの位置を少しずつずらして書きます。

・ 文字の大きさの指定は fontsize=20 、fontsize=30として指定。 色をcolor ='blue' で青、color ='red' で赤を指定。 文字体の指定を fontstyle='italic' でイタリック('italic':斜字)に指定しています。

結果

これらの文字タイプでは、日本語表示は出来ない様です。


2)文字スタイルの表示 (科学関係にはTimes New Roman がいい)

Matplotlib でフォントタイプを指定して、比較してみました。 

上から、デフォルトのフォントをサイズ20の文字。 ノーマルタイプとイタリックです。 代数式 y = ax + b も書いてみることにします。 

まだ代数式としては、少しセンスがないように思えます。 

検索したところ、数式にはTimes New Roman がいいという事。 フォントファミリーをTimes New Romanに指定します(フォントにはファミリーがあり、ファミリー内でフェイスを選ぶということ。 Times New Romanにも4つのフェイスタイプ有ります。)

プログラムの簡単な説明。 

 ・ 比較として通常の文字で、「normal font」と「y = ax + b」を書きます。

 ・ rcParams で デフォルト(既定)のfont.family を Times New Romanに設定します。

 ・ まずは、X= 0.1,Y=0.4の位置にノーマル字で'TIMES-NEW-ROMAN 123 normal' (サイズは20)

 ・ その下に、 イタリック と オブリークで描きます。

 ・ イタリックでの y = ax + b は、かなり数学の教科書に近くなります。


プログラムと、結果です。


3)Tex文字での表示

Times New Roman 、かなりいい感じになりました。でも x(エックス)はクロスした感じの文字です。数学ではよくクロスさせないxを書いていました。(なぜなのか? 掛け算の×やギリシャ文字のχ、外積などとの区別がつかないからかもしれません。クロスのxが本当は正しいのではないかと思いますが、理由は知りません。)

Tex(ティフと呼ぶ?) を使いうと数学的な文字が、書けるという事です。

Tex とLaTex があるのですが、違うものらしい。(LaTexはTexの1種類でしょうか。)

PythonでもLaTexを使えるらしいが、Matplotlib.pyplotlob にTexを備えているのでとりあえずは、十分?   

【プログラムの簡単な説明】

・比較文として TesText = "XYZxyz123 y=ax+b"     をセット。

・先ずは TimesNewRoman で一度書きます。 サイズ20、色は黒、左揃え、フォントはTimes New Roman

・フォントの標準をplt.rcParamsで"mathtext.fontset"を'cm'に設定。 'cm' は computer modran の略で、数式(math)用のテキストのフォントセットの指定

・plt.rcParamsで、数式(math)用の標準フォントのスタイルの規定値をイタリック('it')に設定。

・plt.textで、数式用をフォントを使う場合は、rを最初に書いて””で挟み込む。さらに、文字は$$で挟む。もし、スペースを入れたいときには、$$で挟んだ文字の間に” ”(スペースのみ)を入れる。 $$の文字の間にスペースを入れても無視される。("$com puter$ $ mod e r n $"⇒'computer modern'となる) 

・小文字のxyzが洒落た文字になり、xはクロスしているか、していないかの形になる。

・標準をイタリックに設定しているが、部分的に戻したいなら \mathrm として { } で挟めばいい。 次の例は、"cm"と"y=ax;b"だけを\mathrm で戻している。 

・\に続けて数学用の特殊な文字が書けるようになる。

・pythonサイトに載っていた積分の式は、\int_{x_0}^{x_1} で描くらしい。 x_0とx_1の”_”(アンダーバー)は添え字の記載方法という事。

・変数のTesTextを+で連結すれば書くことも出来る。

結果は、

となりかなり、いい感じになった。 まったく使い慣れていないので、追々、いろんな数式を書いてみることにします。


4)デープランニングの表記をしてみる

次は、ディープランニングで出てくるパーセプトロンの式に挑戦。

【プログラムの簡単な説明】

・数学用に"mathtext.fontset"を 'cm'、'mathtext.default' = 'it' に設定。

・”y=”の後に、\genfrac{\{}{}{0}{} で大きな{ と2段表記の設定。{ \ 0\ \ (x_1w_1+x_2w_2 \ \leqq \ \theta)} で上段、{ \ 1\ \ (x_1w_1+x_2w_2> \theta)} で下段を書きます。 

細かい説明は省略させてください。(まだ勉強不足で上手く説明が出来ない。)

結果は次のようになった。


5) パーセプトロン図を描く

パーセプトロンの模式図も描ける。

こんどは、文字を円で囲むbbox と 矢印を描く plt.arrow を使う。

【プログラムの簡単な説明】

・TeXで、添え字付きのX(1)を r"$x_1$" で描く。 こんどはパラメータに, bboxを設定。bboxのパラメータはdict形式で、boxstyle='circle' で円になる。 大きさはpad=0.8 で調整 円内の色は fc="w" で白 ,  ラインは ec="red" で赤になる。

・添え字付きのX(2)は、$x_2$で、円の色だけec="blue"に変える。 

・yも 円で囲んで、色は緑(ec="green")

・矢印は plt.arrow で描く。 矢印の始点が(0.1,0.7)で、終点までの増減が(0.31,-0.14) 矢先の幅や色を決める。 2本の矢を描く。

・重み付けの w(1)、W(2)を 適当な位置に描くようにする。

色は遊びで付けたので、特に意味はありません。

こんな風になりました」。



以上で、python のmatplotlibを使った、数式と、描画の方法が出来ました。


後付け

YouTube画像を公開。長くなりました。 時間もかかった。Pythonの練習と、記事の書き方習得をしました。公開してから、不具合点を直していきます。 <m(__)m>

初心者がPythonでプログラミング入門。初歩からデープラーニングを体験的に学習する記録

プログラム初心者でも解るように説明をしながら、これからの時代に必要なPython(パイソン)を使って、プログラミング入門から初めてAIデープラーニングを体験的に学習するサイトです。主の教科書に「ゼロから作るDeep Learning 」(オライリージャパン)を使って、多くの情報サイトを使います。自主学習の記録として留めておきたいこと、これから学習する人が知りたいだろうことをブログ式にまとめています

0コメント

  • 1000 / 1000