Добавление нескольких графиков в Kivy MeshLinePlot - PullRequest
0 голосов
/ 09 января 2019

Я хотел бы добавить несколько графиков на график. В следующем примере добавляются только данные, рассчитанные в последней строке цикла. Как мне достичь своей цели?

Примечания: я могу сделать это нормально, используя примеры kivy, в которых не используется файл .kv, а виджет графика добавляется после выполнения нескольких команд graph.add_plot в цикле. Я также понял, что при использовании файла .kv виджеты автоматически обновляются, а при запуске из кода Python - нет.

from kivy.garden.graph import MeshLinePlot
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from math import sin

class RootWidget(BoxLayout):
    def __init__(self, **kwargs):
        super(RootWidget, self).__init__()
        self.plot = MeshLinePlot(color=[.5, .5, 1, 1])

    def start(self):
        #self.ids.graph.add_plot(self.plot) #same result if this line is added here
        for i in range(24):
            data_to_graph = [(x, sin(x)+ i) for x in range(0, 101)] #apply a DC offset to each trace to display multiple traces
            print(data_to_graph)
            self.plot.points =  data_to_graph
            self.ids.graph.add_plot(self.plot)

class GraphDemo(App):
    def build(self):
        return Builder.load_file("mainWindow_play.kv")

if __name__ == "__main__":
    GraphDemo().run()

mainWindow_play.kv

#:import MeshLinePlot kivy.garden.graph.MeshLinePlot
RootWidget:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            size_hint: [1, .8]
            Graph:
                id: graph
                xlabel: "X"
                ylabel: "Y"
                y_ticks_major: 4
                x_ticks_major: 4
                y_grid_label: True
                x_grid_label: True
                padding: 5
                x_grid: True
                y_grid: True
                ymin: -1
                ymax: 25
                xmin: 0
                xmax: 25

        BoxLayout:
            size_hint: [1, .2]
            orientation: "horizontal"
            Button:
                text: "START"
                bold: True
                on_press: root.start()

1 Ответ

0 голосов
/ 09 января 2019

Вы создаете только один график и просто меняете точки графика для этого графика. Итак, последний сюжет - последний. Сюжет может быть добавлен к графику только один раз, поэтому все, кроме вашего первого add_plot(), игнорируются. И когда точки графика меняются, этот график обновляется, чтобы показать последние точки. Если вы хотите увидеть все графики, вам нужно создать отдельный график для каждого набора точек данных. Возможно так:

class RootWidget(BoxLayout):
    def __init__(self, **kwargs):
        super(RootWidget, self).__init__()

    def start(self):
        #self.ids.graph.add_plot(self.plot) #same result if this line is added here
        for i in range(24):
            data_to_graph = [(x, sin(x)+ i) for x in range(0, 101)] #apply a DC offset to each trace to display multiple traces
            print(data_to_graph)
            self.plot = MeshLinePlot(color=[.5, .5, 1, 1])
            self.plot.points =  data_to_graph
            self.ids.graph.add_plot(self.plot)

Переместите создание MeshLinePlot внутрь цикла, чтобы каждый раз создавать новый график и добавлять его к графику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...