我试图做一个非常基本的形状连接4点。我现在有一个看起来像这的情节。然而,我似乎找不到一个模块,它可以适当地生成连接所有四个点的椭圆。这四点都是不同的(它们是测试的结果,目的是显示每个属性有多少)。我已经找到了许多模块来创建矩形,椭圆或圆圈,但这些形状都不会与点保持一致。是否有一个更通用的模块,可以连接所有四个点的形状,更像一个椭圆形?
我还看到了一些模块,可以在两点之间创建一个弧线,我认为这可能是有用的,我可以对所有四个点都这样做。当我尝试这样做时,它需要与弧角有关的输入,而我不知道如何计算。对此的任何帮助都是非常感谢的!
下面是我用来生成所显示的图像的代码。
import matplotlib.pyplot as plt
import numpy as np
# Axes go from 0 to 100%
fig,ax = plt.subplots(figsize=(15,12))
x = [-40,-20,20,20]
y = [-40,20,20,-20]
plt.scatter(x,y)
ax.fill_between([-100, 0],-100,0,alpha=0.3, color='#1F98D0') # blue
ax.fill_between([0, 100], -100, 0, alpha=0.3, color='#F9D307') # yellow
ax.fill_between([-100, 0], 0, 100, alpha=0.3, color='#F38D25') # orange
ax.fill_between([0, 100], 0, 100, alpha=0.3, color='#DA383D') # red
plt.axis('off')
plt.show()发布于 2020-08-26 19:32:35
下面的方法通过4点创建一个插值样条来创建一个“基本表单”。它的一个优点是,当有3分或4分以上时,它也能工作。
import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np
fig, ax = plt.subplots(figsize=(15, 12))
x = [-40, -20, 20, 20]
y = [-40, 20, 20, -20]
ax.scatter(x, y, zorder=3)
ax.fill_between([-100, 0], -100, 0, alpha=0.3, color='#1F98D0') #blue
ax.fill_between([0, 100], -100, 0, alpha=0.3, color='#F9D307') #yellow
ax.fill_between([-100, 0], 0, 100, alpha=0.3, color='#F38D25') #orange
ax.fill_between([0, 100], 0, 100, alpha=0.3, color='#DA383D') #red
tck, u = interpolate.splprep([x + x[:1], y + y[:1]], s=0, per=True)
unew = np.linspace(0, 1, 100)
basic_form = interpolate.splev(unew, tck)
ax.plot(basic_form[0], basic_form[1], color='lime', lw=2)
ax.fill(basic_form[0], basic_form[1], color='lime', alpha=0.3)
ax.axis('off')
plt.show()

同样的方法也适用于椭圆形形状无法匹配或过大的情况:

注意,唯一定义椭圆需要5个点(但不是每5个随机点都可以拟合一个椭圆)。如果你真的需要一个椭圆,找到最小的一个到4个点是相当麻烦的。
这里是一种方法的开始,它将椭圆定义为两个焦点((x0,y0)和(x1,y1))的距离之和为常数a的点。然后可以搜索存在解决方案的最小a。
from sympy import symbols, sqrt, Eq, nsolve
a, x0, y0, x1, y1, xi, yi = symbols('a x0 y0 x1 y1 xi yi', real=True)
ellipse = Eq(sqrt((xi - x0) ** 2 + (yi - y0) ** 2) + sqrt((xi - x1) ** 2 + (yi - y1) ** 2), a)
x = [-40, -20, 20, 20]
y = [-40, 20, 20, -20]
ai = 85
sol = nsolve([ellipse.subs(xi, i).subs(yi, j).subs(a, ai) for i, j in zip(x, y)], (x0, y0, x1, y1), (-10, 0, 10, 0))https://stackoverflow.com/questions/63602454
复制相似问题