Я использую приведенный ниже код для рисования кривой ECC y^2+x^3+x^2 =0
import numpy as np
import matplotlib.pyplot as plt
import math
def main():
fig = plt.figure()
ax = fig.add_subplot(111)
y, x = np.ogrid[-2:2:1000j, -2:2:1000j]
ax.contour(x.ravel(), y.ravel(), pow(y, 2) + pow(x, 3) + pow(x, 2) , [0],colors='red')
ax.grid()
plt.show()
if __name__ == '__main__':
main()
Выход
Однако ожидаемое изображение таково.
Как видим, изолированная точка (0,0) не нарисована. Любые предложения по решению этой проблемы?
@Topaco Я просмотрел точки огрида, и 0,0
не указан. Да, я думал нарисовать точку сам, однако это может ввести в заблуждение меня и других. Для этой кривой мы знаем, что есть акнода, что, если мы не знаем. Как можно сделать кривую более надежной. Я увеличил j
, это тоже не помогает. Я думаю, что не знаю о настройке z=0.0002
.
Я также попытался выбрать размер шага, чтобы точка 0,0 была включена, например. с 1001j. Но это не решило проблему. Конечно, лучшим решением было бы, если бы приложение каким-то образом само указывало на такие точки. Может и есть такая опция (в библиотеке много параметров), но настройки я не нашел (впрочем, я тоже не очень хорошо знаю эту библиотеку). Вы также можете использовать маскированный массив, т. е. рассматриваемые точки маскируются и неявно помечаются при отображении. Но опять же, вам нужно уже знать точки, а это не то, что вам нужно (и это действительно не нужно для одной точки).
@Topaco используются розыгрыши здесь, к вашему сведению.
Как уже упоминалось в комментарии, кажется, что одна точка не отображается как контур. Лучшим решением будет, если приложение каким-то образом само укажет на такие точки. Возможно, библиотека это позволяет, но я не нашел способа и поэтому показываю здесь два обходных пути:
Опция 1:
Изолированная точка в (0,0) может быть отмечена явно:
ax.plot(0, 0, color = "red", marker = "o", markersize = 2.5, zorder = 10)
В случае нескольких точек хорошим выбором будет маскированный массив, здесь.
Вариант 2:
График можно немного изменить вокруг z = 0, например. г = 0,0002:
z = pow(y,2) + pow(x, 2) + pow(x, 3)
ax.contour(x.ravel(), y.ravel(), z, [0.0002], colors='red', zorder=10)
Это сдвинет весь сюжет. В качестве альтернативы можно сдвинуть только область вокруг изолированной точки (путем добавления второго вызова contour
с небольшой сеткой x,y вокруг изолированной точки в точке (0,0)). Это не меняет остальных.
Кажется, что контур, состоящий из одной точки, не отображается. Одним из обходных путей может быть явное построение точки:
plt.plot(0, 0, color = "red", marker = "o", zorder = 10, markersize = 2.5)
. В качестве альтернативы контуры могут быть немного смещены, например, наz=0.0002
(вместоz=0
), что практически не меняет форму контура (но отображает одну точку). Другой вариант — вывести точку отдельным контуром и сместить только ее (тогда остальное гарантированно останется без изменений).