You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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组件:
    garden install matplotlib
    
    注:Windows环境下可能需要用garden.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:44:53