Python,matplotlib。在两点之间绘制函数

Python,matplotlib。在两点之间绘制函数,python,matplotlib,2d,Python,Matplotlib,2d,我想使用matplotlib在两点之间绘制函数。 类似问题,但对于3d案例,没有有效答案: 我认为应该是这样的: import matplotlib.pyplot as plt import math def foo(x, L): # some polynomial on [0, L] return x**2 # usually it's more difficult def magic(plt, foo, point1, point2): """ Plo

我想使用matplotlib在两点之间绘制函数。 类似问题,但对于3d案例,没有有效答案:

我认为应该是这样的:

import matplotlib.pyplot as plt
import math

def foo(x, L):
    # some polynomial on [0, L]
    return x**2  # usually it's more difficult


def magic(plt, foo, point1, point2):
    """
    Plot foo from point1 to point2
    :param plt: matplotlib.pyplot
    :param foo: function
    :param point1: tuple (x1, y1) or list [x1, y1]
    :param point2: tuple (x2, y2) or list [x2, y2]
    :return:
    """
    # do magic
    # create modified function along new local x' axis using points in initial x,y axis?
    # create new axis, rotate and move them?
    pass

x1, y1 = 1, 1  # first point coordinates
x2, y2 = 2, 2  # second point coordinates
dx = x1 - x2
dy = y1 - y2
# length, this ratio is always True in my case (see picture below)
L = math.sqrt(dx * dx + dy * dy)

ax, fig = plt.subplots()
magic(plt, foo, (x1,y1), (x2, y2))
plt.show()
重要提示:沿新轴的长度不会更改。如果
[0,L]
上有一个函数,这意味着它在旋转/移动或沿新轴表示后将具有相同的域(或“长度”)

这是我试图做的事情的图像


这里面没有魔法。只需从(0,0)到(x1,y1)的平移和由dx和dy定义的角度的旋转。该角度的正弦为dy/L,余弦为dx/L。使用数组编写函数既方便又简洁,同时加快了计算速度

在下面的代码中,我更改了示例函数,以更清楚地说明如何转换函数。此外,纵横比设置为“相等”。否则,旋转后的函数看起来会失真

导入matplotlib.pyplot作为plt
将numpy作为np导入
def foo(x):
#[0,L]上的一些函数
返回np.sin(x*20)/(x+1)
def功能在新轴上(foo,点1,点2):
"""
从点1到点2绘制foo
:param foo:函数
:param point1:元组(x1,y1)或列表[x1,y1]
:param point2:元组(x2,y2)或列表[x2,y2]
:返回:
"""
#使用初始x、y轴上的点沿新的局部x'轴创建修改的函数?
#创建新轴,旋转并移动它们?
dx=x2-x1
dy=y2-y1
L=np.sqrt(dx*dx+dy*dy)
席=NP.林空间(0,L,500)α初始坐标系
YI=foo(XI)
s=dy/L#旋转角度的正弦
c=旋转角度的dx/L#余弦
XM= C*席-S*Y+X1改进坐标系
ym=s*席+c*i+y1
plt.绘图(XI,YI,color='crimson',alpha=0.3)
plt.plot(XM,YM,color='crimson')
plt.图([x1,x2],[y1,y2],'go')
x1,y1=1,1#第一点坐标
x2,y2=2,3#第二点坐标
图,ax=plt.子批次()
新轴上的函数(foo,(x1,y1),(x2,y2))
ax.axis('equal')#x轴和y轴之间的相等纵横比,以防止函数看起来倾斜
#在(0,0)处显示轴
ax.spines['left'].设置_位置('zero'))
斧头刺['right'].设置颜色('none')
ax.脊椎['bottom'].设置位置('zero')
斧头刺['top'].设置颜色(“无”)
plt.show()

映射两点没有唯一的方法。看见但如果有第三个点,则可以将生成的仿射变换应用于初始点,并将结果绘制在新轴上。或者使用matplotlib美术师的
transform
参数使用仿射变换。我试图找出没有离散初始函数的解决方案。但现在我明白了,没有一种独特的方法(正如本文第一篇评论中提到的)不使用数值方法来转换函数,或者这些方法太复杂了。感谢使用numpy和轴的相等纵横比的建议。