Home > Enterprise >  SimpleGUI displaying mpf.plot in canvas
SimpleGUI displaying mpf.plot in canvas

Time:12-30

The code below will embed the Matplotlib toolbar into an application and the plot to a specific canvas, but I would like to embed my mpf.plot instead of my plt.plot. the code works well but it will not produce what is intended, any advise please

    import PySimpleGUI as sg
    import numpy as np
    import pandas as pd
    import mplfinance as mpf
    import numpy as np
    import json
    import requests


    '''
        Embedding the Matplotlib toolbar into your application
    
    '''

    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
    
    
    def draw_figure_w_toolbar(canvas, fig, canvas_toolbar):
        if canvas.children:
            for child in canvas.winfo_children():
                child.destroy()
        if canvas_toolbar.children:
            for child in canvas_toolbar.winfo_children():
                child.destroy()
        figure_canvas_agg = FigureCanvasTkAgg(fig, master=canvas)
        figure_canvas_agg.draw()
        toolbar = Toolbar(figure_canvas_agg, canvas_toolbar)
        toolbar.update()
        figure_canvas_agg.get_tk_widget().pack(side='right', fill='both', expand=1)
    
    
    class Toolbar(NavigationToolbar2Tk):
        def __init__(self, *args, **kwargs):
            super(Toolbar, self).__init__(*args, **kwargs)
    
    

    
    layout = [
        [sg.T('Graph: y=sin(x)')],
        [sg.B('Plot'), sg.B('Exit')],
        [sg.T('Controls:')],
        [sg.Canvas(key='controls_cv')],
        [sg.T('Figure:')],
        [sg.Column(
            layout=[
                [sg.Canvas(key='fig_cv',
                           # it's important that you set this size
                           size=(400 * 2, 400)
                           )]
            ],
            background_color='#DAE0E6',
            pad=(0, 0)
        )],
        [sg.B('Alive?')]
    
    ]
    
    window = sg.Window('Graph with controls', layout)
    
    while True:
        event, values = window.read()
        print(event, values)
        if event in (sg.WIN_CLOSED, 'Exit'):  # always,  always give a way out!
            break
        elif event == 'Plot':


        string = 'https://api.binance.com/api/v1/klines?symbol=BTCUSDT&interval=15m'
        URL = string
        response = requests.get(url = URL)
        response = response.json()
        df = pd.DataFrame(response)
        df[0] = pd.to_datetime((df[0]), unit='ms')

        df.drop([5,6,7,8,9,10,11], axis=1, inplace=True)
        df.rename(columns={0: 'Date',1: 'Open', 2:'High', 3:'Low', 4: 'Close'}, inplace=True)
        df.index = pd.DatetimeIndex(df['Date'])
        df['Open'] = df['Open'].astype(float)
        df['High'] = df['High'].astype(float)
        df['Low'] = df['Low'].astype(float)
        df['Close'] = df['Close'].astype(float)
        df.shape
        df.head(3)
        df.tail(3)

        colors = [
        'blueskies',
         'brasil',
         'charles',
         'checkers',
         'classic',
         'default',
         'mike',
         'nightclouds',
         'sas',
         'starsandstripes',
         'yahoo'
         ]

        mpf.plot(
            df,
            type='candle',
            style= colors[10],
            title= colors[10],
            ylabel='Price ($)',
        )


        plt.figure(1)
        fig = plt.gcf()
        DPI = fig.get_dpi()

        fig.set_size_inches(404 * 2 / float(DPI), 404 / float(DPI))
        # -------------------------------
        x = np.linspace(0, 2 * np.pi)
        y = np.sin(x)
        plt.plot(x, y)
        plt.title('y=sin(x)')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.grid()

        # ------------------------------- Instead of plt.show()
        draw_figure_w_toolbar(window['fig_cv'].TKCanvas, fig, window['controls_cv'].TKCanvas)

    window.close()

CodePudding user response:

Add option returnfig=True to mpf.plot to have it return fig, axlist.

        fig, axlist = mpf.plot(
            df,
            type='candle',
            style= colors[10],
            title= colors[10],
            ylabel='Price ($)',
            returnfig=True,
        )

        # ------------------------------- Instead of plt.show()
        draw_figure_w_toolbar(window['fig_cv'].TKCanvas, fig, window['controls_cv'].TKCanvas)

enter image description here

  • Related