Me gustaría trazar ecuaciones implícitas (de la forma f (x, y) = g (x, y), por ejemplo, X^y = y^x) en Matplotlib. es posible?¿Es posible trazar ecuaciones implícitas usando Matplotlib?
Respuesta
no creo que hay un apoyo muy bueno para esto, pero usted podría intentar algo así como
import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid
delta = 0.025
xrange = arange(-5.0, 20.0, delta)
yrange = arange(-5.0, 20.0, delta)
X, Y = meshgrid(xrange,yrange)
# F is one side of the equation, G is the other
F = Y**X
G = X**Y
matplotlib.pyplot.contour(X, Y, (F - G), [0])
matplotlib.pyplot.show()
Ver el API docs para contour
: si el cuarto argumento es una secuencia a continuación, se especifica que las curvas de nivel para trazar . Pero la trama solo será tan buena como la resolución de tus rangos, y hay ciertas características que pueden no ser correctas, a menudo en los puntos de autointersección.
matplotlib no grafica ecuaciones; traza series de puntos. Puede usar una herramienta como scipy.optimize
para calcular numéricamente los puntos y desde x valores (o viceversa) de ecuaciones implícitas numéricamente o cualquier cantidad de otras herramientas según corresponda.
Por ejemplo, aquí se muestra un ejemplo en el que trazar la ecuación implícita x ** 2 + x * y + y ** 2 = 10
en una determinada región.
from functools import partial
import numpy
import scipy.optimize
import matplotlib.pyplot as pp
def z(x, y):
return x ** 2 + x * y + y ** 2 - 10
x_window = 0, 5
y_window = 0, 5
xs = []
ys = []
for x in numpy.linspace(*x_window, num=200):
try:
# A more efficient technique would use the last-found-y-value as a
# starting point
y = scipy.optimize.brentq(partial(z, x), *y_window)
except ValueError:
# Should we not be able to find a solution in this window.
pass
else:
xs.append(x)
ys.append(y)
pp.plot(xs, ys)
pp.xlim(*x_window)
pp.ylim(*y_window)
pp.show()
Si usted está dispuesto a usar algo distinto matplotlib (pero aún pitón), hay salvia:
Un ejemplo: http://sagenb.org/home/pub/1806
Muchos gracias Steve, Mike, Alex. He seguido la solución de Steve (ver el código a continuación). Mi único problema restante es que la trama de contorno aparece detrás de mis líneas de cuadrícula, a diferencia de una trama regular, que puedo forzar al frente con zorder. Cualquier halp más apreciado.
Saludos, Geddes
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
import numpy as np
fig = plt.figure(1)
ax = fig.add_subplot(111)
# set up axis
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# setup x and y ranges and precision
x = np.arange(-0.5,5.5,0.01)
y = np.arange(-0.5,5.5,0.01)
# draw a curve
line, = ax.plot(x, x**2,zorder=100)
# draw a contour
X,Y=np.meshgrid(x,y)
F=X**Y
G=Y**X
ax.contour(X,Y,(F-G),[0],zorder=100)
#set bounds
ax.set_xbound(-1,7)
ax.set_ybound(-1,7)
#produce gridlines of different colors/widths
ax.xaxis.set_minor_locator(MultipleLocator(0.2))
ax.yaxis.set_minor_locator(MultipleLocator(0.2))
ax.xaxis.grid(True,'minor',linestyle='-')
ax.yaxis.grid(True,'minor',linestyle='-')
minor_grid_lines = [tick.gridline for tick in ax.xaxis.get_minor_ticks()]
for idx,loc in enumerate(ax.xaxis.get_minorticklocs()):
if loc % 2.0 == 0:
minor_grid_lines[idx].set_color('0.3')
minor_grid_lines[idx].set_linewidth(2)
elif loc % 1.0 == 0:
minor_grid_lines[idx].set_c('0.5')
minor_grid_lines[idx].set_linewidth(1)
else:
minor_grid_lines[idx].set_c('0.7')
minor_grid_lines[idx].set_linewidth(1)
minor_grid_lines = [tick.gridline for tick in ax.yaxis.get_minor_ticks()]
for idx,loc in enumerate(ax.yaxis.get_minorticklocs()):
if loc % 2.0 == 0:
minor_grid_lines[idx].set_color('0.3')
minor_grid_lines[idx].set_linewidth(2)
elif loc % 1.0 == 0:
minor_grid_lines[idx].set_c('0.5')
minor_grid_lines[idx].set_linewidth(1)
else:
minor_grid_lines[idx].set_c('0.7')
minor_grid_lines[idx].set_linewidth(1)
plt.show()
@Geddes, parece que el soporte para el contorno con respecto a zorder se ha agregado recientemente a la fuente matplotlib. Desde su tronco SVN: http://matplotlib.svn.sourceforge.net/viewvc/matplotlib?view = rev & revision = 8098 – Mark
Puesto que usted ha etiquetado a esta pregunta con sympy, voy a dar un ejemplo.
De la documentación: http://docs.sympy.org/modules/plotting.html.
from sympy import var, Plot
var('x y')
Plot(x*y**3 - y*x**3)
Parece que la nueva sintaxis es 'plot_implicit (Eq (x ** 5 + y ** 5, 1))', y el nuevo enlace de documento [está aquí] (http: //docs.sympy .org/latest/modules/plotting.html). –
Hay un trazador de ecuación implícita (y desigualdad) en sympy. Se crea como parte de GSoC y produce las representaciones como instancias de figuras matplotlib.
Docs en http://docs.sympy.org/latest/modules/plotting.html#sympy.plotting.plot_implicit.plot_implicit
Desde la versión 0.7.2 sympy está disponible como:
>>> from sympy.plotting import plot_implicit
>>> p = plot_implicit(x < sin(x)) # also creates a window with the plot
>>> the_matplotlib_axes_instance = p._backend._ax
Parece que se lanzó ahora. :) –
¿De dónde viene tu 'the_matplotlib_axes_instance'? – theV0ID
'p' es la trama que ha creado. 'p._backend._ax' sería una instancia de ejes y, si lo desea, puede hacer referencia a ella en una nueva variable y usarla para lo que sea que use cualquier instancia de hachas matplotlib. – Krastanov
- 1. Trazado del sistema de ecuaciones (implícitas) en matplotlib
- 2. ¿Es posible trazar una imagen en un mapa con matplotlib?
- 3. Trazar comportamientos propios con matplotlib
- 4. Combinar imagen y trazar con Python Matplotlib
- 5. Cómo trazar cdf en matplotlib en Python?
- 6. matplotlib, puede trazar pero no dispersar
- 7. Cómo trazar vectores matemáticos 2D con matplotlib?
- 8. Trazar los ejes logarítmicos con matplotlib en python
- 9. Dónde trazar la línea: ¿es posible amar LINQ demasiado?
- 10. Representar ecuaciones usando Javascript (o cualquier lado del cliente)
- 11. Cómo trazar una línea de color de degradado en matplotlib?
- 12. Cómo trazar pldf empírico en matplotlib en Python?
- 13. Acciones personalizadas usando intenciones implícitas entre aplicaciones
- 14. Cómo trazar una imagen con un eje y no lineal con Matplotlib usando imshow?
- 15. ¿Cómo acelerar el matplotlib al trazar y guardar muchas figuras?
- 16. Cómo trazar una colección de parches 3D en matplotlib?
- 17. Cómo trazar un gráfico de barras muy simple (Python, Matplotlib) usando el archivo de entrada * .txt?
- 18. ¿Cómo resolver ecuaciones matemáticas usando core.logic
- 19. ¿Es posible visualizar un conjunto 2D como un trazado polar usando Matplotlib imshow()?
- 20. Trabajando con funciones implícitas en Mathematica
- 21. ¿Es posible dibujar un diagrama verticalmente con python matplotlib?
- 22. matplotlib: ¿es posible cambiar el color de fondo?
- 23. Cómo trazar en mi GUI
- 24. renderizar las ecuaciones de los usuarios en Python
- 25. C# conversiones implícitas
- 26. ¿Puedo trazar una línea usando jQuery?
- 27. Bloque de ecuaciones de la izquierda de ecuaciones
- 28. Trazar un gráfico acumulativo de python datetimes
- 29. Resolviendo ecuaciones en .NET
- 30. C++ conversiones implícitas
Esta es una buena solución. Mi solución es una forma más manual de obtener la misma información utilizando el mismo concepto subyacente: configurar la ecuación implícita como f (x, y) tal que f (x, y) = 0 es equivalente a la ecuación implícita original y aislando su contorno cero. –