Я хочу поместить тепловую карту 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: я знаю, что здесь много глупых ошибок, и именно поэтому я здесь и прошу помощи.
Вся помощь приветствуется. :)