Добавление нескольких графиков в Kivy MeshLinePlot

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

Примечания: Я могу сделать это нормально при использовании примеров 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()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
889
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы создаете только один сюжет и просто меняете точки сюжета для этого сюжета. Итак, финальный сюжет - последний. График можно добавить к графику только один раз, поэтому все, кроме вашего первого 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 внутрь цикла, чтобы вы каждый раз создавали новый график и добавляли его к графику.

Другие вопросы по теме