library(visNetwork)
Визуализация биобиблиографии одного из научных трудов Парвуса
Изучаем пределы возможности сетей (графов)
Проектирование сети
В качестве источника данных взяты результаты библиографического исследования коллекции трудов русского и немецкого социалиста И.Л.Гельфанда, более известного под псевдонимом Парвус, хранящейся в книжном фонде Центра социально-политической истории ГПИБ России (статья в печати).
В ходе работы, проведенной весной 2024 года, нами были получены данные о более, чем 220 инвентарных номерах книжных изданий научных и публицистических трудов Парвуса, хранящихся в библиотеке ЦСПИ. Все экземпляры были просмотрены de visu, на их основе составлена биобиблиографическая база данных. Целью настоящего исследования является попытка превращения биобиблиографической информации в математический объект, его визуализация и оценка потенциала и возможностей цифрового подхода к подобному типу данных.
Подготовка данных
Первоочередной задачей являлся дизайн создаваемой сети или графа. Выбор сущностей, которые будут представлять узлы сети и связей, выступающих, в качестве ее ребер.
После очень плодотворных консультаций с Борисом Валерьевичем Орехевым за основу был принят следующий подход:
Узлы: Труд/работа/книга Парвуса, и его(её) “владелец” или “актор”. Автор пишет, издатель переводит и публикует, читатель покупает и владеет, библиотека получает и ставит на полку (прячет в спецфонде).
Ребра: Ребрами в нашем случае будет процесс смены “актора” или “владельца” текста/труда/книги/работы.
Для лучшего понимания того, «что у ей вовнутре» устройства сетей, .csv файлы с данными узлов и ребер были сделаны вручную.
set.seed(20250305)
# Создаем узлы с tooltips
<- data.frame(
nodesPar id = c(1,
20, 30, 40, 50, 60,
100, 103, 104, 105, 106, 101, 102, 107, 108,
1000, 1001, 1002, 1003, 1004,
10001, 8001, 8002, 8003, 8004),
label = c("КНИГА: PARVUS \nDie Soziale \nBilanz des Krieges",
"ПУБЛИКАЦИЯ: \nСтокгольм \nИздание журнала Извне",
"ПУБЛИКАЦИЯ: \nBerlin Verlag für \nSozialwissenschaft",
"ПУБЛИКАЦИЯ: \nBudapest Népszava \nkönyvkereskedés kiadása",
"ПУБЛИКАЦИЯ: \nKøbenhavn Socialdemokratiets \nForlag Fremad",
"ПУБЛИКАЦИЯ: \nStockholm Frams \nFörlag",
"Владелец \n006 | 29",
"Владелец NA",
"Владелец \n1448 | 26",
"Владелец \n800 | 27",
"Владелец \n722 | 32",
"Владелец \n1538 | 28",
"Владелец \n1141 | 28",
"Владелец \n700 | 28",
"Владелец \n3135 | 29",
"Шифр полки \nв библиотеке: ЦР",
"Шифр полки \nв библиотеке: ЕА38",
"Шифр полки \nв библиотеке: ET255",
"Шифр полки \nв библиотеке: VIIC1",
"Шифр полки \nв библиотеке: ВВ255",
"Спецфонд. \nОграниченный доступ",
"Спецпометы: \nВладельческая надпись",
"Спецпометы: \nЗнак библиотеки",
"Спецпометы: \nСтраницы не разрезаны",
"Спецпометы: \nЗнак библиотеки"),
shape = "icon", # Используем иконки
title = c("Работа написана <br>в 1917 году на <br>немецком языке",
"Опубликована <br>на русском языке <br>в 1918 г.",
"Опубликована <br>на немецком языке <br>в 1917 г.",
"Опубликована <br>на венгерском языке <br>в 1918 г.",
"Опубликована <br>на датском языке <br>в 1917 г.",
"Опубликована <br>на шведском языке <br>в 1918 г.",
"Не установлен. <br>Владел до 1929 г.",
"Не установлен",
"Не установлен. <br>Владел до 1926 г.",
"Библиотека Р.Крейчи. <br>Владел до 1927 г.",
"Не установлен. <br>Владел до 1932 г.",
"Czóbel (Цобель). <br>Владел до 1928 г.",
"Не установлен. <br>Владел до 1928 г.",
"Библиотека Парвуса. <br>Владел до 1928 г.",
"Не установлен. <br>Владел до 1929 г. <br>Часть страниц не разрезаны",
"Рубрика: Русское зарубежье",
"Рубрика: Социализм, марксизм, <br>ленинизм и история <br>рабочего движения. Общий отдел. <br>Социализм и война.",
"Рубрика: Социализм, марксизм, <br>ленинизм и история <br>рабочего движения. <br>История рабочего движения в других странах. <br>Европа. Венгрия. <br>Политическое рабочее движение. <br>Социалистическое движение.",
"Рубрика: ИМЭ. Социализм и анархизм. <br>Научный социализм. <br>Маркс, Энгельс их ближайшие ученики.",
"Рубрика: Всеобщая история. <br>Самостоятельные страны <br>в период капитализма. <br>Общие сочинения.",
"Номер СФ-22429",
"Надпись: <br>Czóbel (Цобель)",
"На обложке марка <br>с голубой каемкой",
"Книгу не читали",
"На обложке марка <br>Библиотеки Парвуса"), # tooltips для каждого узла
icon = list(
face = "FontAwesome",
code = c("f2bd",
"f015", "f015", "f015", "f015", "f015",
"f007", "f007", "f007", "f007", "f007", "f007", "f007", "f007", "f007",
"f02e", "f02e", "f02e", "f02e", "f02e",
"f05e", "f14b", "f14b", "f14b", "f14b"), # Unicode иконок FA
size = 50,
color = c("darkred",
"blue", "blue", "blue", "blue", "blue",
"darkgrey", "darkgrey", "darkgrey", "darkgrey", "darkgrey", "darkgrey", "darkgrey", "darkgrey", "darkgrey",
"orange", "orange", "orange", "orange", "orange",
"red", "violet", "violet", "violet", "violet") # Цвета иконок
)
)$font <- lapply(nodesPar$label, function(x) list(vadjust = 10)) nodesPar
# Связи между узлами
<- data.frame(from = c(1, 1, 1, 1, 1,
edgesPar 20, 30, 30, 30, 30,
40, 40,
50, 60,
100, 101, 102, 103, 104, 105, 106, 107, 108,
1000,
101, 106, 108, 107),
to = c(20, 30, 40, 50, 60,
100, 103, 104, 105, 106,
101, 102,
107, 108,
1000, 1001, 1002, 1003, 1004, 1004, 1004, 1004, 1004,
10001,
8001, 8002, 8003, 8004))
Строим граф
На основе файлов с узлами (nodesPar.csv) и ребрами (edgesPar.csv) строим интерактивный граф с иконками, стрелками и tooltips (выпадающими подсказками).
Используем иконки с сайта FontAwesome.com. Для наглядности нами было выбрано 6 иконок для разных типов узлов:
Автор:
Издательство:
Читатель:
Библиотека:
Спецпометы:
Спецфонд:
Немного ЦМ (цифровой магии) из библиотеки visNetwork, которая немножко шуршит «под капотом» и выдает небольшой интерактивный граф. Интерактивный - это значит, что он будет взаимодействовать с вашей мышкой, попробуйте потянуть его за “усы”!
visNetwork(nodesPar, edgesPar, width = "100%", height = "600px") |>
visOptions(highlightNearest = list(enabled = TRUE, degree = 1, hover = TRUE)) |>
visEdges(smooth = TRUE, arrows = "to", arrowStrikethrough = FALSE) |>
visNodes(shapeProperties = list(borderDashes = TRUE, useBorderWithImage = TRUE)) |>
visNodes(size = 40, margin = list(top = 5, bottom = 5, left = 5, right = 5)) |>
visLayout(randomSeed = 321) |>
addFontAwesome()
Какой из этого всего можно сделать вывод? Не знаю, я так увлеклась интерактивностью полученной сети, что о науке совсем забыла…