2013-04-16 1 views
1

Это часть многопоточного скрипта python (threading.thread) с передачей данных через очереди, у которых есть ошибка при попытке построения данные, собранные с использованием pyplot в matplotlib.Python Error: Threaded Matplotlib (Pyplot) Plotting - x и y не имеют того же первого измерения

Весь этот скрипт работал в предыдущей версии; Единственное изменение - хранить и загружать массивы данных, используя pickle.dump и pickle.load соответственно. В этой отладочной версии загрузка не включена.

Вот соответствующий код, который выходит из строя, разогнали содержащего нить:

в главном цикле (НИТИ):

elif kbcheck == 'p': 
        print "I KNOW YOU TYPED P" # Debug to see if plotting is triggered. 
        PLOTFLAGQ.put(1) 

В ОБРАБОТКИ ДАННЫХ НИТИ:

self.PLOTQL = [self.RAL, self.THD_avgL, self.VacL, 
         self.IacL, self.PacL, self.VdcL, 
         self.IdcL, self.PdcL, self.tempL] 
if not self.PLOTFLAGQ.empty(): 
       self.plotflag = self.PLOTFLAGQ.get() 
       self.PLOTQ.put(self.PLOTQL) 

В ПЛОТИРОВАННОЙ НИТЕ:

if not self.PLOTQ.empty(): 
       (self.RAL, self.THD_avgL, self.VacL, self.IacL, 
       self.PacL, self.VdcL, self.IdcL, self.PdcL, 
       self.TempL) = self.PLOTQ.get() 
self.XaxisL = [] 
       for i in range(len(self.VacL)): 
        self.XaxisL.append(i+1) 
self.fig = pyplot.figure() 
self.gs = gridspec.GridSpec(6,1, height_ratios = [1,2,2,2,2,2]) 
self.sT = pyplot.subplot(self.gs[0]) 
self.sT.yaxis.set_major_locator(pyplot.MaxNLocator(5)) 
self.sV = pyplot.subplot(self.gs[1]) 
self.sV.yaxis.set_major_locator(pyplot.MaxNLocator(10)) 
self.Va = self.sV.plot(self.XaxisL,self.VacL, 
             '-b',label = 'Voltage (AC)') 

Вот информация отладки:

17 
Here is the info in the Plot Thread 
the length of VacL is: 17 
[250.119, 250.156, 250.19, 250.193, 250.206, 250.158, 250.107, 250.103, 250.159, 250.156, 250.146, 250.093, 250.084, 250.095, 250.134, 250.0 
35, 249.994] 

the length of the x axis is: 17 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] 

Над выхода показывает подсчет выборки (17), то список массив Vac и его длина, а затем массив оси х (производные от длины другие значения).

Здесь ошибка:

Exception in thread Thread-5: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "C:\Projects\PythonScripts\Matthew_Threading_2_v0.3.3db.py", line 273, in run 
    self.Va = self.sV.plot(self.XaxisL,self.VacL,"-b",label = "Voltage AC") 
    File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 3848, in plot 
    for line in self._get_lines(*args, **kwargs): 
    File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 323, in _grab_next_args 
    for seg in self._plot_args(remaining, kwargs): 
    File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 300, in _plot_args 
    x, y = self._xy_from_xy(x, y) 
    File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 240, in _xy_from_xy 
    raise ValueError("x and y must have same first dimension") 
ValueError: x and y must have same first dimension 

Я переписал всю программу в два раза, и переписать только спасительную нить (ту часть, которая, кажется, разорвать заговоры) еще два раза, и не могу понять, что вызывает эту ошибку.

Если кто-нибудь может мне помочь, что было бы весьма полезно. Спасибо!

+0

почему вы не делаете 'self.XaxisL = np.arange (len (self.VacL)) + 1'? – tacaswell

+0

Можете ли вы воспроизвести эту ошибку _not_ в своей программе с резьбой? Это в коде, который мы могли бы запустить/протестировать? – tacaswell

+0

Почему вы все это делаете в атрибутах? Не могли бы вы сделать большинство переменных в построении функции потока вместо локальных переменных вместо атрибутов? Я сильно подозреваю, что у вас действительно есть условие гонки, которое мы не можем вам помочь с предоставленной информацией. – tacaswell

ответ

0

Заменить замышляет команду с этим кодом:

try: 
    self.Va = self.sV.plot(self.XaxisL,self.VacL,'-b',label = 'Voltage (AC)') 
except ValueError: 
    print len(self.XaxisL), len(self.VacL) 
    print self.XaxisL, self.VacL 

и посмотреть, что получится. Я подозреваю, что у вас есть состояние гонки.

Смежные вопросы