ggraph 中弧的颜色基于列值、请求值的数量

问题描述

这个问题是关于 R 中的 ggraph 库。这是工作示例

set.seed(3)
widths <- sample(seq(0.1,1,0.1),10)
test.df <- data.frame("from" = seq(1,10),"to" = rep(c(2,6),5),"col" = rgb(seq(0,length.out=10),0),"width" = factor(widths,levels=sort(widths)))

arc_test <- graph_from_data_frame(test.df)

ggraph(arc_test,layout = 'linear',circular = TRUE) + 
  geom_edge_arc0(aes(edge_width=width,edge_color=col)) + 
  scale_color_identity() +
  coord_fixed() +
  geom_node_text(label=test.df$from)

> test.df
   from to     col width
1     1  2 #000000   0.5
2     2  6 #1C0000   0.7
3     3  2 #390000   0.4
4     4  6 #550000   0.2
5     5  2 #710000   0.3
6     6  6 #8E0000   0.8
7     7  2 #AA0000   0.9
8     8  6 #C60000   0.6
9     9  2 #E30000     1
10   10  6 #FF0000   0.1

给出这个图:

Resulting graph

您可以看到数据框中的颜色没有被解释。我期待 scale_color_identity() 能够按照 SO here函数帮助中的指示实现这一点。如果我把 edge_color 放在美学之外

geom_edge_arc0(aes(edge_width=width),edge_color=test.df$col)

我收到一个错误,要求我提供长度为 36 的数据。如果我测试这 36 个值的作用

geom_edge_arc0(aes(edge_width=width),edge_color = rep(test.df$col,each=4)[-1:-4])

我看到 df 的颜色被解释,但分配错误(颜色顺序与线条的顺序匹配)。

enter image description here

这让我倍感困惑,所以这让我想到了以下三个问题:

a) 我如何实现我想要的?

b) 为什么 aes() 之外的颜色需要 36 个值?它甚至不是 10 行的倍数,而是 4*行 -4。 geom_edge_arcgeom_edge_arc2 甚至请求 900 个值。我在哪里可以找到所有这些值的要求?

c) 如果我在 aes() 之外定义颜色,为什么颜色顺序与数据框不匹配?

解决方法

我找到了解决问题 a)

我必须明确使用 scale_edge_color_identity() 而不是 scale_color_identity() 来解释数据框颜色!