#!/usr/bin/env python
#*-* coding:utf-8 *-*
__author__="Balzano Alessandro aka delta (alfateam123@gmail.com or http://twitter.com/deltainf)"
__license__='CC v3.0 BY-SA'
import re
import logging
import matplotlib.pyplot as plt
import numpy as np
import os
LOG_FILE=os.path.abspath('mathPlotting_log.txt')
logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG)
class Function(object):
"""
this class is the Function class.
the aim of this class is
>evaluate function
"""
def __init__(self,formula):
"""
format: name(par1, par2, ...)=formula
example
>f(x)=2+x
>G(x)=x**2+3**(1/2)
>j(x, y)=x**(y-x)
"""
self.parameters=self.get_parameters(formula)
self.name=self.get_name(formula)
self.formula=self.get_formula(formula)
self.values=[]
self.x_values=[]
def get_parameters(self, formula=None):
if formula:
openPar, closedPar=formula.index('('), formula.index(')')
#tolgo gli spazi con filter, poi ottengo una list splittando la stringa
return filter(lambda c: c!=" ", formula[openPar+1:closedPar]).split(',')
else:
return self.parameters
def get_name(self, formula=None):
if formula:
openPar=formula.index('(')
#il nome si trova prima dei parametri
return formula[:openPar]
else:
return self.name
def get_formula(self, formula=None):
if formula:
equal=formula.index('=')
#la formula si trova dopo il simbolo di uguale (=)
return formula[equal+1:]
else:
return self.formula
def evaluate_with_parameters(self, params=[]):
if not params:
pass
else:
formula=self.formula[:] #we work on a copy of the formula
paramsList=zip(self.parameters, [str(p) for p in params])
for param in paramsList:
regex=re.compile(param[0])
formula=regex.sub('('+str(param[1])+')', formula)
return eval(formula)
def evaluate(self, lowerLimit=-10, higherLimit=10, valueNumber=100):
self.x_values=np.arange(start=lowerLimit, stop=higherLimit,step=float(higherLimit-lowerLimit)/float(valueNumber))
self.values=[self.evaluate_with_parameters([n]*len(self.parameters)) for n in self.x_values]
return self.values
class Plotter(object):
def __init__(self, functions=[]):
self.functions=list()
for f in functions:
self.add_function(f)
def add_function(self, new_function):
if isinstance(new_function, Function):
self.functions.append(new_function)
def remove_function(self, function_name):
if [f.name for f in self.functions].count(function_name):
pass
def plot(self):
""" attualmente plot stampa solo una funzione. """
f=self.functions[0].evaluate()
logging.debug('Plotter::plot %r'%f)
plt.plot(f)
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.show()