Код

Для начала скопируем строчки кода из домашнего задания (работать я буду с данными 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")

Результат

При запуске мы получили следующую картинку:

Всем спасибо за внимание!