2016-01-06 2 views
5

ich nach einer Möglichkeit, ein Grundstück zu erzeugen ähnlich, wie EZplot arbeitet in MATLAB, dass kann ich geben:Plot beliebige 2-D-Funktion in Python/pyplot wie Matlab EZplot

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

und bekommen Graph bereit für jede beliebige Funktion. Ich mache mir nur Gedanken über den Fall, in dem ich sowohl ein x als auch ein y habe.

Ich habe nur die Funktion, und ich würde wirklich lieber nicht versuchen, alle y-Werte für einen bestimmten x-Bereich zu berechnen, wenn ich nicht müsste.

Die wenigen Lösungen, die ich gesehen habe, sind entweder über Entscheidungsgrenzen (was ist das nicht. Es gibt keine Testdaten oder irgendetwas, nur eine beliebige Funktion) oder sind alle für Funktionen bereits als y = einige x Gleichung definiert hilft mir nicht wirklich.

Ich würde etwas akzeptieren, wenn es einen guten Weg gab, Wolfram | Alpha in ihrer Auflösungsfunktionalität nachzuahmen ("löse x^2 + y^2 = y + 5 für y" gibt mir zwei Funktionen, die ich dann getrennt grafisch darstellen könnte)), sondern bevorzugen den ezplot als mehr oder weniger Instant in MATLAB.

Antwort

7

Ich glaube, Sie sympy Plotten und parse_expr für diese für Ihr Beispiel verwenden, könnte dies als würde funktionieren folgt

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') 

Dies kann je nach Bedarf

0

Sie sympy verwenden könnte die Gleichung zu lösen und dann die daraus resultierenden Funktionen y über x für das Plotten:

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

@EdSmith Lösung als General gemacht werden funktioniert gut. Trotzdem habe ich einen anderen Vorschlag. Sie können eine Kontur plotten. Sie können Ihre Funktion als f(x, y)=0, neu zu schreiben und dann diesen Code

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 

Das ist die Hauptidee ist verwenden. Natürlich können Sie es wie die Funktion in MATLAB verallgemeinern, wie allgemeine Intervalle von x und y, die Funktion als String übergeben, usw.