2016-01-06 13 views
5

Sto cercando un modo per generare una trama simile a come EZplot lavora in MATLAB nel senso che io possa scrivere:Plot arbitraria funzione 2-D in Python/pyplot come EZplot di Matlab

ezplot('x^2 + y^2 = y + 5') 

e ottenere un grafico pronto per andare per qualsiasi funzione arbitraria. Mi preoccupo solo del caso in cui ho sia una x che una y.

Ho solo la funzione, e preferirei non provare a calcolare tutti i valori y per un dato intervallo x se non dovessi.

Le poche soluzioni che ho visto suggeriscono o sui limiti decisionali (che non lo sono. Non ci sono dati di test o nulla, solo una funzione arbitraria) o sono tutti per funzioni già definite come y = qualche x equazione che non mi aiuta davvero

Accetterei un po 'se ci fosse un buon modo per simulare Wolfram | Alpha nella loro funzionalità di risoluzione ("risolvere x^2 + y^2 = y + 5 per y" mi darà due funzioni che potrei quindi tracciare separatamente), ma preferisco piuttosto l'ezplot poiché è più o meno istantaneo in MATLAB.

risposta

7

Penso che si potrebbe usare sympy tracciamento e di parse_expr per questo per il vostro esempio, questo potrebbe funzionare come segue

from sympy.plotting import plot_implicit 
from sympy.parsing.sympy_parser import parse_expr 

def ezplot(s): 
    #Parse doesn't parse = sign so split 
    lhs, rhs = s.replace("^","**").split("=") 
    eqn_lhs = parse_expr(lhs) 
    eqn_rhs = parse_expr(rhs) 

    plot_implicit(eqn_lhs-eqn_rhs) 

ezplot('x^2 + y^2 = y + 5') 

Questo può essere fatto il più generale soluzione @EdSmith necessario

0

Si potrebbe utilizzare sympy per risolvere l'equazione e quindi utilizzare le funzioni risultanti per tracciare y su x:

import sympy 

x=sympy.Symbol('x') 
y=sympy.Symbol('y') 
f = sympy.solve(x**2 + y**2 - y - 5, [y]) 
print f 
xpts = (numpy.arange(10.)-5)/10 
ypts = sympy.lambdify(x, f, 'numpy')(xpts) 

# then e.g.: pylab.scatter(xpts, ypts) 
0

funziona bene. Tuttavia, ho un altro suggerimento. È possibile utilizzare il tracciamento di un contorno. È possibile riscrivere la funzione come f(x, y)=0, e quindi utilizzare questo codice

from numpy import mgrid, pi 
import matplotlib.pyplot as plt 

def ezplot(f): 
    x, y = mgrid[-2*pi:2*pi:51, -2*pi:2*pi:51] 
    z = f(x, y) 
    ezplt = plt.contour(x, y, f, 0, colors='k') 
    return ezplt 

Questa è l'idea principale. Naturalmente, è possibile generalizzarlo come la funzione in MATLAB, ad esempio intervalli generali di x e , passando la funzione come stringa, ecc.