fortran66のブログ

fortran について書きます。

【メモ帳】Jupyter Lab Fortran Kernel で inline plot ムズイ

forpy と Jupyter Lab と Fortran Kernel

forpy を用いることによって、Fortran から python を呼び出して matplotlib の図を backend:WebAgg で別のブラウザタブには書き出せるが、show のところで inline 出力にするやり方が分からない。Backend を変えただけでは、Figure (640x480) 的なテキストメッセージは出るが絵は出ない。

一度、外部ファイルに書き出したうえで、Kernel の方の処理で inline に出すやり方は分かった。画像などは一度 png などにしてから base64 で ascii 文字?に変換して HTML 的に送り込んでいる。WEB 関連の知識がないのでわけわかめ

BMP や GIF は Fortran から直接吐けるので、外部ファイル書き出し形式なら Kernel とセットで対応すれば Forpy 無しでも inline 図はゆけるだろう。

メモ帳

  • chcp 437 で英語モードにする(Windows)
  • matplotrc で backend : module://ipykernel.pylab.backend_inline(環境変数でも行ける?)
  • kernel.py に付加

このチュートリアルが一番簡単そうだが、幼女には難しい。
ipython-books.github.io

  • HTML (文字列を HTML 解釈で出力)

contents は文字列。

        data = {'text/html': contents}
        self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})

tmp.png というファイルがあったら無条件に出力して消す。IDL kernel から丸パクリw

        #plot figure 
        if p.returncode == 0 and os.path.exists('tmp.png'):
            image = open('tmp.png', 'rb').read() 
            display_data=[]
            display_data.append({'image/png': b64encode(image).decode('ascii')})

            for data in display_data:
                self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})

            os.remove('tmp.png') 

github.com

出力例

f:id:fortran66:20180913211929p:plain
sin カーブまで蛇に見えてきた!蛇むかつく!