Я работаю над системой рекомендаций, которая использует formal concept analysis, чтобы найти ближайшего аналогичного клиента в сети. Для создания формальных понятий я использую панды, для сетей networkx и для построения matplotlib, т.е. все в Python 3.Networkx несколько атрибутов на узлах для нескольких меток на графике
Моя проблема в том, что я хочу представить на графике два типа атрибутов, имеющих каждый узел: имена например, клиентов и фильмов. Чтобы дать быстрый пример: узел 1: «имена» -> [«Боб», «Джон»]; «Фильмы» -> [«Челюсти»]. «Имена» и «Фильмы» кодируются как атрибуты узлов. Продолжая пример:
G=nx.Graph()
G.add_nodes_from([1,2])
G.add_edge(1,2)
G.node[1]['names']=["Bob","John"]
G.node[1]['movies']=["Jaws"]
К сожалению, после долгих часов, чтобы найти как поставить 2 вида этикетки на каждом узле графа, я не нашел ответа. Вот что я думаю, что я должен использовать, но я не знаю, как взаимодействовать с Matplotlib или NetworkX сделать двойную маркировку:
node_labels = nx.get_node_attributes(G,"names")
node_labels2 = nx.get_node_attributes(G,"movies")
nx.draw_networkx_labels(G,labels = ?)
Другим важным аспектом проблемы является поставить «кино» на вершине узел и «имена» под узлом, как показано на изображении ниже.
An image of the type of graph I am looking for
Спасибо большое за помощь!
Чтобы быть честным, я не писал его, чтобы держать тему только в программировании, но вот идея: С формальным анализом концепции вы создаете формальные концепции, которые являются связями между пользователями и фильмами. Нижняя часть графика (или дерева) представляет собой отправную точку объектов (например, «имена» здесь). После этого вершина графика является начальной точкой атрибутов (например, «фильмы» здесь). В терминах объектов график ориентирован на нижний и верхний. –
Например, с изображением, которое я дал: Эшли увидела фильмы, которые видели Боб, Пол, Джордан и Габби. Но в дополнение ко всем из них она увидела Челюсти. С другой стороны, в терминах атрибутов график ориентирован сверху вниз. В том же примере: Рэмбо был замечен Павлом, Иорданией, Эшли и Джоном. Этот график является просто упрощением полного графика, который вы можете себе представить, с каждым узлом, представляющим кратных пользователей, и просмотренными ими фильмами. Поэтому узлы представляют как пользователей, так и фильмы, а их ребра - это только ссылки, ориентированные в обоих направлениях. Надеюсь, я сделал это яснее :) –
Нет, вы этого не сделали :). Дело в том, что рис, который вы показываете, больше похож на дерево, чем на график. В графе ребро - это не просто ссылка. Он представляет что-то, и вы можете добавить к этому вес. Например, возьмите Боба, Павла и Иордана. Боб и Пол имеют 5 фильмов, а доля Боба и Джордана - 2. Это может быть граф с тремя узлами и двумя ребрами (B, P, вес = 5) и (B, J, вес = 2). Весы не нужны, но вы можете использовать их для добавления дополнительной информации в график. Метки, которые вы пытаетесь использовать, являются просто строками и просто используются для идентификации узлов друг от друга. Большинство людей используют для этого целые числа. –