在KivyMD中实现图表遇KeyError问题求助及替代方案咨询
在Kivy/KivyMD中实现图表的问题解决与替代方案
问题描述
我是Kivy新手,可能忽略了一些简单错误。尝试在GUI中实现图表,查阅资料后用matplotlib做原型,但运行代码时出现错误:
KeyError: 'kivy.garden.matplotlib'
我的代码如下:
from matplotlib import pyplot as plt # importing numpy import numpy as np from kivy.garden.matplotlib import FigureCanvasKivyAgg # importing kivyapp from kivy.app import App # importing kivy builder from kivy.lang import Builder # this is the main class which will # render the whole application class uiApp(App): def build(self): self.str = Builder.load_string(""" BoxLayout: layout:layout BoxLayout: id:layout """) signal = [7, 89.6, 45.-56.34] signal = np.array(signal) # this will plot the signal on graph plt.plot(signal) # setting x label plt.xlabel('Time(s)') # setting y label plt.ylabel('signal (norm)') plt.grid(True, color='lightgray') # adding plot to kivy boxlayout self.str.layout.add_widget(FigureCanvasKivyAgg(plt.gcf())) return self.str # running the application uiApp().run()
我已尝试卸载并重装kivy-garden和Matplotlib,但问题仍未解决。请问有什么修复方法,或在Kivy/KivyMD中展示图表的替代方案吗?
修复方法
1. 正确安装Kivy Garden的Matplotlib组件
卸载重装kivy-garden和matplotlib不足以解决问题,需要单独安装garden仓库中的matplotlib插件:
- 先确保
garden命令可用,若不可用,执行以下命令安装kivy-garden:pip install kivy-garden - 再安装matplotlib garden组件:
注:Windows环境下可能需要用garden install matplotlibgarden.bat,Python3环境也可尝试python -m garden install matplotlib。
2. 修正代码语法错误
代码中signal = [7, 89.6, 45.-56.34]存在语法错误,45.-56.34应改为45, -56.34,否则会触发数值解析错误。
3. 优化Matplotlib使用方式
避免使用全局的plt对象,建议创建独立的Figure和Axes实例,减少潜在冲突:
from matplotlib.figure import Figure # ... 保留其他导入 def build(self): # ... 保留布局加载部分 signal = np.array([7, 89.6, 45, -56.34]) # 创建独立的Figure和Axes fig = Figure(figsize=(5,4), dpi=100) ax = fig.add_subplot(111) ax.plot(signal) ax.set_xlabel('Time(s)') ax.set_ylabel('signal (norm)') ax.grid(True, color='lightgray') self.str.layout.add_widget(FigureCanvasKivyAgg(fig)) return self.str
替代方案
1. Kivy内置Graph模块
Kivy自带的kivy.garden.graph适合绘制轻量静态或实时图表,无需依赖matplotlib:
from kivy.garden.graph import Graph, MeshLinePlot from kivy.app import App from kivy.uix.boxlayout import BoxLayout class uiApp(App): def build(self): layout = BoxLayout() # 配置图表参数 graph = Graph(xlabel='Time(s)', ylabel='signal (norm)', xmin=0, xmax=3, ymin=-60, ymax=100, x_grid=True, y_grid=True, padding=5) # 创建折线图 plot = MeshLinePlot(color=[1,0,0,1]) plot.points = [(i, val) for i, val in enumerate([7,89.6,45,-56.34])] graph.add_plot(plot) layout.add_widget(graph) return layout uiApp().run()
使用前需安装组件:garden install graph
2. KivyMD图表组件
KivyMD提供了符合Material Design风格的图表组件,适合KivyMD项目:
from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.chart import MDLineChart class uiApp(MDApp): def build(self): layout = MDBoxLayout() chart = MDLineChart() chart.data = { "x": [0,1,2,3], "y": [7,89.6,45,-56.34] } chart.x_axis_label = "Time(s)" chart.y_axis_label = "signal (norm)" layout.add_widget(chart) return layout uiApp().run()
确保安装最新版本的KivyMD,部分组件可能需要额外配置。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

