python散点图如何设置外边框_如何绘制散点图的外围边框?
我猜題主想要的是這種效果吧?
這是一個典型的由凸包(Convex Hull)問題衍生出來的
問題。
1.凸包是什么
對包含n個點的集合S來說,凸包可以看作是所有包含這n個點的閉合半平面的交集。在在二維歐幾里得空間中,可以把凸包想象成用一根有彈性的橡皮筋恰好包住所有的點
2.如何求解凸包
1)Gift wrapping算法:假設平面內(nèi)共有n個點,對點Pi(0<=i<=n),從最左邊的點i=0開始,遍歷所有的點,找到點Pi+1,使得剩下的n-2個點全部在直線PiPi+1的右邊,重復這一過程直到回到點P0。
2)Graham scan算法:找到n個點的集合S中位于最下方的點(縱坐標最小)P,分別計算剩下n-1個點與點P連線的斜率,按大小將這些點的編號排序,維護一個棧,以保存當前的凸包。按排序得到的結果,依次將點加入到棧中,如果正在考慮的點與棧頂?shù)膬蓚€點不是“向左轉”的,就表明當前棧頂?shù)狞c并不在凸包上,而我們需要將其彈出棧,重復這一個過程直到正在考慮的點與棧頂?shù)膬蓚€點是“向左轉”的。判斷是不是“向左轉”使用的方法是求三點構成的三角形的有向面積,當有向面積為正是,判斷它是“向左轉”,為負時“向右轉”,等于零時三點共線。圖2中以BC為頂點,在考慮點D是發(fā)現(xiàn)它是向右轉的,所以點C不是凸包上的點,把它從棧中彈出
3.凸包的優(yōu)點和缺點
1)優(yōu)點:可以很方便地求得一個點集的邊界,適合用于3D游戲中的碰撞檢測。
2)缺點:并不能很好地描述點集的形狀。凸包不能很好地描述點集形狀
4.
由于構建凸包的算法已經(jīng)十分成熟且容易,凸包問題被用來解決很多更復雜的問題,尤其是計算機科學中,其應用相當廣泛。在模式識別中,科學家發(fā)現(xiàn),通過選取極值點構建凸包,可以表征某一個集合的“形狀”。然而,由于凸包本身的缺點,這種表示是相當不精確的。這也是題主發(fā)現(xiàn)很多凸包會重合在一起的原因。為了解決這一問題,Herbert Edelsbrunner等人于1983年提出了alpha-shape(為了方便,后文都寫作a-shape)的概念。alpha-shape可以很好地表示一個點集的形狀
要定義a-shape,首先需要引入幾個概念。
定義1:對于點集S來說,取一個足夠小且大于0的任意實數(shù)a,所有半徑為1/a且包含了全部點的圓的交集我們稱其為點集S的Postive a-hull。點集S的ostive a-hull
定義2:對于點集S來說,取一個足夠大且小于0的任意實數(shù)a,對所有半徑為-1/a的圓,若其補集包含了點集S中的所有點,對這樣的圓的補集,求它們(圓的補集)的交集,我們稱這個交集為點集S的Negative a-hull。點集S的Negative a-hull
定義3:對于點集S中的某一點p,如果存在一個半徑為1/a的圓,點p在圓上,且該圓包含了點集S中所有的點,則稱點p為點集S的a-extreme極值點。如果點集S中存在這樣的兩個a-extreme極值點p和q,使得p和q在同一個圓上,且該圓包含了點集S中的所有極值點,則稱這樣的點p和點q為一對a-neighbors。
定義4:給出一個點集S,和一個任意實數(shù)a,點集S的a-shape是由直線段連成的封閉圖形,這些直線段滿足:線段的頂點是a-extreme極值點,線段連接的兩個頂點是一對a-neighbors。
好了,這樣我們就得到了a-shape的定義了,剩下的就是如何求解a-shape。
5.a-shape的求解
在《On the shape of a set of points in the plane》一文中,Herbert Edelsbrunner證明了a-shape是Delaunay Triangulation的子集,并給出了利用Voronoi Diagrams和Delaunay Triangulation聯(lián)合求解a-shape的過程,具體如下:
1)給定一個點集S和參數(shù)a
2)構建點集S的Delaunay Triangulation,得到每一條直線段
的長度
3)構建點集S的Voronoi Diagram,利用Voronoi Diagram計算每兩個點間距離的極值
和
4)當且僅當
時,這條直線段屬于a-shape的一部分
5)計算得到所有滿足要求的直線段
,得到的圖形就是我們要求的
總結
以上是生活随笔為你收集整理的python散点图如何设置外边框_如何绘制散点图的外围边框?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公司网络搭建及×××到公司配置
- 下一篇: 知了课堂 python_没想到你是这样的