【问题标题】:From igraph to ggplot object从 igraph 到 ggplot 对象
【发布时间】:2019-06-22 15:23:15
【问题描述】:

我已经使用 ggraph 和 igraph 构建了一个树状图。

library(ggraph)
library(igraph)
EL <- read.csv("EL2.csv", sep=";",header=TRUE, stringsAsFactors = FALSE)
ELM <-as.matrix(EL)
mygraph <- graph_from_data_frame(ELM)
ggraph(mygraph, layout = 'dendrogram', circular = TRUE) + 
  geom_edge_diagonal() +
  geom_node_point() +
  theme_void()

但是,我需要节点和边的基础数据才能在 Tableau 中重新创建它。

我想使用 ggplot_build,但这需要一个 ggplot 对象。为了创建我正在尝试使用 ig2ggplot,但它返回错误:

ig2ggplot(mygraph, dfOnly = FALSE, labels = FALSE, metab = TRUE)

layout.norm(g$layout, xmax = 1, xmin = 0, ymin = 0, ymax = 1) 中的错误: `layout' 不是矩阵

这是否意味着我必须将 igraph 转换为矩阵?因为情节看起来和我想要的完全一样。我只是想阻止基础数据。任何有关如何将我的 igraph 变成 ggplot 的帮助将不胜感激。

编辑:带有 dput() 的数据(抱歉,之前没有使用过,所以我不知道它是否正确)

输入(EL) 结构(列表(来自 = c(“印欧语”,“阿尔巴尼亚语”,“Gheg”, “阿尔巴尼亚人”、“托斯克人”、“托斯克人”、“托斯克人”、“印欧人”、“亚美尼亚人”、 “亚美尼亚语”、“印欧语系”、“波罗的斯拉夫语系”、“波罗的海语系”、“东方语系”、 “东方”,“东方”,“东方”,“波罗的海”,“西方”,“波罗的斯拉夫”, “斯拉夫”,“东方”,“东方”,“东方”,“东方”,“斯拉夫”,“南方”, “东南”、“东南”、“东南”、“南”、“西南”、 “西南”、“西南”、“西南”、“西南”、 “斯拉夫”,“西方”,“捷克斯洛伐克”,“捷克斯洛伐克”,“西方”,“Lechitic”, “Lechitic”、“Lechitic”、“West”、“Sorbian”、“Sorbian”、“Indo-European”、 “凯尔特人”,“岛国”,“布莱斯尼克”,“布莱斯尼克”,“布莱斯尼克”,“岛国”, “Goidelic”,“Goidelic”,“Goidelic”,“印欧语”,“日耳曼语”, “北日耳曼语”,“东斯堪的纳维亚语”,“东斯堪的纳维亚语”,“丹麦-瑞典语”, “丹麦-博克马尔”、“丹麦-瑞典”、“丹麦-里克马尔”、“丹麦-瑞典”、 “北日耳曼人”,“西斯堪的纳维亚人”,“西斯堪的纳维亚人”,“日耳曼人”, “西日耳曼语”,“英语”,“英语”,“西日耳曼语”,“弗里斯兰语”, “弗里斯兰语”、“弗里斯兰语”、“西日耳曼语”、“高地德语”、“德语”、 “德语”、“中德语”、“东中德”、“东中德”、 “东中德”、“东中德”、“中德”、 “西中德”、“西中德”、“西中德”、 “西中德”、“摩泽尔法兰克”、“德”、“上德”、 “上德语”,“Alemannic”,“Alemannic”,“Alemannic”,“Alemannic”, “上德语”,“巴伐利亚-奥地利”,“巴伐利亚-奥地利”,“巴伐利亚-奥地利”, “巴伐利亚-奥地利”、“高地德语”、“意第绪语”、“意第绪语”、“西日耳曼语”、 “低撒克逊-低法兰克语”,“低法兰克语”,“低法兰克语”, “低弗兰肯”,“低弗兰肯”,“低弗兰肯”,“低撒克逊-低弗兰肯”, “低撒克逊”,“低撒克逊”,“低撒克逊”,“低撒克逊”,“低撒克逊”, “低撒克逊”,“低撒克逊”,“低撒克逊”,“低撒克逊”,“低撒克逊”, “低撒克逊语”、“印欧语”、“希腊语”、“阁楼”、“阁楼”、“阁楼”、 "阁楼", "阁楼", "希腊语", "多立克"), to = c("阿尔巴尼亚语", "Gheg", “Gheg阿尔巴尼亚人”,“Tosk”,“Arbereshe阿尔巴尼亚人”,“Arvanitika阿尔巴尼亚人”, “托斯克阿尔巴尼亚语”、“亚美尼亚语”、“亚美尼亚语(语言)”、“西亚美尼亚语”、 “Balto-Slavic”、“Balto-Slavic”、“Baltic”、“Eastern”、“Latgalian”、“Standard Latvian”、 “立陶宛语”、“萨莫吉希亚语”、“西方语”、“普鲁士语”、“斯拉夫语”、 “东方”、“白俄罗斯”、“俄罗斯”、“Rusyn”、“乌克兰”、“南方”、 “东南”,“保加利亚”,“马其顿”,“教会斯拉夫”, “西南”、“波斯尼亚”、“克罗地亚”、“黑山”、“塞尔维亚”、 “斯洛文尼亚”,“西方”,“捷克斯洛伐克”,“捷克”,“斯洛伐克”,“Lechitic”, “Kashubian”、“Polish”、“Silesian”、“Sorbian”、“Lower Sorbian”、 “上索布”、“凯尔特人”、“岛国”、“布赖顿”、“布列塔尼”、 “康沃尔语”、“威尔士语”、“Goidelic”、“爱尔兰语”、“Manx”、“苏格兰盖尔语”、 “日耳曼语”、“北日耳曼语”、“东斯堪的纳维亚语”、“Oevdalian”、 “丹麦-瑞典”、“丹麦-博克马尔”、“挪威”、“丹麦-里克马尔”、 “丹麦语”、“瑞典语”、“西斯堪的纳维亚语”、“法罗语”、“冰岛语”、 “西日耳曼语”、“英语”、“英语(语言)”、“苏格兰语”、“弗里斯兰语”、 “弗里斯兰语(语言)”、“北弗里斯兰语”、“萨特弗里斯语”、“高地德语”、 “德语”,“Hunsrik”,“中德”,“东中德”,“标准德语”, “上撒克逊”、“下西里西亚”、“怀米索里”、“西中德”、 “宾夕法尼亚德语”、“普法尔茨法兰克语”、“里普里亚语”、“摩泽尔法兰克语”、 “卢森堡语”、“上日耳曼语”、“东法兰克语”、“阿勒曼尼语”、 “Colonia Tovar German”,“瑞士德语”,“Swabian”,“Walser”, “巴伐利亚-奥地利”、“巴伐利亚”、“Cimbrian”、“Hutterisch”、“Mocheno”、 “意第绪语”、“东部意第绪语”、“西部意第绪语”、“低撒克逊-低弗兰肯语”、 “低法兰克语”、“南非荷兰语”、“荷兰语”、“林堡语”、“弗拉姆语”、 “Zeeuws”、“Low Saxon”、“Achterhoeks”、“Drents”、“Gronings”、“Plautdietsch”、 “Sallands”、“East Frisian Low Saxon”、“Low Saxon”、“Stellingwerfs”、 “Twents”、“Veluws”、“Westphalien”、“Greek”、“Attic”、“Cappadosian Greek”、 “希腊语(语言)”、“古希腊语”、“Pontic”、“Yevanic”、“Doric”、 "Tsakonian")), class= "data.frame", row.names = c(NA, -136L))

【问题讨论】:

  • 请编辑您的问题并添加一些数据(使用dput())。
  • 完成。我希望这是使用 dput() 的正确方法,但如果我错了,请纠正我。

标签: r ggplot2 igraph


【解决方案1】:

布局告诉igraph 每个节点的 xy 位置用于绘图。 ig2ggplot 要求将布局存储为图形属性。你需要做这样的事情

mygraph <- igraph::graph_from_data_frame(ELM) #create a graph
mylayout <- igraph::layout_as_tree(mygraph, circular = T) #create a circular layout

mygraph$layout = mylayout #store layout as a graph attribute


#another gotcha is that ig2ggplot needs both vertex names and vertex labels. 
#as of now you just have vertex names. 
V(mygraph)$label = V(mygraph)$name #store label as a vertex attrbute


MetamapsDB::ig2ggplot(mygraph, 
                      dfOnly = FALSE, 
                      labels = FALSE, 
                      metab = TRUE ) + 
    theme(legend.position = 'none')

【讨论】:

  • 效果很好,谢谢!!!关于这个的一个后续问题:是否可以将分支扩展到 ggplot 中的最深层次? igraph 自动完成,我认为它看起来非常整洁。
  • 我还发现通过layout_as_tree(mygraph, root = numeric(), circular = TRUE, rootlevel = numeric(), mode = "out", flip.y = TRUE)返回的坐标非常在 Tableau 中绘制时与您的图表相似的结果。但是,我似乎缺少一些节点,并会调查它
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2021-03-01
  • 2021-06-27
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
相关资源
最近更新 更多