Для начала скопируем строчки кода из домашнего задания (работать я буду с данными caesar, потому что против латыни ничего не имею):
caesar <- udpipe_read_conllu("https://github.com/locusclassicus/text_analysis_2024/raw/main/files/bg_latinpipe.conllu")
caesar_subset <- caesar |>
filter(upos == "NOUN")
cooc2_table <- cooccurrence(caesar_subset$lemma,
relevant = caesar_subset$upos %in% c("NOUN", "ADJ"),
skipgram = 1) |>
as_tibble() |>
filter(cooc > 10)
Теперь, когда у нас есть таблица с некоторым показателем, преобразуем её в граф (и сразу же посчитаем degree, чтобы потом это “знание” использовать при построении картинки)
cooc2_graph <- graph_from_data_frame(cooc2_table)
d <- as.numeric(degree(cooc2_graph))
V(cooc2_graph)$degree <- d
Теперь напишем код, который нарисует мне желаемый граф на исходных данных, подчиняющийся моей задумке - так как граф у меня неориентированный, да и картинки в виде фотографий исторических личностей тут не добавишь, то я придумала следующее: я хочу, чтобы а) цвет ребер менялся в зависимости от веса ребра (был более или менее прозрачным); б) размер вершины зависел от степени; в) граф был уложен.
ggraph(cooc2_graph, layout = "nicely") +
geom_edge_link(aes(edge_colour = cooc, edge_alpha = cooc), width = 1.5, show.legend = TRUE) +
geom_node_point(aes(size = degree), color = "steelblue") +
geom_node_text(aes(label = name), repel = TRUE, size = 4) +
scale_edge_colour_gradient(low = "lightblue", high = "darkblue") +
scale_edge_alpha(range = c(0.2, 1)) +
theme_graph() +
labs(title = "Граф совместной встречаемости слов (cooc2)",
edge_colour = "Вес (частота)",
size = "Степень узла")
ggsave("word_network.png",
width = 10,
height = 8,
units = "in",
dpi = 300,
bg = "white")
При запуске мы получили следующую картинку:
Всем спасибо за внимание!