无法使用 GGRAPH 将颜色从其他变量映射到网络图

unable to map color onto a network graph from an additional variable using ggraph

提问人:eks03 提问时间:11/15/2023 更新时间:11/15/2023 访问量:30

问:

我正在尝试创建一个文本网络图。我正在处理透视调查数据,并尝试将开放式评论中的单词与相关的数字响应相关联。我已经构建了单词相关性并将它们绘制成图表,但是在将数值关联回网络图时遇到了麻烦。我有使用 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 向网络图中的节点添加颜色维度(或者更具体地说,我到底做错了什么)?提前感谢您的任何帮助!

R NLP 可视化 GGRAPH

评论


答:

0赞 stefan 11/15/2023 #1

代码的第一个问题是,您传递的是 to 而不是 object 。data.framefinalggraph()tbl_graphas_tbl_graph(final)

第二个问题是,当转换为 和列时,您通过 成为 edge 数据的列或特征而不是节点来添加 和 列,因此无法在美学上映射。要解决第二个问题,您必须转换为第一个问题,然后加入您的 .这样,列就会添加到节点数据中。tbl_graphy.1y.2lef_joingeom_node_xxxcor_dftbl_graphfilt_df

注意:我只做一个,因为第二个对节点数据没有意义。此外,我将列重命名为 to,因为我在使用 .left_joinyvaluey

使用一些基于以下数据集的虚假数据:highschoolggraph

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()

评论

0赞 eks03 11/15/2023
谢谢!这是有道理的。我无法将cor_df转换为tbl_graph;我收到错误:make_empty_graph中的错误(n = 0,定向 = 定向):无法强制“列表”对象键入“logical” 我的cor_df是一个 3 变量数据框,其中前两个变量是 item1 和 item2,包含单个词干词,correlation 包含它们之间计算的相关性。你能帮我了解我哪里出错了吗?
0赞 eks03 11/15/2023
对不起,把这个评论留给后代,但请划一下——我只需要取消分组。想通了。