ggraph изменить цвет geom_node_text на основе ключевых слов - PullRequest
1 голос
/ 19 мая 2019

Чтение Tidytext Mining с R - https://www.tidytextmining.com/nasa.html - У меня следующий вопрос:

По умолчанию цвет текста узла черный, и я смог настроить цвет глобально но возможно ли иметь цвет по умолчанию черный, но другие цвета, основанные на ключевых словах?

library(ggplot2)
library(igraph)
library(ggraph)

set.seed(1234)
title_word_pairs %>%
 filter(n >= 250) %>%
 graph_from_data_frame() %>%
 ggraph(layout = "fr") +
 geom_edge_link(aes(edge_alpha = n, edge_width = n)
 , edge_colour = "cyan4") +
 geom_node_point(size = 5) +
 geom_node_text(aes(label = name), repel = TRUE
 , point.padding = unit(0.2, "lines"), colour="red") +
 theme_void()

enter image description here

На изображении выше «земля» и «данные» будут красным, а весь остальной текст будет черным.

1 Ответ

1 голос
/ 19 мая 2019

Без воспроизводимого примера я прошел по ссылке и сделал небольшой набор данных для иллюстрации своего решения.

Использование данных ggplot для создания спискацвета:

Здесь я создал igraph без узлов, текста и т. д., а затем использовал его данные для составления списка желаемых цветов.

library(dplyr)
library(widyr)
library(ggplot2)
library(igraph)
library(ggraph)

title_word_pairs1 <- structure(list(item1 = c("phase", "ges", "phase", "1", "phase", 
                                              "phase", "ges", "disc", "phase", "phase"), 
                                    item2 = c("ii", "disc", "system", "version", "space",
                                              "based", "degree", "degree", "low", "power"), 
                                    n = c(2498, 1201, 948, 678, 637, 601, 582, 582, 480, 441)), 
                                row.names = c(NA, -10L), class = c("tbl_df", "tbl", data.frame"))

set.seed(1)
g <- title_word_pairs1 %>%
  filter(nnn >= 250) %>%
  graph_from_data_frame() %>%
  ggraph(layout = "fr")

mcolor <- g$data %>% mutate(mcolor = if_else(name%in%c("low", "space"), "blue", "black")) %>% select(mcolor)


g +
  geom_edge_link(aes(edge_alpha = n, edge_width = n)
                 , edge_colour = "cyan4") +
  geom_node_point(size = 5) +
  geom_node_text(aes(label = name), repel = TRUE
                 , point.padding = unit(0.2, "lines"), colour=mcolor$mcolor) +
  theme_void() + theme(legend.position="none")

Создано в 2019-05-19 с помощью представительного пакета (v0.2.1)

Манипулирование ggplot_build цветами объекта до желаемых цветов:

В основном я делаю построение графика и затем манипулирую объектом ggplot, чтобы получить желаемые цвета.

library(dplyr)
library(widyr)
library(ggplot2)
library(igraph)
library(ggraph)


title_word_pairs1 <- structure(list(item1 = c("phase", "ges", "phase", "1", "phase", 
                                              "phase", "ges", "disc", "phase", "phase"), 
                                    item2 = c("ii", "disc", "system", "version", "space",
                                              "based", "degree", "degree", "low", "power"), 
                                    n = c(2498, 1201, 948, 678, 637, 601, 582, 582, 480, 441)), 
                                row.names = c(NA, -10L), class = c("tbl_df", "tbl", data.frame"))

set.seed(1)
g <- title_word_pairs1 %>%
  filter(n >= 250) %>%
  graph_from_data_frame() %>%
  ggraph(layout = "fr") +
  geom_edge_link(aes(edge_alpha = n, edge_width = n)
                 , edge_colour = "cyan4") +
  geom_node_point(size = 5) +
  geom_node_text(aes(label = name), repel = TRUE
                 , point.padding = unit(0.2, "lines"), colour="red") +
  theme_void() + theme(legend.position="none")


g

gg <- ggplot_build(g)

gg$data[[3]] <- gg$data[[3]] %>%
                             mutate(colour = if_else(label%in%c("low", "space"), "blue", "black"))

gt <- ggplot_gtable(gg)

plot(gt)

Создано в 2019-05-18 с помощью пакета prex (v0.2.1)

...