1

我创建了包含从示波器获取的测量值的子图。N 是决定子图数量的参数。问题是当有 1 个地块时,它没有标题或 y 标签。当有多个地块时,只影响最后一个地块

##Plots a time trend of the active measurements on a MSO4/5/6
##Pierre Dupont - Tek - 2020

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import visa
import sys

rm = visa.ResourceManager()
scope = rm.open_resource('TCPIP::192.168.1.34::INSTR')

##determines number of active measurements
def active_measurements():
    meas_list=scope.query('MEASUrement:LIST?')
    N=meas_list.count(",")+1
    if "NONE" in meas_list:
        scope.close()
        sys.exit("No measurement found, exiting...")
    return(N)

N=active_measurements()
plots_set={} ##dictionary that will contain the subplots. One per active measurement.
ydata_set={} ##dictionary that will contain the array of logged data
fig=plt.figure()
IDN=scope.query('*idn?')
fig.suptitle('Measurement data logger / connected to: '+IDN,fontsize=10,color='purple')
plt.style.use('ggplot')

##definition of the subplots in the dictionary + subplots titles and axis legend
for i in range (1,N+1):
    plots_set["ax"+str(i)]=fig.add_subplot(N,1,i)
    meas_type=scope.query('MEASUrement:MEAS{}:TYPe?'.format(i))
    plots_set["ax"+str(i)].set_title(meas_type,fontsize='small')
    meas_unit=scope.query('MEASUrement:MEAS{}:YUNIT?'.format(i))
    plots_set["ax"+str(i)].set_ylabel(meas_unit.replace('"',''))
    print(i,meas_type,meas_unit)
    ydata_set["y"+str(i)]=[]


index=0
x=[]

## function that runs at every data log. Appends the arrays of measurement 
## data and updates the subplots
def animate(i):
    global index
    index+=1
    x.append(index)
    t=1
    for k,k2 in zip(ydata_set,plots_set):
        scope.query('*OPC?')
        M=float(scope.query('MEASUrement:MEAS{}:RESUlts:CURRentacq:MEAN?'.format(t)))
        t+=1
        plt.cla()
        ydata_set[k].append(M)
        plots_set[k2].plot(x,ydata_set[k],marker="X",linewidth=0.5,color='blue')


##frames parameter = number of logs // interval parameter = time between 2 logs (in ms)
ani=FuncAnimation(plt.gcf(), animate, frames=1000, interval=500, repeat=False)
plt.tight_layout()
plt.show()

scope.close()

输出:

1 RISETIME
 "s"

2 POVERSHOOT
 "%"

3 MAXIMUM
 "V"

例如,第三个情节错过了 y 标签和标题

非常感谢您的投入。抱歉,这是我的第一篇文章。

4

1 回答 1

0

调用plt.cla()会清除当前的(在这种情况下是最近创建的)轴。这将清除所有行、标签、标题等。如果您想plt.cla()在动画功能中使用,您需要每次都重置它们,例如

def animate(i):
    # ...
    plt.cla()
    plt.set_title("title")
    plt.set_ylabel("label")
    # etc

另一种方法是用来set_data更新你的情节,即

lines = [subplot.plot(x, ydata, marker="X", linewidth=0.5, color='blue')[0] 
         for subplot, ydata in zip(plots_set, ydata)]
def animate(i):
    global index
    index+=1
    x.append(index)
    t=1    
    for ydata, line in zip(ydata_set, lines):
        scope.query('*OPC?')
        M=float(scope.query('MEASUrement:MEAS{}:RESUlts:CURRentacq:MEAN?'.format(t)))
        t+=1
        ydata.append(M)
        line.set_data(x, ydata)

这将不需要在每次新数据进入时清除整个子图。

于 2020-03-29T01:02:05.103 回答