【问题标题】:How to shift a quadratic line?如何移动二次线?
【发布时间】:2020-12-15 10:42:50
【问题描述】:

如何将二次蓝线移动到较低的位置?现在曲线之间的空间是不一样的,因为二次函数。

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 方向上测量的固定距离。这样的平行曲线是一个很难的数学问题。参见例如wikipedia discussion
  • 是的,蓝线是原线,我要平行线。
  • 使用抛物线(2at, at^2)的参数形式,应用this
  • 但我在 GridSpec 中也有形状更复杂的曲线。重叠情节呢?

标签: python python-3.x numpy matplotlib geometry


【解决方案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))

【讨论】:

  • 在我添加到我的问题中的建议之后,我可以在编辑中问你一个问题吗?
  • 很高兴我能帮助@Elena。您可能应该问一个新问题(它是免费的;-)):(1)我已经回答了原始问题,并且添加的内容确实是另一个领域; (2) 我不知道该怎么做你现在问的问题,(3) 你的新问题可以建立在我的回答之上,并吸引能够更好地解决你的新问题的其他人的意见。为清楚起见,我回滚了您的编辑。
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多