19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jupyter notebookAdvent Calendar 2019

Day 22

Jupyter, Ipythonの設定 ~起動、グラフの日本語表示、エイリアス、インライン表示、スタートアップモジュールインポート~

Last updated at Posted at 2016-11-02

起動

Ipython

ターミナルにipythonと打ち込む。

または、cmder使っているので、タスク(win+alt+t)に以下を登録した。

cmd /k "%ConEmuDir%\..\init.bat" -new_console:d:%HOME%\python & ipython

init.batしてから立ち上げると、shellコマンドとして!headとか使える。

Jupyter qtconsole

ターミナルにjupyter qtconsole --style=monokai

--style=monokaiしなくてもいいけど、背景白のコンソールは見た目が残念なので、スタイルを変える。
ipythonのqtconsoleの色やフォントを設定する←この辺が詳しい。

cmderには

aliasに登録した
cmd /k "jupyter qtconsole --style=monokai" -new_console:t:"Jupyter" -new_console:b

または

タスク(win+alt+t)に登録した
"jupyter qtconsole --style=monokai" -new_console:b -new_console:d:%HOME%\python

Jupyter notebook

ターミナルにjupyter notebookと打ち込む

cmderには

タスク(win+alt+t)に登録した
jupyter notebook -new_console:t:"Jupyter Notebook" -new_console:b

グラフの日本語表示

詳細はmatplotlib, seabornの日本語表示にも書いた。
以下は要約。

matplotlibの日本語表示

~/.matplotlib/matplotlibrcを作成して、常時日本語フォントを使うようにする。

~/.matplotlib/matplotlibrc
font.family : IPAMincho

seabornの日本語表示

C:\tools\Anaconda3\Lib\site-packages\seaborn\rcmod.pyのrcmod.pyのset関数のデフォルト値のfontを"sans-serif"から"IPAMincho"などに変更する。

rcmod.py
...
def set(context="notebook", style="darkgrid", palette="deep",
        font="IPAMincho", font_scale=1, color_codes=False, rc=None):
...

なお、これらの操作はIPAフォントなどを独立行政法人 情報処理推進機構あたりから事前にインストールしておく必要がある。

既にインストールしてある、MS明朝とかでも可能なはず。matplotlibrc内に書き込む名前がわからないので、知っている人は教えて下さい。
True type font(ttf)だからIPAフォントはpythonの日本語表示ができるらしい。Takaoフォントとかではできなかった。日本語化グラフ表示に使えるフォントは今のところIPAフォントしか知りません。

書き換えたら、~/.matplotlib/fontList.py3k.cacheといったキャッシュファイルも削除して再度matplotlib等をインポートすることで日本語フォントが適用される。←これ結構忘れがち

エイリアスとグラフ表示の修正

プロファイルを設定していなければ、プロファイルを作るべく、ターミナルに以下を入力。プロファイルの名前をつけることもできるが、のところを空欄にすれば"default"の名前が付けられる。

プロファイルを作成する
$ ipython profile create <name>

上のコマンドで生成された~\.ipython\profile_default\ipython_config.pyに以下を追加する。

ipython_config.py
c.AliasManager.user_aliases = [
    # shell command
    ('ls', 'ls  --show-control-chars -F --color'),
    ('grep', 'grep --color'),
    ('grepx', 'grep --color -nriC'),
    ('find', 'find . -name'),

    # git
    ('g', 'git'),
    ('gf', 'git flow'),

    # add,commit,push
    ('ga', 'git add'),
    ('gaa', 'git add .'),
    ('gan', 'git add -n .'),
    ('gaundo', 'git reset HEAD'),
    ('gc', 'git commit'),
    ('gac', 'git commit -am'),
    ('gcundo', 'git commit --amend'),
    ('gp', 'git push'),
    ('gpo', 'git push origin'),

    # status
    ('gs', 'git status --short --branch'),
    ('gd', 'git diff --color-words'),
    ('gls', 'git ls-files'),
    ('gl', 'git log --oneline --all --graph --decorate'),

    # branch
    ('gb', 'git branch'),
    ('gch', 'git checkout'),
    ('gm', 'git merge'),
    ('gt', 'git tag'),
]

