【问题标题】:How can I "natively" store hexagonal grids in R?如何在 R 中“本地”存储六边形网格?
【发布时间】:2017-04-20 21:24:54
【问题描述】:

如果我想在 R 中保存一些 square 网格,这很容易做到。

说,

|    | 0    | 1     | 2     |
|----|------|-------|-------|
| 0  | TRUE | TRUE  | FALSE |
| 1  | NA   | FALSE | TRUE  |
| 2  | TRUE | TRUE  | FALSE |

存储为笛卡尔坐标系

m <- matrix(data = c(TRUE, TRUE, FALSE, NA, FALSE, TRUE, TRUE, TRUE, FALSE), nrow = 3, ncol = 3, byrow = FALSE)

现有的方法和数学按预期工作:

apply(X = m, MARGIN = 2, FUN = "sum")
# [1]  2 NA  2
print(m)
#      [,1]  [,2]  [,3]
#[1,]  TRUE    NA  TRUE
#[2,]  TRUE FALSE  TRUE
#[3,] FALSE  TRUE FALSE

(我知道我也可以将 reshape2::melt 转换成长格式,但我喜欢它的宽泛,因为 UI 就是这样的)。

到目前为止一切都很好、熟悉、直观。


现在进入六边形网格。

我从Amit Patel's marvellous/authoritative introduction to hex grids 了解到,我真的应该使用 立方体坐标系 来保存这样的网格,就像上面的示例一样,因为否则(= 使用 2d 笛卡尔坐标加上偏移量)线性代数操作不再起作用,随之而来的是一般的代码粗略。 我明白了(我想)。

(有关更多详细信息,请再次参阅 Amit Patel 的精彩 explainer)。

通过array()wide 形式输入这些数据似乎完全是疯狂的,因为许多单元格甚至都不存在(并且NA 已经被使用)。 所以我以长格式输入/存储它,如下所示:

df <- rbind(c(1, 0, -1, FALSE), 
        c(0, 1, -1, NA),
        c(1, -1, 0, TRUE),
        c(0, 0, 0, TRUE),
        c(-1, 1, 0, FALSE),
        c(0, -1, 1, NA),
        c(-1, 0, 1, TRUE))
colnames(df) <- c("y", "x", "z", "value")
df
#      y  x  z value
#[1,]  1  0 -1     0
#[2,]  0  1 -1    NA
#[3,]  1 -1  0     1
#[4,]  0  0  0     1
#[5,] -1  1  0     0
#[6,]  0 -1  1    NA
#[7,] -1  0  1     1

此数据框包含所有数据,但不以任何方式“知道”xyz 是对角坐标。

我该怎么做:

  1. 的形式存储它,我可以轻松地使用线性代数和矩阵代数,
  2. 使用已建立的方法(例如,colSums()apply()
  3. 以及方便print 到这样的东西:

(SE 甚至无法正确突出显示此打印的十六进制网格,因此是屏幕截图。)

简而言之,在 R 中“本地”存储这种六边形网格的优雅/推荐/规范方式是什么?

我隐约意识到我可能为此实现自己的 S3 OO,尽管我希望这可能已经以某种形式存在。 我确实找到了很多对连续数据进行十六进制binning的包,但它们似乎没有处理存储十六进制网格,或者在至少没有暴露那些内部结构。

【问题讨论】:

    标签: r matrix coordinate-systems r-grid hexagonal-tiles


    【解决方案1】:

    1.以宽泛的形式存储它,我可以轻松地使用线性和矩阵 代数

    可能http://www.redblobgames.com/grids/hexagons/#coordinates中提到的轴坐标是这里的最佳选择。这可以提供转换为 i=x 和 j=y 的标准 ij-matrix 的选项,您只需指定将哪些内容放入您的 hex-grid 未覆盖的矩阵单元中(您自己的“NA” )。然后你可以像往常一样沿着维度 x 和 y 操作,并有一个只有空三角形右上角和左下角三角形的矩阵。 (这不是疯子,而是自然的方式。充其量你必须在你的数据中为你的 NA 找到一个不同的解决方案。很抱歉没有为你的示例修改代码。)

    2。使用已建立的方法(例如 colSums() 或 apply())

    使用 dplyr 包可以

    df %&gt;% as_data_frame() %&gt;% group_by(x) %&gt;% summarize(sum(value))

    对固定的 x 等求和。

    3.以及方便打印

    我没有打印的解决方案,但是用 ggplot2 显示标签可以解决问题

    df %&gt;% as_data_frame() %&gt;% ggplot(aes(x=x+0.5*y, y=y, label=value)) + geom_text()

    注意:这里提供的结果是您想要打印的翻页版本,但我希望您能自己找到正确的翻页。 x=x+0.5*y 在这里为您提供您所瞄准的六角形。使用x=x,您只有一个斜六边形。

    简而言之,在 R 中“本地”存储这样一个六边形网格的优雅/推荐/规范方式是什么?

    你已经找到了。对于计算,你使用你的 df.对于存储,使用轴向存储会更有效。您可以轻松地提取 z 坐标。

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多