Как визуализировать социальные сети с помощью Python
Мне нужно определить социальную сеть, проанализировать ее и нарисовать. Я мог бы нарисовать его вручную и проанализировать (рассчитать различные показатели) вручную. Но я не хотел бы изобретать велосипед.
Я пытался использовать matplotlib, но мне нужно использовать его в интерактивном режиме, и в нескольких строках рассказать, как загрузить данные, а затем вызвать функцию рендеринга, которая будет отображать график как SVG.
Как я могу визуализировать социальные сети описанным способом?
3 ответа
networkx - очень мощная и гибкая библиотека Python для работы с сетевыми графами. Направленные и ненаправленные соединения могут использоваться для соединения узлов. Сети могут быть построены путем добавления узлов и затем соединяющих их ребер, или просто путем перечисления пар ребер (будут автоматически созданы неопределенные узлы). После создания узлы (и ребра) могут быть помечены произвольными метками.
Хотя networkx можно использовать для визуализации сети (см. Документацию), вы можете предпочесть использовать приложение для визуализации сети, такое как Gephi (доступно на http://gephi.org/). networkx поддерживает широкий спектр форматов импорта и экспорта. Если вы экспортируете сеть, используя такой формат, как GraphML, экспортированный файл можно легко загрузить в Gephi и визуализировать там.
import networkx as nx
G=nx.Graph()
G.add_edges_from([(1,2),(1,3),(1,4),(3,4)])
G
>>> <networkx.classes.graph.Graph object at 0x128a930>
G.nodes(data=True)
>>> [(1, {}), (2, {}), (3, {}), (4, {})]
G.node[1]['attribute']='value'
G.nodes(data=True)
>>> [(1, {'attribute': 'value'}), (2, {}), (3, {}), (4, {})]
nx.write_graphml(G,'so.graphml')
Есть три ответа, которые упоминают Networkx и Gephi, но никто не упомянул граф-инструмент. Основное отличие состоит в том, что алгоритмы реализованы на C++, что дает повышение производительности по сравнению, например, с Networkx.
И это также охватывает визуализацию. С сайта:
Удобно рисовать свои графики, используя разнообразные алгоритмы и форматы вывода (в том числе на экран). Graph-tool имеет собственные алгоритмы компоновки и универсальные интерактивные процедуры рисования, основанные на cairo и GTK+, но он также может работать как очень удобный интерфейс для превосходного пакета graphviz.
Вот хороший пример из документации (есть еще много других):
(Блокировка раздела политической сети блогов).
И код для этого:
>>> g = gt.collection.data["polblogs"]
>>> g = gt.GraphView(g, vfilt=gt.label_largest_component(gt.GraphView(g, directed=False)))
>>> state = gt.BlockState(g, B=g.num_vertices(), deg_corr=True)
>>> state = gt.multilevel_minimize(state, B=2)
>>> gt.graph_draw(g, pos=g.vp["pos"], vertex_fill_color=state.get_blocks(), output="polblogs_agg.pdf")
<...>
(Примечание: позиции каждого узла предопределены в этом примере, поэтому не нужно было запускать алгоритм компоновки)
Вот еще один пример, использующий те же данные (и результат невероятный): http://ryancompton.net/2014/10/05/graph-tools-visualization-is-pretty-good/
За последнее время здесь много чего произошло! Netwulf - это библиотека, предназначенная для обеспечения простой воспроизводимой интерактивной визуализации сетей на Python (отказ от ответственности: я соавтор).
Также обратите внимание на webweb, который лучше, если вы хотите экспортировать сеть как html.
Другой способ - Cytoscape. Вы также можете использовать с файлами gml.
Как сказал psychemedia, вы можете использовать Networkx для построения графика и экспорта в файл gml.
nx.write_graphml(G,'my_file.gml')
После этого в Cytoscape нажмите From Network File и выберите ваш gml-файл. Там вы можете изменить стиль тоже.