c.InteractiveShellApp.exec_lines = ['%load_ext autoreload', '%autoreload 2']
c.InlineBackend.rc = {'font.family': 'IPAMincho',
                      'figure.facecolor': (1, 1, 1, 1),
                      'savefig.dpi': 72,
                      'figure.subplot.bottom': 0.125,
                      'figure.edgecolor': (1, 1, 1, 1)}

やっていること

  • c.AliasManager.user_aliases: エイリアスを追加してipython shellを使いやすくする
    • lsやgrepのようなshellコマンド
    • gitのコマンド
  • c.InteractiveShellApp.exec_lines: ipython実行時に次のリスト内にあるマジックコマンドを実行
  • c.InlineBackend.rc: グラフをインライン表示したときに、背景色とticksやタイトルがかぶってしまうのを防ぐ。

jupyter_background_hide.PNG

タイトルやticksが黒文字なので見えない。
こういうのがいやだ。
c.InlineBackend.rcの設定を弄ってやると、グラフの色を透明から変更できる。

Ipython, Jupyterのスタートアップ

~\.ipython\profile_default\startupディレクトリに保存された.py, .ipyファイルはIpython, Jupyter 開いたときに自動実行される。
使用しているのは以下の二つ。

  • 01_startup.ipy
  • 02_inline.ipy

ちなみに実行されるときは名前順にソートされて実行されるので、

  • startup.ipy
  • inline.ipy

とするとinline.pyが実行されたのちstartup.pyが実行される。
startup.pymatplotlibインポートが記述されているので、inline.pyを先にインポートするとインポートエラー。
ゆえにファイル名の先頭に数字01, 02を付けてstartup.pyが先に実行されるようにしている。

01_startup.ipy

モジュールのインポートを行う。

01_startup.ipy
__modules__ = ('numpy',
           'pandas',
           'matplotlib.pyplot',
           'seaborn')
__standfor__ = {'numpy': 'np',
            'pandas': 'pd',
            'matplotlib.pyplot': 'plt',
            'seaborn': 'sns'}

for __module__ in __modules__:
    __execution__ = 'import %s as %s' % (__module__, __standfor__[__module__])
    print(__execution__)
    exec(__execution__)

ipythonやjupyter立ち上げたときに、インポート中のモジュールを標準出力に出力しながら、numpy, pandas, matplotlib.pyplot, seabornをインポートしてくれる。

詳細はスタートアップ時にインポート中のモジュールを表示にも書いた。

02_inline.ipy

グラフのインライン表示を指示する。

02_inline.ipy
__inline__ = 'matplotlib inline'
__gui__ = 'matplotlib auto'
try:
    get_ipython().magic(__inline__)
    print('%' + __inline__)
except:
    get_ipython().magic(__gui__)
    print('%' + __gui__)
    print("If you'd like to use `plt.show()` command,")
    print('you can type `plt.ioff()`/`plt.ion()` to turn interactive mode off/on.')

実行していることは、%matplotlib inlineを実行してみて、エラーが出たら%matplotlib autoを実行する。autoはデフォルトで開くqt5などのGUIアプリケーションでグラフを開く。(要はデフォルトの動作を行う。)
エラーはコンソール出力できないIpython上などでinline表示をしようとすると、以下のようなUnknownBackendというエラーが返される。

UnknownBackend: No event loop integration for 'inline'. 
Supported event loops are: qt, qt4, qt5, gtk, gtk2, gtk3, tk, wx, pyglet, glut, osx

plt.show()を再び使いたいときの説明メッセージ

If you use `plt.show()` command,
you should use `plt.ioff()` to turn interactive mode off.

