2016-02-28 1 views
1

Я работаю над системой рекомендаций, которая использует 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

Спасибо большое за помощь!

ответ

0

Итак, в вашей сети, что представляет собой узел и что представляет собой ребро? Каждый узел представляет пользователя и каждый подобный кромки между двумя пользователями? Я думаю, вы должны уточнить, что, поскольку, по вашему вопросу, кажется, вы этого не сделали.

+0

Чтобы быть честным, я не писал его, чтобы держать тему только в программировании, но вот идея: С формальным анализом концепции вы создаете формальные концепции, которые являются связями между пользователями и фильмами. Нижняя часть графика (или дерева) представляет собой отправную точку объектов (например, «имена» здесь). После этого вершина графика является начальной точкой атрибутов (например, «фильмы» здесь). В терминах объектов график ориентирован на нижний и верхний. –

+0

Например, с изображением, которое я дал: Эшли увидела фильмы, которые видели Боб, Пол, Джордан и Габби. Но в дополнение ко всем из них она увидела Челюсти. С другой стороны, в терминах атрибутов график ориентирован сверху вниз. В том же примере: Рэмбо был замечен Павлом, Иорданией, Эшли и Джоном. Этот график является просто упрощением полного графика, который вы можете себе представить, с каждым узлом, представляющим кратных пользователей, и просмотренными ими фильмами. Поэтому узлы представляют как пользователей, так и фильмы, а их ребра - это только ссылки, ориентированные в обоих направлениях. Надеюсь, я сделал это яснее :) –

+0

Нет, вы этого не сделали :). Дело в том, что рис, который вы показываете, больше похож на дерево, чем на график. В графе ребро - это не просто ссылка. Он представляет что-то, и вы можете добавить к этому вес. Например, возьмите Боба, Павла и Иордана. Боб и Пол имеют 5 фильмов, а доля Боба и Джордана - 2. Это может быть граф с тремя узлами и двумя ребрами (B, P, вес = 5) и (B, J, вес = 2). Весы не нужны, но вы можете использовать их для добавления дополнительной информации в график. Метки, которые вы пытаетесь использовать, являются просто строками и просто используются для идентификации узлов друг от друга. Большинство людей используют для этого целые числа. –