我试图做一个非常基本的形状,连接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()
以下方法通过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个随机点都可以拟合一个椭圆)。如果您确实需要椭圆形,那么找到最小的1到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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句