как справиться с асимптотой / разрывом с Matplotlib

При построении графика с разрывом / асимптотой / сингулярностью / независимо от того, существует ли какой-либо автоматический способ предотвратить использование Matplotlib «присоединения точек» к «перерыву»? (см. код / ​​изображение ниже).
Я прочитал, что у Sage есть средство [detect_poles], которое выглядело хорошо, но я действительно хочу, чтобы он работал с Matplotlib.

import matplotlib.pyplot as plt import numpy as np from sympy import sympify, lambdify from sympy.abc import x 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 xx = np.arange(-0.5,5.5,0.01) # draw my curve myfunction=sympify(1/(x-2)) mylambdifiedfunction=lambdify(x,myfunction,'numpy') ax.plot(xx, mylambdifiedfunction(xx),zorder=100,linewidth=3,color='red') #set bounds ax.set_xbound(-1,6) ax.set_ybound(-4,4) plt.show() 

разрыв

  • Как вычислить выражение с помощью sympy в python
  • Как форматировать контурные линии от Matplotlib
  • SymPy и квадратные корни комплексных чисел
  • Sympy: Решение матриц в конечном поле
  • Проблема Python-Sympy с проверкой равенства выражения при оценке = False
  • вызывать lambdify в цикле, избегать явного вызова
  • Установка версии github пакета с Anaconda
  • Почему мой соперник в Симпи не согласен с Rician in Scipy?
  • 3 Solutions collect form web for “как справиться с асимптотой / разрывом с Matplotlib”

    Это не может быть изящное решение, которое вы ищете, но если вы просто хотите получить результаты в большинстве случаев, вы можете «скопировать» большие и малые значения ваших построенных данных на +∞ и -∞ соответственно. Matplotlib не описывает их. Конечно, вы должны быть осторожны, чтобы не сделать ваше разрешение слишком низким или слишком высокий порог отсечения.

     utol = 100. ltol = -100. yy = 1/(xx-2) yy[yy>utol] = np.inf yy[yy<ltol] = -np.inf ax.plot(xx, yy, zorder=100, linewidth=3, color='red') 

    Используя маскированные массивы, вы можете не рисовать выделенные области кривой.

    Чтобы удалить сингулярность при x = 2:

     import matplotlib.numerix.ma as M # for older versions, prior to .98 #import numpy.ma as M # for newer versions of matplotlib from pylab import * figure() xx = np.arange(-0.5,5.5,0.01) vals = 1/(xx-2) vals = M.array(vals) mvals = M.masked_where(xx==2, vals) subplot(121) plot(xx, mvals, linewidth=3, color='red') xlim(-1,6) ylim(-5,5) 

    Эта простая кривая может быть более понятной, по которой исключены точки:

     xx = np.arange(0,6,.2) vals = M.array(xx) mvals = M.masked_where(vals%2==0, vals) subplot(122) plot(xx, mvals, color='b', linewidth=3) plot(xx, vals, 'rx') show() 

    alt text http://i44.tinypic.com/qoy8sh.png

    Нет, я думаю, что нет встроенного способа сказать matplotlib игнорировать эти моменты. В конце концов, он просто соединяет точки и ничего не знает о функциях или о том, что происходит между точками.

    Тем не менее, вы можете использовать sympy чтобы найти полюса, а затем исправить непрерывные части вашей функции вместе. Вот какой-то, по общему признанию, уродливый код, который делает именно это:

     from pylab import * from sympy import solve from sympy.abc import x from sympy.functions.elementary.complexes import im xmin = -0.5 xmax = 5.5 xstep = 0.01 # solve for 1/f(x)=0 -- we will have poles there discontinuities = sort(solve(1/(1/(x-2)),x)) # pieces from xmin to last discontinuity last_b = xmin for b in discontinuities: # check that this discontinuity is inside our range, also make sure it's real if b<last_b or b>xmax or im(b): continue xi = np.arange(last_b, b, xstep) plot(xi, 1./(xi-2),'r-') last_b = b # from last discontinuity to xmax xi = np.arange(last_b, xmax, xstep) plot(xi, 1./(xi-2),'r-') xlim(xmin, xmax) ylim(-4,4) show() 

    пример http://i43.tinypic.com/30mvbzb.jpg

    Python - лучший язык программирования в мире.