matplotlib 仪表动态更新
matplotlib gauge update dynamically
我尝试在 matplotlib 中创建这样的 Gauge:
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 程序中的小部件。他们只剩下一个问题:当值更新时,仪表突然变化但我希望看到仪表更新(所以我想看到楔形的角度变化,所以移动缓慢)我希望你们能帮我。
或者也许他们已经是一个很好的库,可以在 pyqt4 GUI 中插入漂亮的仪表?
感谢您提前帮助我!
我自己解决了。在上面的代码中,程序本身会生成一个介于 0-10 之间的数字(在 update_figure 方法中)。假设数字是四。
这意味着在楔形上:
theta1 = 180-number/10*179
#as always theta2:
theta2 =180
程序在 5 秒后生成另一个数字(例如:6.5)
这意味着楔形的属性必须改变。
通过在对象 Gauge 的 update_figure 方法中添加 for 循环:
def update_figure(self):
self.timeClear=self.timeClear+1
#the old value becomes temp
temp=self.new_data
self.number=np.random.random(1)*10
self.new_data=180-self.number/10*179
step=(self.new_data-temp)/10
for x in range(10):
self.wedge.set_theta1(temp+step*x)
self.axes.add_patch(self.wedge)
time.sleep(1/10)
self.draw()
通过将旧数和新数之差除以 10。您可以通过添加此 for 循环轻松地动态缓慢地更改量规,并让楔形自身绘制 1O 次(随着 theta1 的变化从旧号码到新号码的 10 个步骤)休眠时间为 100 毫秒。如果这个解释不清楚可以问我,我会再解释一遍。
我尝试在 matplotlib 中创建这样的 Gauge:
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 程序中的小部件。他们只剩下一个问题:当值更新时,仪表突然变化但我希望看到仪表更新(所以我想看到楔形的角度变化,所以移动缓慢)我希望你们能帮我。 或者也许他们已经是一个很好的库,可以在 pyqt4 GUI 中插入漂亮的仪表?
感谢您提前帮助我!
我自己解决了。在上面的代码中,程序本身会生成一个介于 0-10 之间的数字(在 update_figure 方法中)。假设数字是四。
这意味着在楔形上:
theta1 = 180-number/10*179
#as always theta2:
theta2 =180
程序在 5 秒后生成另一个数字(例如:6.5)
这意味着楔形的属性必须改变。
通过在对象 Gauge 的 update_figure 方法中添加 for 循环:
def update_figure(self):
self.timeClear=self.timeClear+1
#the old value becomes temp
temp=self.new_data
self.number=np.random.random(1)*10
self.new_data=180-self.number/10*179
step=(self.new_data-temp)/10
for x in range(10):
self.wedge.set_theta1(temp+step*x)
self.axes.add_patch(self.wedge)
time.sleep(1/10)
self.draw()
通过将旧数和新数之差除以 10。您可以通过添加此 for 循环轻松地动态缓慢地更改量规,并让楔形自身绘制 1O 次(随着 theta1 的变化从旧号码到新号码的 10 个步骤)休眠时间为 100 毫秒。如果这个解释不清楚可以问我,我会再解释一遍。