R圆形和弦图

Joh*_*ith 1 plot r chord-diagram

我正在学习如何在R中创建圆形图,类似于CIRCOS Im使用包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()
Run Code Online (Sandbox Code Playgroud)

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

所以例如,

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

任何人都可以帮助,有没有人见过以前做过类似的事情?最终结果应该只是让一些国家出现在地块上,以便有人能够非常快速地看到哪些国家拥有最多的航班

我曾尝试过其他帖子,但我担心当他们转向更高级的东西时我会迷路

非常感谢您的宝贵时间

Zug*_* Gu 7

首先,我认为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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

首先,您需要使用circlize的开发版本,您可以通过它来安装它

devtools::install_github("jokergoo/circlize")
Run Code Online (Sandbox Code Playgroud)

在这个新版本中,chordDiagram()支持输入变量作为数据框并为链接绘制双头箭头(刚读完帖子:)).

在上面的代码中,col,directional,direction.typediffHeight都可以设定为对应于行的载体df.

directional参数输入chordDiagram()设置为2时,相应的链接将有两个方向.然后如果direction.type包含箭头,则会有一个双头箭头.

由于diffHeight是一个对应于行的向量df,如果要通过箭头和根的偏移来显示单个链接的方向,则需要将这两个选项合并为单个字符串,如示例代码所示"arrows+diffHeight".

默认情况下,链接的方向是从第一列到第二列.但在你的情况下,IB意味着反转的方向,所以我们需要设置diffHeight一个负值来反转默认方向.

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

在此输入图像描述