Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Python matplotlib Построение гиперболы

#python #график #matplotlib


Добрый день! Хочу при помощи matplotlib построить, например, гиперболу. Есть следующий код:

import matplotlib.pyplot as plt
import pylab, math
xmin = -200
xmax = 200
dx = 0.1

xlist = [float(x) for x in range(xmin,xmax)]
ylist = [float(1/x) for x in range(xmin,xmax)]


ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.grid(True)
plt.title('График функции ')
pylab.plot(xlist,ylist)
pylab.savefig('123.png')


Пример работы на картинке
Как видно, между двумя ветвями функции есть отрезок. Я знаю, что это связанно с тем,
что есть значение крайних точек ветвей, а плот их соединяет. Но это мне не нужно, мне
нужно получить нормальный график. Если бы этот график был всегда гиперболой, было бы
нормально. Но этим графиком может быть любой график с разрывом. Как избежать этого
отрезка? Видел способы, но там использовались дополнительные пакеты(numpy), я не хочу
тянуть их в этот код
[]
    


Ответы

Ответ 1



Для начала повторюсь, что matplotlib уже внутри себя использует numpy, так что избежать его не выйдет. Тем не менее, вот первая версия без numpy в основном коде: import matplotlib.pyplot as plt import decimal # Это замена np.arange def arange(start, stop, step): while start < stop: yield start start += decimal.Decimal(step) hyperbola = lambda x: 1 / x def asymptote_checker(argument, function): try: function(argument) return True except ZeroDivisionError: return False xmin = -20 xmax = 20 dx = 0.1 xlist = [round(x, 4) for x in arange(xmin, xmax, dx)] ylist = [hyperbola(x) if asymptote_checker(x, hyperbola) else float('nan') for x in xlist] plt.plot(xlist, ylist) plt.show() С numpy выйдет покороче: import matplotlib.pyplot as plt import decimal import numpy as np xmin = -20 xmax = 20 dx = 0.1 xlist = np.around(np.arange(xmin, xmax, dx), decimals=4) ylist = 1 / xlist plt.plot(xlist, ylist) plt.show() Пара общих важных моментов для обеих версий: числа в xlist вместо нуля могут внезапно превратиться в мусор типа 7.0485345e-13 или типа того, что выльется в огромное значение по оси Oy. Второй момент - matplotlib игнорирует (и не соединяет точки) числа типа +inf, -inf, NaN - их можно пометить руками, доверить это numpy или использовать numpy masked array.

Комментариев нет:

Отправить комментарий