Тепловая карта Matplotlib в кивом окне - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу поместить тепловую карту Matplotlib в экран kivy, а также иметь возможность перемещаться назад и вперед между экраном тепловой карты и основным экраном. Теперь главная проблема заключается в том, что мне нужно динамически изменять эту тепловую карту, чтобы показать изменения в реальном времени.

Я вставляю свой код здесь:

    import matplotlib
    matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
    from matplotlib.figure import Figure
    from numpy import arange, sin, pi
    from kivy.app import App

    import numpy as np
    from kivy.garden.matplotlib.backend_kivyagg import 
    FigureCanvasKivyAgg,FigureCanvas,NavigationToolbar2Kivy
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.boxlayout import BoxLayout
    from matplotlib.transforms import Bbox
    from kivy.uix.button import Button
    from kivy.graphics import Color, Line, Rectangle

    import matplotlib.pyplot as plt

    import random




    def heatmap(fig, row_labels="", col_labels="", ax=None,
                cbar_kw={}, cbarlabel="",*largs, **kwargs):
        print("refresh")

    count=random.randint(0,3)
    if count==0:
        data=np.loadtxt('datafile.txt')
    elif count==1:
        data=np.loadtxt('datafile1.txt')
    elif count==2:
        data=np.loadtxt('datafile2.txt')
    elif count==3:
        data=np.loadtxt('datafile3.txt')


    if not ax:
        ax = plt.gca()

    # Plot the heatmap
    obj=ax.imshow(data,aspect='auto', **kwargs)

    #this is to block some cells for a particular purpose
    n=""
    for i in range(12):
        for j in range(27):
            if data[i,j]==-1:
                n="b"
            else : n=" "
            text = ax.text(j, i, n,ha="center", va="baseline", color="b")

    # Create colorbar
    cbar = ax.figure.colorbar(obj, ax=ax, **cbar_kw)
    cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")
    ax.set_title("title")
    #fig.tight_layout()
    #fig.savefig("sample_plot.png",bbox_inches='tight',transparent=True)
    im=fig.canvas
    return im






    """
    def callback(instance):
        #heatmap(fig,ax,cmap="inferno_r", cbarlabel="density")
        #canvas = fig.canvas
        fig, ax = plt.subplots()
        heatmap(fig,ax,cmap="inferno_r", cbarlabel="density")
        self.im=FigureCanvasKivyAgg(plt.gcf())
    """



    class MatplotlibTest(App):
        title = 'Matplotlib Test'
        def refresh(self,instance):
            fig, ax = plt.subplots()
            heatmap(fig,ax,cmap="inferno_r", cbarlabel="density")
            plt.close('all')
            self.im=FigureCanvasKivyAgg(plt.gcf())

        def build(self):
            fig, ax = plt.subplots()
            heatmap(fig,ax,cmap="inferno_r", cbarlabel="density")
            self.im=FigureCanvasKivyAgg(plt.gcf())
            fl = BoxLayout(orientation="vertical")
            a = Button(text="refresh", height=40, size_hint_y=None)
            a.bind(on_release=self.refresh)

            fl.add_widget(self.im)

            fl.add_widget(a)
            return fl

    if __name__ == '__main__':
        MatplotlibTest().run()

Я пытаюсь обновить этот код и отобразить новые данные в тепловой карте при выпуске кнопки обновления. Но этого не происходит. Я не могу очистить ссылку plt.gcf (), загрузить и построить новую.

Я перепробовал все plt.gcf (). Clear (), plt.close (), plt.Close ('all'), plt.close ('fig'), очищенные оси и все. Ничего не работает

Для этого файла нет .KV, он будет работать как есть, но не будет динамически изменяться (что является основным требованием).

Также было бы чрезвычайно полезно, если бы вы могли показать мне, как ограничить черчение одним экраном, чтобы я мог перемещаться по нескольким экранам с помощью kivy.uix.screenmanager.

PS: я знаю, что здесь много глупых ошибок, и именно поэтому я здесь и прошу помощи.

Вся помощь приветствуется. :)

...