1

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

我已经根据下面的代码使情节工作,该代码基于以下逻辑工作

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

参考

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 航班的保护伞

例如,

  • FI OB 将放置在 FI 中,但有一个指向 GB 的单向箭头来表示 OB
  • FI IB 将放置在 FI 中,但有一个单向箭头进入 FI
  • FI RETURN(如果存在)将有一个双头箭头

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

我曾尝试关注其他帖子,但恐怕当他们转向更高级的内容时我会迷路

非常感谢您的宝贵时间

4

2 回答 2

8

首先,我认为您的数据中有重复的记录 ( 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()支持将输入变量作为数据框并为链接绘制双头箭头(在阅读您的帖子之后:))。

在上面的代码中coldirectionaldirection.typediffHeight都可以设置为与 中的行相对应的向量df

directional参数 inchordDiagram()设置为 2 时,对应的链接将有两个方向。那么如果direction.type包含箭头,就会有一个双头箭头。

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

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

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

在此处输入图像描述

于 2015-08-12T14:06:36.567 回答
1

您是否需要箭头,因为图中的颜色编码已经告诉 From / To 故事(FROM -> color edge FROM COUNTRY,TO 是 FROM COUNTRY 到达 TO COUNTRY 的颜色,IF FROM == TO 它自己的颜色返回其自己的基地(例如,参见 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()

顺便说一句->边缘上还有一个偏移量差异,它告诉它是 FROM(较宽的边缘)还是 TO(较小的边缘)

于 2015-08-11T14:06:11.777 回答