2013-09-05 5 views
-1

Ok heres round 2 поблагодарить ребят за помощь в решении предыдущей проблемы, но я вернулся к тому, к чему я начал, к сожалению. Все это произошло, когда я попытался добавить строку к этому графику. Входящие данные представляют собой список, поступающий из другой программы. Для целей тестирования у меня есть другая программа, которая выплюнула [100, 110]. Я хочу 100 для одной строки и 110 для другой. В конце концов это будут входящие данные от Arduino, которые будут представлять собой данные в реальном времени. Я продолжаю получать эту ошибку.Проблема с графикой на Python 2

AttributeError       Traceback (most recent call last) 
/Users/Tyler/Desktop/Arduino/Graphing_22.py in on_redraw_timer(self, event) 
284    #self.data.extend(self.datagen.next()) 

285 
--> 286   self.draw_plot() 
287 
288  def on_exit(self, event): 

/Users/Tyler/Desktop/Arduino/Graphing_22.py in draw_plot(self) 
240     visible=self.cb_xlab.IsChecked()) 
241 
--> 242   self.plot_data.set_xdata(np.arange(len(self.data[0]))) 
243   #self.plot_data.set_xdata(np.arange([1,1000]) 

244   self.plot_data.set_ydata(np.array(self.data[1])) 

AttributeError: 'list' object has no attribute 'set_xdata' 

Вот код для входящих данных и где ошибка возникает.

def __init__(self): 
    wx.Frame.__init__(self, None, -1, self.title) 

    self.datagen = DataGen() 
    self.data = self.datagen.next() 
    #splitting data at ' 
    #self.data = [self.datagen.next().split(",") 
    self.paused = False 

if self.cb_grid.IsChecked(): 
     self.axes.grid(True, color='gray') 
    else: 
     self.axes.grid(False) 

    # Using setp here is convenient, because get_xticklabels 
    # returns a list over which one needs to explicitly 
    # iterate, and setp already handles this. 
    # 
    pylab.setp(self.axes.get_xticklabels(), 
       visible=self.cb_xlab.IsChecked()) 

    self.plot_data.set_xdata(np.arange(len(self.data[0]))) 
    #self.plot_data.set_xdata(np.arange([1,1000]) 
    self.plot_data.set_ydata(np.array(self.data[1])) 


    self.canvas.draw() 

Спасибо за помощь, ребята!

+0

Как вы определяете 'self.plot_data'? –

+0

self.plot_data = self.axes.plot ( self.data [0], ширина линии = 1, цвета = (1, 1, 0), ) #adding линии на участок self.plot_data = self.axes.plot ( self.data [1], ширина линии = 1, color = (1, 2, 0),) –

+1

Вы можете написать свой заголовок вопроса более наглядно? 2 – tacaswell

ответ

0

Учитывая код от вашего комментария:

self.plot_data = self.axes.plot(self.data[0], linewidth=1, color=(1, 1, 0),) 
self.axes.plot(self.data[1], linewidth=1, color=(1, 2, 0),) 

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

Либо

self.plot_data = self.axes.plot(self.data[0], linewidth=1, color=(1, 1, 0),)[0] 

или

self.plot_data[0].set_xdata(np.arange(len(self.data[0]))) 
+0

Хорошо, я понимаю, что вы говорите, но я хочу, чтобы два строки, поэтому мой список, например, [100,110] Я хочу, чтобы одна строка для 100, а другая для 110 –

+0

, это также можно сделать более лаконично, как 'ln, = plot (...)' – tacaswell

-1

Оказывается способ определения plot_data возвращает список. Кроме того, я не уверен, что axes.plot(*args, **kwargs), когда используется с одним аргументом, используется для данных по обеим осям. Я проверил в документации и нашел это:

plot(x, y)  # plot x and y using default line style and color 
plot(x, y, 'bo') # plot x and y using blue circle markers 
plot(y)   # plot y using x as index array 0..N-1 
plot(y, 'r+')  # ditto, but with red plusses 

Возвращаемое значение - это список строк, которые были добавлены. Там есть ошибка типа. Вот документация set_xdata(x):

set_xdata(x) 
    Set the data np.array for x 
    ACCEPTS: 1D array 

И это из класса:

matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, 
marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, 
markerfacecolor=None, markerfacecoloralt='none', fillstyle='full', 
antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, 
solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs) 

Таким образом, вы могли бы рассмотреть вопрос об объявлении что-то вроде self.line = plt.lines.Line2D(self.x_data, self.y_data, linewidth=1, color=(1,1,0)), где вам придется использовать что-то вроде:

self.x_data = self.axes.plot(self.data[0]) 
self.y_data = self.axes.plot(self.data[1]) 

Надеюсь, это поможет! Я ссылка:

update matplotlib plot

http://matplotlib.org/api/axes_api.html http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_xdata

+0

Хорошо, что помогает тонну. Теперь позвольте мне спросить, что я хочу сделать, это иметь ось x как раз, как сейчас, и иметь ось y в качестве входящих данных. Таким образом, будет две строки, одна из которых будет считывать данные из элемента 0 из моего списка и другие данные чтения из 1 элемента моего списка. –

+0

Также это почти сработало. Я не получаю никаких сообщений об ошибках, но не строит никаких строк. –

+0

Вы пишете plt.plot() в конце? – Cawb07