Как переместить квадратную синюю линию в более низкое положение? Теперь пространство между кривыми не то же самое из-за квадратичной функции.
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()
Желаемый результат - две параллельные линии:
@DavidS Кажется, в сообщении хотелось бы создать параллельную кривую вместо смещенной кривой. Параллельная кривая будет иметь фиксированное перпендикулярное расстояние. Смещенная кривая имеет фиксированное расстояние, измеренное в направлении y
. Такая параллельная кривая является сложной математической проблемой. См., например. обсуждение в Википедии
Да, синяя линия является исходной, и я хотел бы получить параллельную линию.
Используя параметрическую форму параболы (2at, at^2)
, примените это
Но у меня также есть кривые более сложной формы в GridSpec. Как насчет перерасхода?
Извините, что такое overplot
?
Что-то вроде одного графика над другим, и он должен быть прозрачным, чтобы видеть обе линии. Я не знаю, существует ли он в питоне.
У Shapely есть метод buffer, который делает что-то подобное.
Я попытался запустить пример buffer.py и получил сообщение об ошибке: ImportError: невозможно импортировать имя «SIZE».
Вот подход, который вычисляет нормали из кривой и строит параллельные линии на заданном расстоянии, указанном как 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. Вероятно, вам следует задать новый вопрос (это бесплатно ;-)) : (1) я уже ответил на исходный вопрос, и дополнения действительно относятся к другому домену; (2) я не знаю, как сделать то, о чем вы сейчас спрашиваете, и (3) ваш новый вопрос может основываться на моем ответе и привлекать внимание других, которые лучше способны решить вашу новую проблему. Для ясности я откатил ваши правки.
Спасибо stackoverflow.com/questions/65317561/…
Синяя линия - это исходная линия, что вы пытаетесь получить?