拓端tecdat|R語言圓填充( Circle packing)算法圓堆圖圓形空間填充算法可視化
原文鏈接:http://tecdat.cn/?p=24658?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
圓填充Circle packing算法
已經(jīng)開發(fā)了大量確定性和隨機(jī)性的圓填充算法。
RepelLayout
?通過成對(duì)排斥迭代移動(dòng)圓圈來搜索非重疊布局。圓的位置被限制在一個(gè)矩形區(qū)域內(nèi)。為避免邊緣效應(yīng),可以將邊界區(qū)域視為環(huán)面,例如,推到左側(cè)邊緣的圓將重新進(jìn)入右側(cè)邊緣的邊界區(qū)域。這是一種非常簡單且效率相當(dāng)?shù)偷乃惴?,但通常?huì)產(chǎn)生良好的結(jié)果。ProgressiveLayout
?連續(xù)放置圓,使每個(gè)圓與先前放置的兩個(gè)圓在外部相切。該算法是確定性的,盡管可以通過改變輸入圓圈的順序產(chǎn)生不同的布局。它非常高效,因此適用于處理大型數(shù)據(jù)集。?GraphLayout
?試圖找到滿足輸入鄰接圖的安排。實(shí)現(xiàn)是實(shí)驗(yàn)性的。?
第一個(gè)例子
我們將首先創(chuàng)建一組不同大小的圓,然后找到可以用 ggplot 顯示的非重疊排列。
首先,我們創(chuàng)建一組隨機(jī)圓,位于邊界正方形的中心部分,較小的圓比較大的圓更常見。我們將圓的大小表示為面積。?
as <- reta(rcs ,5) * maxaa
接下來,我們嘗試找到一個(gè)不重疊的排列,允許圓圈占據(jù)邊界正方形的任何部分。返回值是一個(gè)包含布局元素和執(zhí)行迭代次數(shù)的列表。
Layout(areass)

布局作為具有圓心坐標(biāo)和半徑的數(shù)據(jù)框返回。
head( layout )

我們將其轉(zhuǎn)換為圓形頂點(diǎn)的數(shù)據(jù)集,用 ggplot 顯示。
結(jié)果數(shù)據(jù)集有一個(gè)整數(shù)?id
?字段,它對(duì)應(yīng)于傳遞給 的原始數(shù)據(jù)中圓圈的位置。
head(dtg)

現(xiàn)在我們可以繪制布局了。
themebw()
thest(t)
ggplot(daa = d.g)
?基于圖的圓填充
圓填充的另一種方法是從指定圓的大小和相切(即哪些圓接觸哪些其他圓)開始,然后搜索滿足此要求的排列。
在下圖中,左側(cè)的圖形表示所需的圓相切模式。圓?5、7、8 和 9 是?內(nèi)部的,而其余圓圈是?外部的。右邊的圓填充顯示了符合輸入圖的圓圈排列。

切線圖和結(jié)果堆積
GraphLayout
?實(shí)現(xiàn)了算法的基本版本。下面的例子產(chǎn)生一個(gè)類似于上圖的布局:
## 切線列表。矢量元素是圓 ID。
##每個(gè)向量的第一個(gè)元素是一個(gè)內(nèi)圓
## 和隨后的元素是它的鄰居。
## 外圓半徑。
data.frame(id )
## Layout 函數(shù)用于查找排列
##與`internal`指定的切線相對(duì)應(yīng)的圓
## 和由 `external` 指定的外圓尺寸。結(jié)果是一個(gè)四列的 data.frame: id, x, y, radi。
##
circleGraphLayout
## 獲取圓頂點(diǎn)的數(shù)據(jù)
LayotVtics(laout,xyizcs = 2:4, dl = 1)
## 繪制帶有 ID 注釋的圓圈。
ggplot() +
geom_olon()+
ge_tet(data=ayo) +
oal()

指定初始圓位置
在前面的示例中,我們將圓大小的向量傳遞給?circleRepelLayout
,該函數(shù)通過將圓放置在靠近邊界區(qū)域中心的位置,為圓隨機(jī)分配起始位置?;蛘撸覀兛梢灶A(yù)先指定初始位置。為了說明這一點(diǎn),我們首先將所有圓圈放置在邊界區(qū)域的一個(gè)角附近。
lLayout(dt.nt)

接下來我們使用 ggplot 顯示初始和最終布局。請注意,在我們的初始布局中,我們將圓的大小表示為面積,因此我們需要在調(diào)用Vertices
?函數(shù)時(shí)指定?,否則它假定大小是半徑。
# 獲取初始布局的頂點(diǎn)數(shù)據(jù),其中大小是區(qū)域
dgil - ciLocs(dt., sieye = "area")
# 獲取函數(shù)返回的布局的頂點(diǎn)數(shù)據(jù) whre
# 尺寸是半徑
a..i <- ciaoees(rlyout)
ggplot(data
ge_pgon(couaa=0.3) +
cor_el(xli=lis yl=imts)

移動(dòng)和固定
RepelLayout
?函數(shù)接受一個(gè)可選?weights
?參數(shù),以在布局算法的每次迭代中對(duì)圓的移動(dòng)進(jìn)行額外控制。該參數(shù)采用一個(gè)數(shù)值向量,其值在 0-1 范圍內(nèi)(此范圍之外的任何值都將被限制為 0 或 1)。權(quán)重為 0 可防止圓完全移動(dòng),而權(quán)重為 1 則允許完全移動(dòng)。
為了說明這一點(diǎn),我們將從更早使用的數(shù)據(jù)集中選擇幾個(gè)圓圈,將它們放大并通過將它們的權(quán)重設(shè)置為 0.0 來固定它們的位置。
# 選擇幾個(gè)任意的圓圈
dai$ea[las] <- 2 * axa
# 重新生成初始圓的頂點(diǎn)數(shù)據(jù),添加一列
# 表示一個(gè)圓是固定的還是自由的
dnta <- cres(dain, ste = "area")
dani$sae <- iflse(dtgtd %in% laid, "fixed", "free")
# 現(xiàn)在使用權(quán)重向量重新運(yùn)行布局算法以固定位置
# 最大的圓
res <- cirtt.t
dgfal <- circes(es$aut)
plot(dta = da,as(x, y, grp=d, fl=ste)) +
gen(coor)

請注意,在初始布局中重疊的固定圓在最終布局中仍然重疊。

最受歡迎的見解
1.R語言動(dòng)態(tài)圖可視化:如何、創(chuàng)建具有精美動(dòng)畫的圖
2.R語言生存分析可視化分析
3.Python數(shù)據(jù)可視化-seaborn Iris鳶尾花數(shù)據(jù)
4.r語言對(duì)布豐投針(蒲豐投針)實(shí)驗(yàn)進(jìn)行模擬和動(dòng)態(tài)
5.R語言生存分析數(shù)據(jù)分析可視化案例
6.r語言數(shù)據(jù)可視化分析案例:探索brfss數(shù)據(jù)數(shù)據(jù)分析
7.R語言動(dòng)態(tài)可視化:制作歷史全球平均溫度的累積動(dòng)態(tài)折線圖動(dòng)畫gif視頻圖
8.R語言高維數(shù)據(jù)的主成分pca、 t-SNE算法降維與可視化分析案例報(bào)告
9.python主題LDA建模和t-SNE可視化