【问题标题】:R Circular Chord PlotsR 圆和弦图
【发布时间】:2015-08-09 11:12:02
【问题描述】:

我正在学习如何在 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 航班的保护伞

例如,

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

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

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

非常感谢您的宝贵时间

【问题讨论】:

    标签: r plot chord-diagram


    【解决方案1】:

    首先,我认为您的数据中有重复记录 (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 中的行相对应的向量。

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

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

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

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

    【讨论】:

    • 令人印象深刻且非常有用!我希望约翰会通过点击 V 来接受这个答案 ;^)
    【解决方案2】:

    您是否需要箭头,因为图表中的颜色编码已经告诉 From / To 故事(FROM -> 颜色边缘 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(较小的边缘)

    【讨论】:

    • 嗨@irJvV,非常感谢您的建议。我认为最好在国家/地区轨道之外有另一条轨道,作为显示 IB OB 和 DOM 的伞。能够区分可视化的飞行类型很重要
    • 嗨约翰,你打算以什么方式使用图表?作为图像、网页或其他内容?
    • 作为图像。这个想法是显示始发地目的地对和航班类型。对于此示例,只有三种,但实际上最多有 8 种不同类型的航班。谢谢你的OFFSET,我不知道它存在
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2015-12-02
    • 2015-08-22
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多