使用 R 中的 ggraph 包排列和着色圆圈

问题描述 投票:0回答:1

我有一个数据框 df:

df

dput(df)
structure(list(group = c("root", "root", "NS2A", "NS2A", "NS2A", 
"NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", 
"NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5"), subitem = c("NS2A", 
"NS5", "NS2A_C_to_A_Nonsynonymous_3931_1.0015", "NS2A_C_to_A_Nonsynonymous_3931_0.9404", 
"NS2A_C_to_A_Nonsynonymous_3931_1.0141", "NS5_G_to_A_Synonymous_8561_2.6323", 
"NS5_A_to_T_Synonymous_9728_2.4983", "NS5_G_to_A_Synonymous_8561_2.5331", 
"NS5_A_to_T_Synonymous_9728_2.3962", "NS5_G_to_A_Synonymous_8561_2.1411", 
"NS5_A_to_T_Synonymous_9728_2.6646", "NS5_G_to_A_Synonymous_8561_2.0874", 
"NS5_A_to_T_Synonymous_9728_2.6065", "NS5_G_to_A_Synonymous_8561_2.3789", 
"NS5_A_to_T_Synonymous_9728_2.6322", "NS5_G_to_A_Synonymous_8561_3.2712", 
"NS5_A_to_C_Nonsynonymous_9276_2.8576", "NS5_A_to_T_Synonymous_9728_2.7555", 
"NS5_G_to_A_Synonymous_8561_1.9121", "NS5_A_to_C_Nonsynonymous_9276_5.1328", 
"NS5_A_to_T_Synonymous_9728_2.6368"), size = c(0, 0, 1.0015, 
0.9404, 1.0141, 2.6323, 2.4983, 2.5331, 2.3962, 2.1411, 2.6646, 
2.0874, 2.6065, 2.3789, 2.6322, 3.2712, 2.8576, 2.7555, 1.9121, 
5.1328, 2.6368), Pass = c("PA", "PA", "P1", "P7", "P12", "P0", 
"P0", "P1", "P1", "P3", "P3", "P5", "P5", "P7", "P7", "P10", 
"P10", "P10", "P12", "P12", "P12"), cc = c("#FFFFFF", "#FFFFFF", 
"#fc2f92", "#b84592", "#8e43e7", "#3369e7", "#3369e7", "#fc2f92", 
"#fc2f92", "#00aeff", "#00aeff", "#ff4f81", "#ff4f81", "#b84592", 
"#b84592", "#Cf6c5f", "#Cf6c5f", "#Cf6c5f", "#8e43e7", "#8e43e7", 
"#8e43e7")), row.names = c(NA, -21L), class = "data.frame")

我想创建一个根白色圆圈,其中包含两个白色子圆圈,每个圆圈都包含列出的子项目。颜色在 df$cc

中分配
vertices <- df %>% 
  distinct(subitem, size) %>% 
  add_row(subitem = "root", size = 0)

graph <- graph_from_data_frame(df, vertices = vertices)


dffff <- data.frame(group="root",    
                    subitem="root", 
                    size=0,
                    Pass="PA",
                    cc="#FFFFFF")
cc <- c("#FFFFFF","#fc2f92","#b84592","#8e43e7","#3369e7","#00aeff","#ff4f81","#Cf6c5f")

df2=data.frame(Pass=unique(df$Pass),cc=cc)
data2<-dplyr::inner_join(df,df2)
df<-data2
ggg<-rbind(df,dffff)
ggg <- mutate_at(ggg, vars(cc), as.factor)


ggraph(graph, layout = "circlepack", weight = size) + 
  geom_node_circle(aes(fill=ggg$cc,colour = size,group=size)) +
  coord_fixed()

但是,我得到的图,它为每个圆分配了错误的颜色,并且 NS5 子圆中最大的子项排列在中间(这里是大的蓝色圆),但我不想放在中间

r ggplot2 ggraph
1个回答
0
投票

获得正确的颜色可以很容易地解决。首先,要获得正确的颜色分配,请使用

igraph::V()
将颜色添加到图形对象的顶点。其次,由于您的颜色是颜色代码,因此请使用
scale_fill_identity
。不幸的是,在查看文档后,我认为自定义网络中节点位置的选项非常有限。

library(igraph)
library(ggraph)

set.seed(123)

V(graph)$color <- ggg$cc

ggraph(graph,
  layout = "circlepack",
  weight = size
) +
  geom_node_circle(aes(fill = color, colour = size, group = size)) +
  scale_fill_identity() +
  coord_fixed()

© www.soinside.com 2019 - 2024. All rights reserved.