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






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