Python从4点创建一个椭圆形

问题描述

我正在尝试制作一个非常基本的连接4点的形状。我有一个目前看起来像this的情节。但是,我似乎找不到能适当生成连接所有四个点的椭圆的模块。这四个点都将有所不同(它们是测试的结果,旨在显示某人具有的每个属性数量)。我发现有许多模块可以创建矩形,椭圆形或圆形,但是这些形状都不能始终与这些点对齐。是否有更通用的模块可以将所有四个点连接成更像椭圆的形状?

我还看到了一些可以在两点之间创建弧的模块,我认为这可能是有用的,我可以对所有四个点都这样做。当我尝试执行此操作时,它需要与弧角有关的输入,而我不知道该如何计算。非常感谢您提供任何帮助!

这是我用来生成所示图像的代码

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]

plt.scatter(x,y)
ax.fill_between([-100,0],-100,alpha=0.3,color='#1F98D0')  # blue
ax.fill_between([0,100],color='#F9D307')  # yellow
ax.fill_between([-100,100,color='#F38D25')  # orange
ax.fill_between([0,color='#DA383D')  # red
plt.axis('off')
plt.show()

解决方法

以下方法通过4个点创建interpolating spline,以创建“基本形式”。一个优点是,当有3个或4个以上的点时,它也可以工作。

WITH TB1 AS(SELECT TB_INDEX FROM TB0 WHERE TB_INDEX=10),TB2 AS (SELECT TB_INDEX,COUNT(ORDERS))TOTAL FROM ORDERS INNER JOIN TB1 ON TB1.TB_INDEX=ORDERS.TB_INDEX)
UPDATE T SET T.STATUS='A'
FROM TB2,TB0 T WHERE T.TB_INDEX=TB2.TB_INDEX
TB2.TOTAL>30

resulting plot

当椭圆形无法放置或太大时,同样的方法也适用:

different point positions

请注意,to uniquely define an ellipse需要5个点(但并不是每5个随机点都可以容纳一个椭圆)。如果您确实需要椭圆形,那么找到最小的1到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] ax.scatter(x,y,zorder=3) ax.fill_between([-100,0],-100,alpha=0.3,color='#1F98D0') #blue ax.fill_between([0,100],color='#F9D307') #yellow ax.fill_between([-100,100,color='#F38D25') #orange ax.fill_between([0,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],alpha=0.3) ax.axis('off') plt.show() (x0,y0))的距离之和为常数(x1,y1)的点。然后可以搜索存在解决方案的最小a

a