2013-04-23 3 views
0

У меня есть класс, который имеет много функций построения графика. Мое намерение состоит в том, чтобы сгруппировать все графики в одном изображении с помощью метода subplot matplotlib, в зависимости от того, сколько функций я вызываю.увеличить счетчик каждый раз, когда я вызываю функцию внутри класса

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

Любая помощь приветствуется. Заранее спасибо.

import itertools 
import numpy as np 
from matplotlib import pyplot as plt 

class Base(object): 
    def __init__(self, a, multiPlot=True, numColGraph=None, numRowGraph=None, 
       figSize=None, DPI=None, num=None): 

     self.a = a 
     self.x = np.linspace(0, 5) 

     if multiPlot: 
     self.nCG = numColGraph 
      self.nRG = numRowGraph 
     else: 
      self.nCG = 1 
      self.nRG = 1 

     if figSize and DPI: 
      self.thePlot = plt.figure(figsize=figSize, dpi=DPI) 

     if num == 0: 
      self.plotId = itertools.count(1) 

    def createPlot1(self): 
     y = self.x**(a/2) 
     self.thePlot.add_subplot(self.nRG, self.nCG, next(self.plotId)) 
     plt.plot(self.x, y, label=str(self.a)+'/2') 

    def createPlot2(self): 
     y = self.x**a 
     self.thePlot.add_subplot(self.nRG, self.nCG, next(self.plotId)) 
     plt.plot(self.x, y, label=self.a) 

    def createPlot3(self): 
     y = self.x**(2*a) 
     self.thePlot.add_subplot(self.nRG, self.nCG, next(self.plotId)) 
     plt.plot(self.x, y, label=str(self.a)+'*2') 


if __name__ == "__main__": 

    A = np.linspace(0, 2, 5) 

    for i, a in enumerate(A): 
     Instance = Base(a, numColGraph=3, numRowGraph=len(A), 
       figSize=(12,10), DPI=100, num=i) 
     Instance.createPlot1() 
     Instance.createPlot2() 
     Instance.createPlot3() 

    plt.show() 
+2

Когда вы говорите: «Это не работает», можете ли вы быть более конкретным о том, что вы ожидаете работать, а что вместо этого происходит? – SethMMorton

+0

Ну, для начала я получаю следующее сообщение об ошибке: «Базовый» объект не имеет атрибута «plotId», но я его уменьшил. Я хочу получить, после цикла, три графика на том же рисунке (график, о, как вы его называете). У меня возникает проблема с увеличением переменной plotId при каждом вызове функции. Извините, если я не сделаю свое ясное, английский не мой родной язык. – ezitoc

+1

Я подозреваю, что вы неправильно используете переменную 'plotId'. Он получает только 'if num == 0', но вы создаете объекты' Base' с 0 раз (из перечисления), а не снова. – bbayles

ответ

1

Как минимум, у вас есть неопределенные переменные. Я вижу эту картину (или нечто подобное) три раза:

y = self.x**(2*a) 

Но ни в одном из этих случаев вы определили a. Возможно, вы имеете в виду:

y = self.x**(2*self.a) 
+0

Да, извините, я закончил использовать незавершенный пример. Простите за это. Я исправил. – ezitoc

+0

@ezitoc Есть еще ошибки, отмеченные cwallenpoole в вашем вопросе. – Hooked

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