如何使用Python用曲线生成x和n之间的数字?

时间:2019-03-28 01:25:33

标签: python matplotlib

我正在尝试在两个整数之间生成一条非线性曲线,假设0和25在此处与该曲线相匹配:

enter image description here

这似乎是一个愚蠢的简单问题,我甚至需要的曲线看起来像是圆的一部分,因此生成一个大圆并取右下角的点即可解决此问题,但是我不知道该怎么做任何一个。

我所需要的是从0到25的列表,其中曲线是该列表的一部分,如果有道理的话。开始缓慢增加,然后加速,然后在快结束时减速。

我已经尝试了类似的结果,但是它的角度/曲线不正确。

x=[]
y=range(25)

for i in range(25):
    x.append((i**.25)**2)

plt.plot(x, y)
plt.show()

enter image description here

谢谢

1 个答案:

答案 0 :(得分:3)

如果您真的想拥有相同的曲线,则可以加载绘图图像,并使用PIL获取每个蓝色像素:

this.sbv.size = this.content.offsetHeight / this.content.scrollHeight;
this.sbv.style.height = (this.sbv.size * 100) + "%";
this.sbv.max = (100 - this.sbv.size * 100) / 100 * this.content.offsetHeight;
this.sbv.pos = this.content.scrollTop / this.content.scrollHeight * this.content.offsetHeight;
this.sbv.style.top = (this.sbv.pos / this.content.offsetHeight * 100) + "%";

this.sbh.size = this.content.offsetWidth / this.content.scrollWidth;
this.sbh.style.width = (this.sbh.size * 100) + "%";
this.sbh.max = (100 - this.sbh.size * 100) / 100 * this.content.offsetWidth;
this.sbh.pos = this.content.scrollLeft / this.content.scrollWidth * this.content.offsetWidth;
this.sbh.style.left = (this.sbh.pos / this.content.offsetWidth * 100) + "%";

然后,知道图中的(0,20)是像素(63,355),而图中的(25,160)是像素(516,32),则可以将像素坐标转换为数据点:

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen('https://i.stack.imgur.com/NpiMq.png'))
X = []
Y = []
for x in range(img.size[0]):
    for y in range(img.size[1]):
        r, g, b, a = img.getpixel((x, y))
        if b > r and b > g:
            X.append(x)
            Y.append(y)

最后,您可以使用numpy polyfit来获得与先前获得的点的多项式拟合:

X = [(x - 63) * (25 - 0) / (516 - 63) + 0 for x in X]
Y = [(y - 355) * (160 - 20) / (32 - 355) + 20 for y in Y]

然后,使用>>> np.polyfit(X, Y, 3) [ 8.23918277e-03 -7.33330644e-02 2.60046715e+00 2.03012850e+01] 绘制结果以得到给定poly1d值返回其x值的函数:

y

Output of the plot