matplotlib仪表动态更新

2024-09-30 20:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在matplotlib中创建一个这样的量规:

http://www.highcharts.com/demo/gauge-solid

差不多可以了。以下是目前为止的代码:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    from matplotlib.patches import Wedge
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as                 FigureCanvas

    from matplotlib.figure import Figure
    import sys,os
    from PyQt4 import QtGui,QtCore

    class MyMplCanvas(FigureCanvas):
        """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
        def __init__(self, parent=None):
            self.fig = Figure(facecolor='#DBE0E4')
            self.axes = self.fig.add_subplot(111,axisbg='#DBE0E4')
            self.axes.axis('off')
            #here I create the contour of the gauge
            #the two horizontal lines
            x1=[-1,-0.6]
            x2=[0.6,1.0]
            y=[0.004,0.004]
            self.axes.plot(x1,y,color='#646464')
            self.axes.plot(x2,y,color='#646464')
            #and the 2 circles(inner and outer)
            circle1=plt.Circle((0,0),radius=1,fill=False)
            circle1.set_edgecolor('#646464')
            circle1.set_facecolor(None)

            circle2=plt.Circle((0,0),radius=0.6,fill=False)
            circle2.set_edgecolor('#646464')
            circle2.set_facecolor(None)
            self.axes.add_patch(circle1)
            self.axes.add_patch(circle2)

            #Scaling of the figure
            self.axes.axis('scaled')
            self.axes.set_xlim(-1.1,1.1)
            self.axes.set_ylim(0,1.1)

            FigureCanvas.__init__(self, self.fig)
            self.setParent(parent)

            FigureCanvas.updateGeometry(self)


    class Gauge(MyMplCanvas):
        def __init__(self,meter,parent=None):
            MyMplCanvas.__init__(self)


            self.patches=[]
            #here I create the wedge to start
            self.wedge=Wedge((0,0),0.99,1,179,width=0.38,facecolor='#FF0000')
            self.patches.append(self.wedge)
            self.timeClear=0
            self.update_figure()
            #self.Online_meter=meter
            #here starts the update
            timer=QtCore.QTimer(self)
            timer.timeout.connect(self.update_figure)
            timer.start(5000)

        def update_figure(self):
            #here is the update command
            #every 5 sec, I call value from a measurement instrument
            #here I let the program generate random values
            self.timeClear=self.timeClear+1
            #new_data=self.Online_meter.__call__()
            self.wedge.set_theta1(180-np.random.random(1)*10/10*179)
            self.axes.add_patch(self.wedge)    
            self.draw()

到目前为止,这是有效的。编写代码的目的是将它作为一个小部件添加到PyQt 4程序中。他们只剩下一个问题:当值更新时,量规突然改变,但我想看看量规是否更新(所以我想看看楔角的变化,移动如此缓慢),希望你们能帮我。 或者他们已经是一个很好的库,可以在pyqt4gui中插入好看的仪表?在

谢谢你提前帮了我!在


Tags: thefromimportselfnoneherematplotlibinit
1条回答
网友
1楼 · 发布于 2024-09-30 20:22:48

我自己解决的。在上面的代码中,程序本身生成一个介于0-10之间的数字(在update_figure方法中)。Supose数字是四。在

这意味着在楔子上:

    theta1 = 180-number/10*179  
    #as always theta2:
    theta2 =180 

5秒后,程序生成另一个数字(例如:6.5)

这意味着楔块的特性必须改变。在

通过在对象量规的update_figure方法中添加for循环:

^{pr2}$

用新旧数之差除以10。你可以很容易地动态和缓慢地改变量规,加入这个for loop,让楔子自己画10次(θ1从旧数字到新数字在10步内变化),睡眠时间为100毫秒。如果这个解释不清楚,请问我,我会再解释一遍。在

相关问题 更多 >