提问人:eks03 提问时间:11/15/2023 更新时间:11/15/2023 访问量:30
无法使用 GGRAPH 将颜色从其他变量映射到网络图
unable to map color onto a network graph from an additional variable using ggraph
问:
我正在尝试创建一个文本网络图。我正在处理透视调查数据,并尝试将开放式评论中的单词与相关的数字响应相关联。我已经构建了单词相关性并将它们绘制成图表,但是在将数值关联回网络图时遇到了麻烦。我有使用 R 的经验,但我没有接受过正式的培训/课程,我确信我现在缺少一些非常基本的东西。
我能够使用以下代码成功创建绘图,假设图形是我的数据框,包含变量 x(来自调查数据的原始数字分数)、row_number(将使用的单个单词与初始开放式注释联系起来)、word、n(# 次“单词”出现在数据集中)和 y(每个单词的平均值 x)。
graph %>%
group_by(word) %>%
filter(n() >= 1000)%>%
pairwise_cor(word, row_number, upper=FALSE) %>%
filter(correlation > .09) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
scale_color_gradient(low = "red", high = "green") +
geom_node_text(aes(label = name), repel = TRUE) +
theme_void()
pairwise_cor 函数实质上将数据帧重塑为 item1、item2 和 correlation,删除了所有其他变量,这意味着我的相关颜色分配变量被删除,因此我创建了一个相关单词数据集,然后创建了一个将单个单词平均分数 (y) 与correlated_words数据集联接的final_df:
final <- cor_df %>%
left_join(filt_df, by = join_by(item1 == word)) %>%
left_join(filt_df, by = join_by(item2 == word))
“final”现在包含 item1(单词 1)、item2(单词 2)、相关性、n.1、y.1、n.2 和 y.2(其中 n 是单词计数,y 是一个奇怪的统计数据:X 的平均值,与该单词相关的原始调查数字分数)。
对于“最终”数据框,我现在尝试了多种方法将 y.1 或 y.2 映射到节点的颜色,通常如下所示:
as_tbl_graph(final)
ggraph(final, layout = "fr") +
geom_node_point(aes(color = y.1), size = 5) +
geom_node_text(aes(label = name), repel = TRUE) +
scale_color_gradient(low = "red", high = "green") +
theme_void()
这是我收到的错误:
错误:
!计算美学时的问题。
i 第 1 层发生错误。
由以下错误引起:
!未找到对象“Y.1”geom_node_point()
FUN()
不确定我到底哪里出了问题,尽管我一直在仔细研究 ggraph 和 tidygraph 的文档。我对各种布局可能性没有完全的概念性理解,我觉得这可能是我的问题所在(或者我的困惑可能是从通过as_tbl_graph构建数据帧本身开始的?),并且非常欢迎任何其他资源或文档来理解这些算法/自定义布局。(我已经阅读了 https://cran.r-project.org/web/packages/ggraph/vignettes/Layouts.html 和所有 ggraph 小插曲!
我的问题是,归根结底,是:如何使用数值变量通过 ggraph 向网络图中的节点添加颜色维度(或者更具体地说,我到底做错了什么)?提前感谢您的任何帮助!
答:
代码的第一个问题是,您传递的是 to 而不是 object 。data.frame
final
ggraph()
tbl_graph
as_tbl_graph(final)
第二个问题是,当转换为 和列时,您通过 成为 edge 数据的列或特征而不是节点来添加 和 列,因此无法在美学上映射。要解决第二个问题,您必须转换为第一个问题,然后加入您的 .这样,列就会添加到节点数据中。tbl_graph
y.1
y.2
lef_join
geom_node_xxx
cor_df
tbl_graph
filt_df
注意:我只做一个,因为第二个对节点数据没有意义。此外,我将列重命名为 to,因为我在使用 .left_join
y
value
y
使用一些基于以下数据集的虚假数据:highschool
ggraph
library(ggraph)
library(tidygraph)
library(dplyr, warn.conflicts = FALSE)
set.seed(123)
# Create example data
cor_df <- highschool
names(cor_df) <- c("item1", "item2", "correlation")
filt_df <- data.frame(
word = as.character(unique(cor_df$item1)),
y = runif(seq(length(unique(cor_df$item1))))
) |>
rename(value = y)
final_graph <- as_tbl_graph(cor_df) |>
left_join(
filt_df,
by = join_by(name == word)
)
ggraph(final_graph, layout = "fr") +
geom_node_point(aes(color = value), size = 5) +
geom_node_text(aes(label = name), repel = TRUE) +
scale_color_gradient(low = "red", high = "green") +
theme_void()
评论