Решение: Я нашел что-то, что может интегрировать matplotlib с kivy, но документация была мега плохой, но решение, которое я нашел, лучше.
Я обнаружил kivy garden (пользовательские пакеты kivy), в котором есть пакет строить графики в киви. Приложен мой новый код и скриншот моей программы
Код: пользователь нажал кнопка, запускающая этот метод. Он создает модальное представление, которое содержит boxlayout, который содержит 2 виджета: 1 - это прокручиваемая сетка, состоящая из меток и кнопок, а другая - график. Код для графика - это второй фрагмент кода
# pm: ticker = ticker clicked
def modal_view(self, ticker, instance):
mainview = ModalView(size_hint = (0.75, 0.75))
box = BoxLayout(orientation = "horizontal")
# make a scrollable gridlayout
scroll = ScrollView(do_scroll_x = False, do_scroll_y = True, size_hint_x = 0.3) # a scroll view will contain the ticker gridlayout
ticker_grid = GridLayout(rows = len(self.ticker_list), cols = 2, size_hint_y = None) # holds tickers
ticker_grid.bind(minimum_height = ticker_grid.setter("height")) # makes the gridlayout scrollabel via the scrollview
# populate the scrollview / gridlayout
for i in range(0, len(self.ticker_list)):
ticker_grid.add_widget(Label(text = self.ticker_list[i // 2], height = 200, size_hint_x = 0.6))
ticker_grid.add_widget(Button(text = "", size_hint_x = 0.4))
# if ticker is selected, add button to cancel it
if (self.ticker_list[i] == ticker):
ticker_grid.children[i].text = 'X'
ticker_grid.children[i].fbind("on_release", self.modalview_cancel_ticker, ticker_grid.children[i])
# combine everything
scroll.add_widget(ticker_grid)
box.add_widget(scroll)
box.add_widget(python_testing.make_graph())
mainview.add_widget(box)
mainview.open()
def make_graph():
# Prepare the data
x = [1,2,3,4,5,6,7,8,9,10]
ratings = [4,5,8,9,4,3,2,6,8,7]
# make the graph
graph = Graph(xlabel='Dates', ylabel='Ratings', x_ticks_minor = 1, x_ticks_major = 2,
y_ticks_minor = 1, y_ticks_major = 2, y_grid_label=True, x_grid_label=True,
padding=5, x_grid=True, y_grid=True, xmin=0, xmax=10, ymin=0, ymax=10)
plot = MeshLinePlot(color=[1, 0, 0, 1])
plot.points = [(i, j) for i, j in zip(x, ratings)]
graph.add_plot(plot)
return graph
Обратите внимание, если вы используете этот код: в make_graph () отображение точек данных является сложной задачей. plot.points = [(i, j) for i, j in zip(x, ratings)]
- единственный способ сделать это
введите описание изображения здесь