簡體   English   中英

Kivy:使用滑塊更新Matplotlib畫布

[英]Kivy: update matplotlib canvas with a slider

我需要創建一個更新matplotlib圖形的滑塊。 到目前為止,我有這個main.py:

from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
import numpy as np
import matplotlib.pyplot as plt
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg

class Container(BoxLayout):
    display = ObjectProperty()
    def __init__(self, *args, **kwargs):
        global canvas
        super(Container, self).__init__(**kwargs)
        lum_img = np.random.rand(10,10)
        plt.imshow(lum_img, cmap="gray")
        plt.colorbar() 
        canvas = FigureCanvasKivyAgg(plt.gcf())
        self.ids.box_display.add_widget(canvas)
        canvas.draw()

    def add_one(self, value):
        lum_img = np.random.rand(10,10)
        plt.imshow(lum_img, cmap="gray")
        plt.colorbar() 
        canvas.draw()

        self.display.text = str(round(value,2))



class MainApp(App):
    def build(self):
        self.title = 'Image and slider app'

        return Container()


if __name__ == "__main__":
    app = MainApp()
    app.run()

和main.kv:

<Container>:
    display: display
    id: main_display
    orientation: "vertical"

    BoxLayout:
        id: box_display
        orientation: "vertical"


        Slider:
            id: slider_image
            min: 0
            max: 1
            value: 0.5
            on_value: root.add_one(value = slider_image.value)

    Label:
        id: display
        font_size: dp(50)
        text: '0'

該行為不符合預期,它只是移動圖像而不是更新圖像畫布! 我認為錯誤是將畫布聲明為全局變量,但不執行此操作我不知道如何更新它。

任何想法?

您的代碼實際上是在創建新的圖,但是它們的位置不正確並且彼此重疊。 解決該問題的一種方法是使用plt.subplot() 這需要預先知道要添加多少個子圖。 這是使用此方法的代碼的修改版本(為方便起見,我將.kv作為字符串包含在內):

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
import numpy as np
import matplotlib.pyplot as plt
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg

Builder.load_string('''
<Container>:
    display: display
    id: main_display
    orientation: "vertical"

    BoxLayout:
        id: box_display
        orientation: "vertical"


        Slider:
            id: slider_image
            min: 0
            max: 1
            value: 0.0
            on_value: root.add_one(value = slider_image.value)

    Label:
        id: display
        font_size: dp(50)
        text: '0'
''')

class Container(BoxLayout):
    display = ObjectProperty()
    def __init__(self, *args, **kwargs):
        global canvas
        super(Container, self).__init__(**kwargs)
        self.index = 1    # index of the current plot
        self.max_plots = 5     # maximum number of subplots
        self.old_slider_value = 0.0   # starting value of the slider
        lum_img = np.random.rand(10,10)
        plt.subplot(1, self.max_plots, self.index)     # create the first subplot
        plt.imshow(lum_img, cmap="gray")
        plt.colorbar()
        canvas = FigureCanvasKivyAgg(plt.gcf())
        self.ids.box_display.add_widget(canvas)
        canvas.draw()

    def add_one(self, value):
        # only make a new subplot if the slider has moved at least 0.2
        if (value - self.old_slider_value) > 1.0/self.max_plots and self.index < self.max_plots:
            self.old_slider_value = value
            self.index += 1
            plt.subplot(1, self.max_plots, self.index)     # make new subplot
            lum_img = np.random.rand(10,10)
            plt.imshow(lum_img, cmap="gray")
            plt.colorbar()
            plt.tight_layout()     # arrange the subplots a bit to eliminate overlaps
            canvas.draw()

        self.display.text = str(round(value,2))



class MainApp(App):
    def build(self):
        self.title = 'Image and slider app'

        return Container()


if __name__ == "__main__":
    app = MainApp()
    app.run()

誤解了您想要的東西(我的錯誤)。 如果您不想創建新的繪圖,而只是更新現有的繪圖,則只需在執行其他繪圖之前在add_one()方法中添加對plt.clf()的調用即可。 這將清除當前圖形,並允許您將其替換為新圖形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM