87904


mplfinanceというパッケージ（内部でmatplotlibを利用していると思われる）で、グラフを作成し、  
凡例を追加して、ファイルに出力したいのですが、  
JupyterLab(VSCode+拡張機能)の出力結果欄にも表示されてしまい困っています。  
JupyterLabの出力結果欄には、グラフを表示せず、ファイルのみに出力する方法を教えていただけないでしょうか？  
もしくは、mplfinanceが作成するグラフを加工する適切な方法がありましたら、教えていただけないでしょうか。

試したコード

[code]

    # mplfinanceのインストール
    # !pip3 install --upgrade mplfinance
    
    import pandas as pd
    import mplfinance as mpf # GoogleColabでも、追加インストールが必要
    
    # チャート用のデータ作成
    df = pd.DataFrame(
        data={
            'Open':[ 100, 110, 120, 130 ],
            'Close':[ 111, 112, 113, 114 ],
            'Low':[ 95, 91, 92, 93 ],
            'High':[ 120, 121, 122, 123 ]
        },
        index=[pd.Timestamp('2022/03/01'), pd.Timestamp('2022/03/02'), pd.Timestamp('2022/03/03'), pd.Timestamp('2022/03/04') ]
    )
    display(df)
    
    # fig, axes = mpf.plot(df, returnfig=True, savefig=dict(fname='test.png',dpi=100)) # ←mplfinanceのファイル出力機能を利用すると、凡例の追加ができない。オフスクリーンレンダリングは可能
    fig, axes = mpf.plot(df, returnfig=True)
    axes[0].legend(labels=[ 'Candlestick' ], loc='lower left') # 凡例の追加
    fig.savefig("image.png") # ←matplotlibのファイル出力機能を利用すると、凡例は追加されるが、JupyterLab(VSCode)の出力結果欄にも表示されてしまう
    
[/code]

実行結果（JupyterLabには非表示のまま、ファイルに出力したい。）  
[![画像の説明をここに入力](https://i.stack.imgur.com/1dRoP.png)](https://i.stack.imgur.com/1dRoP.png)


CC BY-SA 4.0
2022-03-18T10:39:40.783
87901
2022-03-19T11:24:40.693
35267
question
python matplotlib jupyter-lab
mplfinanceのグラフを加工して、オフスクリーンレンダリング


セルの先頭にパラメータを指定しない単独の`%%capture`を挿入することで結果表示を抑制出来るようです。  
[%%capture](https://ipython.readthedocs.io/en/stable/interactive/magics.html#cellmagic-
capture)

> If unspecified, captured output is discarded.

こちらの記事にもあります。  
[How do you suppress output in Jupyter running
IPython?](https://stackoverflow.com/q/23692950/9014308)

> This simply discards the output, but the `%%capture` magic can be used to
> save the output to a variable

ただし`display(df)`の方は表示を行いたい場合でも、同じセルの中では同様に抑制されてしまいますので、表示したいものがある場合はセルを分けた方が良いでしょう。  
こんな風に：  
セル1

[code]

    # mplfinanceのインストール
    # !pip3 install --upgrade mplfinance
    
    import pandas as pd
    import mplfinance as mpf # GoogleColabでも、追加インストールが必要
    
    # チャート用のデータ作成
    df = pd.DataFrame(
        data={
            'Open':[ 100, 110, 120, 130 ],
            'Close':[ 111, 112, 113, 114 ],
            'Low':[ 95, 91, 92, 93 ],
            'High':[ 120, 121, 122, 123 ]
        },
        index=[pd.Timestamp('2022/03/01'), pd.Timestamp('2022/03/02'), pd.Timestamp('2022/03/03'), pd.Timestamp('2022/03/04') ]
    )
    display(df)
    
[/code]

セル2

[code]

    %%capture
    # fig, axes = mpf.plot(df, returnfig=True, savefig=dict(fname='test.png',dpi=100)) # ←mplfinanceのファイル出力機能を利用すると、凡例の追加ができない。オフスクリーンレンダリングは可能
    fig, axes = mpf.plot(df, returnfig=True)
    axes[0].legend(labels=[ 'Candlestick' ], loc='lower left') # 凡例の追加
    fig.savefig("image.png") # ←matplotlibのファイル出力機能を利用すると、凡例は追加されるが、JupyterLab(VSCode)の出力結果欄にも表示されてしまう
    
[/code]


CC BY-SA 4.0
2022-03-18T12:06:52.720
87904
2022-03-18T12:06:52.720
26370
87901
answer


セルマジック以外に, ipywidgets 使う方法も。

[code]

    import ipywidgets as widgets
    out = widgets.Output(layout={'border': '1px solid black'})
    
    df = pd.DataFrame(np.random.randn(1000, 2), columns=["B", "C"]).cumsum()
    df["A"] = pd.Series(list(range(len(df))))
    display(df)
    with out:
        ax = df.plot(x="A", y="B")
        df.plot(x="A", y="C", ax=ax)
        #plt.savefig('temp.svg')
        plt.show()
    
[/code]

表示する場合は, `display(out)` (もしくはセルの最後の行で `out`)

関数に対してキャプチャーも可能 (printだけでなく plotもキャプチャー可能)

[code]

    debug_view = widgets.Output(layout={'border': '1px solid black'})
    
    @debug_view.capture(clear_output=True)
    def bad_callback(event):
        print('This is about to explode')
        return 1.0 / 0.0
    
[/code]

(ちなみに `layout={'border': '1px solid black'}` は枠付けてるだけなので指定なしでも OK)

参考: [Output widgets: leveraging Jupyter’s display
system](https://ipywidgets.readthedocs.io/en/latest/examples/Output%20Widget.html)


CC BY-SA 4.0
2022-03-19T11:01:08.657
87915
2022-03-19T11:24:40.693
2022-03-19T11:24:40.693
43025
43025
87901
answer