2012-12-22 18 views
19

Sto provando a creare una funzione che tracci graficamente la formula a cui la dico.grafico di un'equazione con matplotlib

import numpy as np 
import matplotlib.pyplot as plt 
def graph(formula, x_range): 
    x = np.array(x_range) 
    y = formula 
    plt.plot(x, y) 
    plt.show() 

Quando provo a chiamare il seguente errore accade, credo che sta cercando di fare la moltiplicazione prima che arrivi y = formula.

graph(x**3+2*x-4, range(-10, 11)) 

Traceback (most recent call last): 
    File "<pyshell#23>", line 1, in <module> 
    graph(x**3+2*x-4, range(-10, 11)) 
NameError: name 'x' is not defined 

risposta

16

Questo perché in linea

graph(x**3+2*x-4, range(-10, 11)) 

x non è definito.

Il modo più semplice è passare la funzione che si desidera stampare come stringa e utilizzare eval per valutarla come espressione.

Così il vostro codice con minime modifiche saranno

import numpy as np 
import matplotlib.pyplot as plt 
def graph(formula, x_range): 
    x = np.array(x_range) 
    y = eval(formula) 
    plt.plot(x, y) 
    plt.show() 

e si può chiamare come

graph('x**3+2*x-4', range(-10, 11)) 
+5

non c'è bisogno di usare eval qui, e aggiunge overhead – goncalopp

+0

grazie che ha funzionato perfettamente. pensato che potrebbe essere il caso, ma non avevo idea di come smontarlo –

44

tua ipotesi è giusta: il codice sta cercando di valutare x**3+2*x-4 immediatamente. Sfortunatamente non puoi davvero impedirgli di farlo. La buona notizia è che in Python le funzioni sono oggetti di prima classe, con cui intendo che puoi trattarli come qualsiasi altra variabile. Quindi, per risolvere la vostra funzione, potremmo fare:

import numpy as np 
import matplotlib.pyplot as plt 

def graph(formula, x_range): 
    x = np.array(x_range) 
    y = formula(x) # <- note now we're calling the function 'formula' with x 
    plt.plot(x, y) 
    plt.show() 

def my_formula(x): 
    return x**3+2*x-4 

graph(my_formula, range(-10, 11)) 

Se si voleva fare tutto in una sola riga, è possibile utilizzare ciò che è chiamato una funzione lambda, che è solo una breve funzione senza un nome in cui si don' t uso def o return:

graph(lambda x: x**3+2*x-4, range(-10, 11)) 

e invece di range, si può guardare np.arange (che permette di incrementi non interi), e np.linspace, che permette di specificare l'inizio, l'arresto, e il numero di punti da usare.

+0

grazie per l'aiuto –

+0

C'è un modo per mettere il grafico interattivo in .html, come se fosse un taccuino jupyter, voglio creare un file .html con cui le persone possono giocare. – xappppp

1

Per tracciare un'equazione che non è risolto per una variabile specifica (come cerchio o un'iperbole) :

import numpy as np 
import matplotlib.pyplot as plt 
plt.figure() # Create a new figure window 
xlist = np.linspace(-2.0, 2.0, 100) # Create 1-D arrays for x,y dimensions 
ylist = np.linspace(-2.0, 2.0, 100) 
X,Y = np.meshgrid(xlist, ylist) # Create 2-D grid xlist,ylist values 
F = X**2 + Y**2 - 1 # 'Circle Equation 
plt.contour(X, Y, F, [0], colors = 'k', linestyles = 'solid') 
plt.show() 

più su di esso: http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf

Problemi correlati