关于数据挖掘:R语言圆填充-Circle-packing算法圆堆图圆形空间填充算法可视化

79次阅读

共计 2295 个字符,预计需要花费 6 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=24658 

圆填充 Circle packing 算法

曾经开发了大量确定性和随机性的圆填充算法。

  • RepelLayout 通过成对排挤迭代挪动圆圈来搜寻非重叠布局。圆的地位被限度在一个矩形区域内。为防止边缘效应,能够将边界区域视为环面,例如,推到左侧边缘的圆将从新进入右侧边缘的边界区域。这是一种非常简单且效率相当低的算法,但通常会产生良好的后果。
  • ProgressiveLayout 间断搁置圆,使每个圆与先前搁置的两个圆在内部相切。该算法是确定性的,只管能够通过扭转输出圆圈的程序产生不同的布局。它十分高效,因而实用于解决大型数据集。
  • GraphLayout 试图找到满足输出邻接图的安顿。实现是实验性的。

第一个例子

咱们将首先创立一组不同大小的圆,而后找到能够用 ggplot 显示的非重叠排列。

首先,咱们创立一组随机圆,位于边界正方形的核心局部,较小的圆比拟大的圆更常见。咱们将圆的大小示意为面积。

as <- reta(rcs ,5) * maxaa

接下来,咱们尝试找到一个不重叠的排列,容许圆圈占据边界正方形的任何局部。返回值是一个蕴含布局元素和执行迭代次数的列表。

Layout(areass)

布局作为具备圆心坐标和半径的数据框返回。

head(layout)

咱们将其转换为圆形顶点的数据集,用 ggplot 显示。

后果数据集有一个整数 id 字段,它对应于传递给 的原始数据中圆圈的地位。

head(dtg)

当初咱们能够绘制布局了。

themebw() 

thest(t)
ggplot(daa = d.g)

 基于图的圆填充

圆填充的另一种办法是从指定圆的大小和相切(即哪些圆接触哪些其余圆)开始,而后搜寻满足此要求的排列。

在下图中,左侧的图形示意所需的圆相切模式。圆 5、7、8 和 9 是 _外部的_,而其余圆圈是 _内部的_。左边的圆填充显示了合乎输出图的圆圈排列。

切线图和后果沉积

GraphLayout 实现了算法的根本版本。上面的例子产生一个相似于上图的布局:

## 切线列表。矢量元素是圆 ID。## 每个向量的第一个元素是一个内圆
## 和随后的元素是它的街坊。## 外圆半径。data.frame(id)

## Layout 函数用于查找排列
## 与 \`internal\` 指定的切线绝对应的圆
## 和由 \`external\` 指定的外圆尺寸。后果是一个四列的 data.frame: id, x, y, radi。##
 circleGraphLayout 

## 获取圆顶点的数据
 LayotVtics(laout,xyizcs = 2:4, dl = 1)
## 绘制带有 ID 正文的圆圈。ggplot() +
  geom_olon()+
  
  ge_tet(data=ayo) +
  
  oal()

指定初始圆地位

在后面的示例中,咱们将圆大小的向量传递给 circleRepelLayout,该函数通过将圆搁置在凑近边界区域核心的地位,为圆随机调配起始地位。或者,咱们能够预先指定初始地位。为了阐明这一点,咱们首先将所有圆圈搁置在边界区域的一个角左近。

lLayout(dt.nt)

接下来咱们应用 ggplot 显示初始和最终布局。请留神,在咱们的初始布局中,咱们将圆的大小示意为面积,因而咱们须要在调用 Vertices 函数时指定,否则它假设大小是半径。

# 获取初始布局的顶点数据,其中大小是区域
dgil - ciLocs(dt., sieye = "area")
# 获取函数返回的布局的顶点数据 whre
# 尺寸是半径
a..i <- ciaoees(rlyout)


ggplot(data
   ge_pgon(couaa=0.3) +
  
   cor_el(xli=lis yl=imts)

挪动和固定

RepelLayout 函数承受一个可选 weights 参数,以在布局算法的每次迭代中对圆的挪动进行额定管制。该参数采纳一个数值向量,其值在 0-1 范畴内(此范畴之外的任何值都将被限度为 0 或 1)。权重为 0 可避免圆齐全挪动,而权重为 1 则容许齐全挪动。

为了阐明这一点,咱们将从更早应用的数据集中抉择几个圆圈,将它们放大并通过将它们的权重设置为 0.0 来固定它们的地位。

# 抉择几个任意的圆圈

dai$ea\[las\] <- 2 * axa

# 从新生成初始圆的顶点数据,增加一列
# 示意一个圆是固定的还是自在的
dnta <- cres(dain, ste = "area")

dani$sae <- iflse(dtgtd %in% laid, "fixed", "free")

# 当初使用权重向量从新运行布局算法以固定地位
# 最大的圆

res <- cirtt.t

dgfal <- circes(es$aut)


plot(dta = da,as(x, y, grp=d, fl=ste)) +
  
  gen(coor)

请留神,在初始布局中重叠的固定圆在最终布局中依然重叠。


最受欢迎的见解

1.R 语言动态图可视化:如何、创立具备精美动画的图

2.R 语言生存剖析可视化剖析

3.Python 数据可视化 -seaborn Iris 鸢尾花数据

4.r 语言对布丰投针(蒲丰投针)试验进行模仿和动静

5.R 语言生存剖析数据分析可视化案例

6.r 语言数据可视化剖析案例:摸索 brfss 数据数据分析

7.R 语言动静可视化:制作历史寰球平均温度的累积动静折线图动画 gif 视频图

8.R 语言高维数据的主成分 pca、t-SNE 算法降维与可视化剖析案例报告

9.python 主题 LDA 建模和 t -SNE 可视化

正文完
 0