R 圆弦图
R Circular Chord Plots
我正在学习如何在 R 中创建圆形图,类似于 CIRCOS
我使用包 circlize 根据航班是否为 OB、Inbound 和 Return 在起点和目的地对之间绘制链接。数据的逻辑并不重要,它只是一个玩具示例
我已经根据下面的代码让情节发挥作用,该代码根据以下逻辑发挥作用
- 拿我的数据,结合目的地列和航班类型
- 转换为矩阵并将原点和新列输入 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 但我担心当他们转向更高级的东西时我会迷路
非常感谢您的宝贵时间
您是否需要箭头,因为图中的颜色编码已经说明了从/到的故事(从 -> 来自国家/地区的颜色边缘,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 :))。
上述代码中,col
、directional
、direction.type
、diffHeight
都可以设置为向量,对应df
中的行。
当chordDiagram()
中的directional
参数设置为2时,对应的link会有两个方向。那么如果direction.type
包含箭头,就会出现双头箭头。
因为 diffHeight
是一个对应于 df
行的向量,如果你想通过箭头和根的偏移来可视化单个 link 的方向,你需要将这两个选项合并为一个字符串,如示例代码 "arrows+diffHeight"
.
所示
默认情况下 link 的方向是从第一列到第二列。但在你的情况下,IB
表示反向,因此我们需要将 diffHeight
设置为负值以反转默认方向。
最后,我观察到你有 link 开始和结束在同一个扇区(ES-ES-DOM
和 US-US-DOM
),你可以使用 self.link
参数来控制如何表示这样的自我link。下图中self.link
设置为1。
我正在学习如何在 R 中创建圆形图,类似于 CIRCOS 我使用包 circlize 根据航班是否为 OB、Inbound 和 Return 在起点和目的地对之间绘制链接。数据的逻辑并不重要,它只是一个玩具示例
我已经根据下面的代码让情节发挥作用,该代码根据以下逻辑发挥作用
- 拿我的数据,结合目的地列和航班类型
- 转换为矩阵并将原点和新列输入 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 但我担心当他们转向更高级的东西时我会迷路
非常感谢您的宝贵时间
您是否需要箭头,因为图中的颜色编码已经说明了从/到的故事(从 -> 来自国家/地区的颜色边缘,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 :))。
上述代码中,col
、directional
、direction.type
、diffHeight
都可以设置为向量,对应df
中的行。
当chordDiagram()
中的directional
参数设置为2时,对应的link会有两个方向。那么如果direction.type
包含箭头,就会出现双头箭头。
因为 diffHeight
是一个对应于 df
行的向量,如果你想通过箭头和根的偏移来可视化单个 link 的方向,你需要将这两个选项合并为一个字符串,如示例代码 "arrows+diffHeight"
.
默认情况下 link 的方向是从第一列到第二列。但在你的情况下,IB
表示反向,因此我们需要将 diffHeight
设置为负值以反转默认方向。
最后,我观察到你有 link 开始和结束在同一个扇区(ES-ES-DOM
和 US-US-DOM
),你可以使用 self.link
参数来控制如何表示这样的自我link。下图中self.link
设置为1。