как иметь разные опции маркировки для разных наборов узлов в визуализации networkx? - PullRequest
2 голосов
/ 16 апреля 2020

У меня есть график, который состоит из трех наборов узлов 1. серверов 2. станций 3. пользователей Я хочу нарисовать их с помощью встроенной визуализации сетей. На чертеже я хочу иметь метки для пользователей и станций, но не для серверов. Тем не менее, это не работает. когда я пытаюсь это сделать:

nx.draw_networkx_nodes(network,
                    with_labels=False,
                    nodelist=self.servers_idx,
                    node_size=50, node_shape='s',
                    pos=servers_pos,
                    node_color='r')
nx.draw_networkx_nodes(network, with_labels=True,
                    nodelist=self.stations_idx,
                    node_size=50, node_shape='^',
                    pos=stations_pos,
                    node_color='g')
nx.draw_networkx_nodes(network, with_labels=True,
                    nodelist=self.users_idx,
                    node_size=10, node_shape='o',
                    pos=users_pos,
                    node_color='b')

я получаю следующий рисунок:

image

, который, как вы видите, не показывает ни одну из меток , но я установил для переменной with_labels значение True для станций и пользователей, и ожидается, что он их покажет. Странно то, что когда я установлю все значения with_labels на True, будут показаны все метки. Но если я установлю только один из них на False, он не будет отображать два других (как, например, я установил их всех как False). Кто-нибудь знает, что здесь происходит?

1 Ответ

2 голосов
/ 16 апреля 2020

Как сказал Пол Бродерсен, это похоже на ошибку сети. Но вы можете go обойти его, используя функцию nx.draw_networkx_labels для пользователей и станций, но не для серверов:

import networkx as nx

network = nx.Graph()
network.add_nodes_from([1, 2, 3, 4, 5])

# Manually create positions and indices
servers_pos = {1: (-1, 1), 2: (1, 1)}
stations_pos = {3: (0, -1), 4: (1, 0)}
users_pos = {5: (0, 0)}
servers_idx = [1, 2]
stations_idx = [3, 4]
users_idx = [5]

# Draw nodes (exactly your code, but without `with_labels` attribute)
nx.draw_networkx_nodes(network, nodelist=[1, 2], node_size=50, node_shape='s', pos=servers_pos, node_color='r')
nx.draw_networkx_nodes(network, nodelist=[3, 4], node_size=50, node_shape='^', pos=stations_pos, node_color='g')
nx.draw_networkx_nodes(network, nodelist=[5], node_size=10, node_shape='o', pos=users_pos, node_color='b')

# Manually create labels for users and stations
stations_labels = {3: 'WAKA-3', 4: 'WAKA-4'}
users_labels = {5: 'John Doe'}
nx.draw_networkx_labels(
    network,
    pos=stations_pos,
    labels=stations_labels
)
nx.draw_networkx_labels(
    network,
    pos=users_pos,
    labels=users_labels
)

Вот результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...