Как сдвинуть квадратную прямую?

Как переместить квадратную синюю линию в более низкое положение? Теперь пространство между кривыми не то же самое из-за квадратичной функции.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
plt.rcParams["figure.figsize"] = [8, 8]

x = np.linspace(-1, 1, 100)
y = x**2
ax.set_ylim(-0.3, 1.06)
ax.plot(x, y)
ax.scatter(1/2*(ax.get_xlim()[0] + ax.get_xlim()[1]), 0.15, marker = 'o', s=900, facecolors='none')
width_l = ax.get_ylim()[1] - ax.get_ylim()[0]
ax.plot(x, y - 0.1*width_l)

plt.show()

Желаемый результат - две параллельные линии:

Синяя линия - это исходная линия, что вы пытаетесь получить?

David 15.12.2020 11:48

@DavidS Кажется, в сообщении хотелось бы создать параллельную кривую вместо смещенной кривой. Параллельная кривая будет иметь фиксированное перпендикулярное расстояние. Смещенная кривая имеет фиксированное расстояние, измеренное в направлении y. Такая параллельная кривая является сложной математической проблемой. См., например. обсуждение в Википедии

JohanC 15.12.2020 12:00

Да, синяя линия является исходной, и я хотел бы получить параллельную линию.

Elena Greg 15.12.2020 12:13

Используя параметрическую форму параболы (2at, at^2), примените это

darkspine 15.12.2020 12:20

Но у меня также есть кривые более сложной формы в GridSpec. Как насчет перерасхода?

Elena Greg 15.12.2020 12:37

Извините, что такое overplot?

darkspine 15.12.2020 12:50

Что-то вроде одного графика над другим, и он должен быть прозрачным, чтобы видеть обе линии. Я не знаю, существует ли он в питоне.

Elena Greg 15.12.2020 12:52

У Shapely есть метод buffer, который делает что-то подобное.

Georgy 15.12.2020 19:32

Я попытался запустить пример buffer.py и получил сообщение об ошибке: ImportError: невозможно импортировать имя «SIZE».

Elena Greg 15.12.2020 20:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот подход, который вычисляет нормали из кривой и строит параллельные линии на заданном расстоянии, указанном как length нормали:

import matplotlib.pyplot as plt
import numpy as np
import math

def get_parallels(length=.1):
    
    px, py = [], []
    
    for idx in range(len(x)-1):
        x0, y0, xa, ya = x[idx], y[idx], x[idx+1], y[idx+1]
        dx, dy = xa-x0, ya-y0
        norm = math.hypot(dx, dy) * 1/length
        dx /= norm
        dy /= norm        
        px.append(x0-dy)
        py.append(y0+dx)
    return px, py


fig, ax = plt.subplots()
plt.rcParams["figure.figsize"] = [8, 8]

x = np.linspace(-1, 1, 100)
y = x**2
ax.set_ylim(-0.3, 1.06)
ax.plot(x, y)
for length in (-.3, -.2, -.1, .1, .2, .3, .4):
    ax.plot(*get_parallels(length=length))


plt.show()

или построение необоснованного числа:

for length in (ndx*.025 for ndx in range(-100, 20) if ndx != 0 ):
    ax.plot(*get_parallels(length=length))

Могу ли я задать вам вопрос в Edit после совета, который я добавил к моему вопросу, пожалуйста?

Elena Greg 16.12.2020 05:42

Рад, что смог помочь @Elena. Вероятно, вам следует задать новый вопрос (это бесплатно ;-)) : (1) я уже ответил на исходный вопрос, и дополнения действительно относятся к другому домену; (2) я не знаю, как сделать то, о чем вы сейчас спрашиваете, и (3) ваш новый вопрос может основываться на моем ответе и привлекать внимание других, которые лучше способны решить вашу новую проблему. Для ясности я откатил ваши правки.

Reblochon Masque 16.12.2020 05:46

Спасибо stackoverflow.com/questions/65317561/…

Elena Greg 16.12.2020 05:57

Другие вопросы по теме