は即座にplotするモードを終了させて、plt.show()による描画に戻したいときはplt.ioff()と打ってください、って意味。

更新 2016/11/13
__hogehoge__のように変数をアンダーバー二つでくくると外部から見えなくなる。
影響ないと思うけど、後になって「指定した覚えのないmoduleとかstandforとかいう変数ナンダ???」ってならないようにする措置。

inline.ipy動作時の注意点

ipythonの場合

ipython_qt5.PNG

plt.<コマンド>を打つと即座にグラフが表示される

ipython_ioff.PNG

plotをいくつか重ねたい場合、plt.ioff()を打つと、対話モードが終了し、plt.show()を打たないとqt5にグラフ表示されない、通常の状態に戻る。

jpython qtconsoleの場合

jupyterconsole_japanese2.PNG

ipythonと同様にplt.<コマンド>で即座に表示される

jupyterconsole_japanese_barabara.PNG
jupyter qtconsoleはplt.ioff()をしてもプロットが重なってくれない

jupyter_backslasherro.PNG

グラフの作り方として、バックスラッシュを続けて、コマンドを続ける
そのままenter(shift+enter)するとエラーしてしまうので

use_backslash.PNG

面倒くさいけど、表示したい段階になったらバックスラッシュを消してからenter(shift+enter)すると重ねて描ける。

jupyter notebookの場合

jupyternotebook_japanese.PNG

jupyter notebookであればセルごとにまとめてプロットしてくれるので、jupyter qtconsoleみたいな問題は起こらない。

参考

モジュールのリロード

モジュールをインポートして何か試したあとに「ここのメッセージわかりにくいなぁ」とか「この定数間違えた!」とかよくあること。
そういう時は修正して再度プログラム走らせたいのだが、エディタ上で書き換えた修正が反映されなくてよく戸惑うので解決法。

修正してimportしても修正が適用されない件

pythonのimportはメモリの効率化のため、一度importされたモジュールは再度importされないようになっている。

hello.py
def hello():
    print('hello')
ipythonで実行
[In] import hello
[In] hello.hello()
[Out] hello
hello.py書き換え
def hello():
    print('f**k!')
修正後のhello()
[In] import hello
[In] hello.hello()
[Out] hello
## ここは'f**k!'と表示されたかった。

impモジュール

それでも修正したプログラムが修正適用されてインポートされないのは使えなさ過ぎるので、impモジュールでリロードできる。

imp.reload()
[In]import hello
##  ~~hello.pyの書き換え~~ 
[In]import imp
[In]imp.reload(hello)
[In] hello.hello()
[Out] f**k!

マジックコマンド%autoreload

ipython上では%autoreloadというマジックコマンドが用意されているので、impモジュールをインポートしなくてもリロードを簡単にできる。
%autoreload自体を%load_extでロードしてこないとダメだけどね。

%autoreload()
[In] %load_ext autoreload  # マジックコマンド%autoreloadをロードする
[In] %autoreload hello
[In] hello.hello()
[Out] f**k!

すべてのモジュールを常にリロード

コンソールの最初で%autoreload 2と打てば、すべてのモジュールはimportした際に差分チェックされて、書き換えられてたらリロードしてくれる。

すべてのモジュールを常にリロード
[In] %autoreload 2

ipython実行時に常に%autoreload 2

ipython実行時に常に%autoreload 2を打ち込みたいとき、~\.ipython\profile_default\ipython_config.pyに以下のように書き込まれると、ipython実行時に%load_ext%autoreload 2が実行されたことになる。

ipython立ち上げ時に%autoreload2実行
c.InteractiveShellApp.exec_lines = ['%load_ext autoreload', '%autoreload 2']

参考

ipython とmodule reload と 設定ファイル
ipython を起動しながら自作モジュールを修正した場合
u1and0/dotfiles/.jupyter
u1and0/dotfiles/.ipython

19
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?