R 圆弦图

R Circular Chord Plots

我正在学习如何在 R 中创建圆形图,类似于 CIRCOS 我使用包 circlize 根据航班是否为 OB、Inbound 和 Return 在起点和目的地对之间绘制链接。数据的逻辑并不重要,它只是一个玩具示例

我已经根据下面的代码让情节发挥作用,该代码根据以下逻辑发挥作用

  1. 拿我的数据,结合目的地列和航班类型
  2. 转换为矩阵并将原点和新列输入 circlize

Reference

library(dplyr)
library(circlize)

# Create Fake Flight Information in a table
orig = c("IE","GB","US","ES","FI","US","IE","IE","GB")
dest = c("FI","FI","ES","ES","US","US","FI","US","IE")
direc = c("IB","OB","RETURN","DOM","OB","DOM","IB","RETURN","IB")
mydf = data.frame(orig, dest, direc)

# Add a column that combines the dest and direction together
mydf <- mydf %>%
  mutate(key = paste(dest,direc)) %>%
  select (orig, key)

# Create a Binary Matrix Based on mydf
mymat <- data.matrix(as.data.frame.matrix(table(mydf)))

# create the objects you want to link from to in your diagram
from <- rownames(mymat)
to <- colnames(mymat)

# Create Diagram by suppling the matrix 
par(mar = c(1, 1, 1, 1))
chordDiagram(mymat, order = sort(union(from, to)), directional = TRUE)
circos.clear()

我很喜欢这个情节,但想稍微改变一下。例如,FI(即芬兰)在图表 FI IB、FI OB 和 FI 上有 3 个测量值。如果可能的话,我想将它们全部组合在 FI 下,并使用配色方案、箭头甚至添加一个额外的轨道来区分这三种类型的航班,该轨道充当 IB OB 和 RETURN 航班

例如,

任何人都可以帮忙,有没有人见过类似的事情? 最终结果应该只显示一次国家/地区,以便有人可以很快看到哪些国家/地区的航班数量最多

我已经尝试关注 other posts 但我担心当他们转向更高级的东西时我会迷路

非常感谢您的宝贵时间

您是否需要箭头,因为图中的颜色编码已经说明了从/到的故事(从 -> 来自国家/地区的颜色边缘,TO 是来自国家/地区到达目的地国家/地区的颜色,如果来自 = = TO 它自己的颜色 returns 在它自己的基础上(例如参见 US 或 ES))。

library(dplyr)
library(circlize)

# Create Fake Flight Information in a table
orig = c("IE","GB","US","ES","FI","US","IE","IE","GB")
dest = c("FI","FI","ES","ES","US","US","FI","US","IE")
mydf = data.frame(orig, dest)

# Create a Binary Matrix Based on mydf
mymat <- data.matrix(as.data.frame.matrix(table(mydf)))

# create the objects you want to link from to in your diagram
from <- rownames(mymat)
to <- colnames(mymat)

# Create Diagram by suppling the matrix 
par(mar = c(1, 1, 1, 1))
chordDiagram(mymat, order = sort(union(from, to)), directional = TRUE)
circos.clear()

顺便说一句 -> 边缘上还有一个 OFFSET 差异,表明它是 FROM(更宽的边缘)还是 TO(更小的边缘)

首先,我认为您的数据中存在重复记录(IE-FI-IB)。

我先附上代码和图再稍微解释一下。

df = data.frame(orig, dest, direc, stringsAsFactors = FALSE)
df = unique(df)
col = c("IB" = "red",
        "OB" = "blue",
        "RETURN" = "orange",
        "DOM" = "green")
directional = c("IB" = -1,
                "OB" = 1,
                "RETURN" = 2,
                "DOM" = 0)
diffHeight = c("IB" = -0.04,
                "OB" = 0.04,
                "RETURN" = 0,
                "DOM" = 0)
chordDiagram(df[1:2], col = col[df[[3]]], directional = directional[df[[3]]], 
    direction.type = c("arrows+diffHeight"),
    diffHeight = diffHeight[df[[3]]])

legend("bottomleft", pch = 15, legend = names(col), col = col)

首先你需要使用开发版的circlize 你可以通过

安装它
devtools::install_github("jokergoo/circlize")

在这个新版本中,chordDiagram() 支持将输入变量作为数据框,并为 link 绘制两个箭头(刚刚阅读您的 post :))。

上述代码中,coldirectionaldirection.typediffHeight都可以设置为向量,对应df中的行。

chordDiagram()中的directional参数设置为2时,对应的link会有两个方向。那么如果direction.type包含箭头,就会出现双头箭头。

因为 diffHeight 是一个对应于 df 行的向量,如果你想通过箭头和根的偏移来可视化单个 link 的方向,你需要将这两个选项合并为一个字符串,如示例代码 "arrows+diffHeight".

所示

默认情况下 link 的方向是从第一列到第二列。但在你的情况下,IB 表示反向,因此我们需要将 diffHeight 设置为负值以反转默认方向。

最后,我观察到你有 link 开始和结束在同一个扇区(ES-ES-DOMUS-US-DOM),你可以使用 self.link 参数来控制如何表示这样的自我link。下图中self.link设置为1。