最后一个子图中缺少标题
Title missing in the last subplot
我创建了包含示波器测量值的子图。
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"
非常感谢您的意见。抱歉,这是我的第一个 post。
调用 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)
这不需要每次有新数据进来时都清除整个子图。
我创建了包含示波器测量值的子图。 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"
非常感谢您的意见。抱歉,这是我的第一个 post。
调用 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)
这不需要每次有新数据进来时都清除整个子图。