首页 > 解决方案 > 如何在我的 main.py 和 kv 文件中添加条形图?

问题描述

我想添加一个仅显示在进度屏幕上的条形图。我是 Kivy 和 Python 的新手。我正在使用 matplotlib 作为条形图。我想将 Bar.py 代码集成到我的 main.py 代码和 progress.kv 文件中。我被困在如何将它添加到我的 Progress.kv 文件中。

巴.py

这是我要显示的条形图的代码。

import matplotlib.pyplot as plt 

x = [2,4,6,8,10]
y = [6,7,8,2,4]

x2 = [1,3,5,7,9]
y2 = [7,8,2,4,2]

plt.bar(x,y, label='Bars1', color='blue')
plt.bar(x2,y2, label='Bars2', color='c') 

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck It out')
plt.legend()
plt.show()

主文件

我想将条形图代码添加到“进度屏幕”而不是通过。

from kivy.app import App 
#kivy.require("1.10.0")
from kivy.uix.screenmanager import ScreenManager, Screen, 
SlideTransition 
from kivy.properties import ObjectProperty
from kivy.properties import ListProperty
from kivy.uix.image import Image
from kivy.uix.label import Label 
from kivy.graphics import *
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout   
from kivy.config import Config 
from kivy.lang import Builder 
import numpy as np 
from math import sin 
import matplotlib.pyplot as plt
from kivy.garden.matplotlib.backend_kivyagg import 
FigureCanvasKivyAgg
import matplotlib
from kivy.garden.matplotlib import FigureCanvasKivyAgg

#Screens created in kv file. Declare all screens for app.    
class Login(Screen):
    pass    
class Connected(Screen):
    pass    
class Patient(Screen):
    pass
class Progress(Screen):
    pass  
class Goals(Screen):
    pass 
class Training(Screen):
    pass
class Range(Screen):
    pass
class Trial(Screen):
    pass
class Symmetry(Screen):
    pass
class Coordination(Screen):
    pass
class Help(Screen):
    pass
class Manager(ScreenManager):
    pass 
class ScreenApp(App):
    def build(self):
        m = Manager(transition=SlideTransition()) 
        return m
if __name__ == '__main__':
    #sets pixels to pixels on Raspberry Pi tablet
    Config.set('graphics', 'fullscreen', '0')
    Config.set('graphics', 'width', '800')
    Config.set('graphics', 'height', '480')
    ScreenApp().run()

进度.kv

我在 kv 文件中有进度屏幕的所有代码。我想在这里添加设计和细节,但如果没有,那么在 main.py 中。

import matplotlib.pyplot as plt

<Progress>:
canvas.before:
    Color:
        rgb: 1, 1, 1 
    Rectangle:
        pos: self.pos
        size: self.size
Button:
    text:'Patient Menu'
    font_size: 20
    bold: True
    size_hint: None, None
    size: 300, 50
    pos_hint: {'center_x': .5, 'center_y': .1 }   
    color: 1, 1, 1, 1               
    on_press: root.manager.current = 'Patient' 

标签: python-3.xgraphkivybar-chartkivy-language

解决方案


条形图的 Progress.kv 文件

#:import MeshLinePlot kivy.garden.graph.MeshLinePlot
#:import get_color_from_hex kivy.utils
<Progress>:
    BoxLayout:
        orientation: 'vertical'
        padding: [10,20,10,20]
        spacing: 20
    Graph:
            height:1000
            width:1000
            id: graph_test
            xlabel:'Algorithms'
            ylabel:'Accuracy'
            x_ticks_minor:5
            x_tics_major:25
            y_ticks_major:1
            y_grid_label:True
            x_grid_label:True
            padding:5
            x_grid:True
            y_grid:True
            xmin:-0
            xmax:3
            ymin:0
            ymax:100
            pos: 0, root.height
            size: root.width, root.height 

进度的 Python 代码

import itertools

from kivy.app import App

from kivy.utils import get_color_from_hex as rgb

from kivy.uix.screenmanager import Screen, SlideTransition

from kivy.properties import StringProperty,ObjectProperty

from math import sin

from kivy.garden.graph import Graph, MeshLinePlot, BarPlot

colors = itertools.cycle([rgb('7dac9f'), rgb('dc7062'), rgb('66a8d4'), rgb('e5b060')])

class Progress(Screen):

    def assign(self):

        super(Progress,self).__init__()

        self.sensorEnabled = True
        self.graph= self.ids.graph_test

        self.plot = []
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  #x - Red
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  # Y - Green
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  # Z - Blue

        self.reset_plots(self.graph)

        for plot in self.plot:
            self.graph.add_plot(plot)

    def reset_plots(self,graph):
        for plot in self.plot:
            plot.bind_to_graph(graph)
            plot.points = []

        self.counter = 1

推荐阅读