Аргумент «ValueError: c» содержит 28 элементов, что недопустимо для использования с «x» с размером 33, «y» с размером 33 »с k-разделенным графом Networkx - PullRequest
1 голос
/ 10 апреля 2020

Я получаю следующие ошибки, когда пытаюсь применить разные цвета к различным наборам узлов или Ks в моем k-компонентном графе.

 G = nx.Graph()
G.add_nodes_from(emc["entity"], bipartite=0)
G.add_nodes_from(set(EMM_unique["keys"]).symmetric_difference(set(emc["entity"])), bipartite=1)
G.add_nodes_from(EMM["id"], bipartite=2)
G.add_edges_from(list(emc.itertuples(index=False)), color='red')
G.add_edges_from(list(EMM.itertuples(index=False)))

nodes = G.nodes()
# for each of the parts create a set
nodes_0  = set([n for n in nodes if  G.nodes[n]['bipartite']==0])
nodes_1  = set([n for n in nodes if  G.nodes[n]['bipartite']==1])
nodes_2  = set([n for n in nodes if  G.nodes[n]['bipartite']==2])


    # set the location of the nodes for each set
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(nodes_0) ) # put nodes from X at x=1
pos.update( (n, (2, i)) for i, n in enumerate(nodes_1) ) # put nodes from Y at x=2
pos.update( (n, (3, i)) for i, n in enumerate(nodes_2) ) # put nodes from X at x=1

# To apply colors to different node-sets
color_map = []
for node in G:
    if node in emc["entity"].values:
        print(node)
        color_map.append('red')
    elif node in EMM["id"].values:
        color_map.append('green')

#nx.draw_networkx_nodes(G,pos, node_color=color_map)
nx.draw(G, pos, node_color=color_map, width= 2, with_labels=True, with_arrows=True)

plt.show()

Если я не использую код color_map, то работает нормально. С кодом color_map я получаю следующее сообщение об ошибке

    Traceback (most recent call last):
  File "C:\Python\lib\site-packages\matplotlib\axes\_axes.py", line 4291, in _parse_scatter_color_args
    raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\JetBrains\PyCharm 2019.2.5\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2019.2.5\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/Pawandeep/Desktop/CVS1/dev/AnnotationBexis.py", line 287, in <module>
    nx.draw(G, pos, node_color=color_map, width= 2, with_labels=True, with_arrows=True)
  File "C:\Python\lib\site-packages\networkx\drawing\nx_pylab.py", line 128, in draw
    draw_networkx(G, pos=pos, ax=ax, **kwds)
  File "C:\Python\lib\site-packages\networkx\drawing\nx_pylab.py", line 279, in draw_networkx
    node_collection = draw_networkx_nodes(G, pos, **kwds)
  File "C:\Python\lib\site-packages\networkx\drawing\nx_pylab.py", line 416, in draw_networkx_nodes
    label=label)
  File "C:\Python\lib\site-packages\matplotlib\__init__.py", line 1601, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "C:\Python\lib\site-packages\matplotlib\axes\_axes.py", line 4454, in scatter
    get_next_color_func=self._get_patches_for_fill.get_next_color)
  File "C:\Python\lib\site-packages\matplotlib\axes\_axes.py", line 4298, in _parse_scatter_color_args
    .format(nc=n_elem, xs=xsize, ys=ysize)
ValueError: 'c' argument has 28 elements, which is not acceptable for use with 'x' with size 33, 'y' with size 33.

Я уже пытался добавить узлы отдельно с цветом через этот код, но получаю похожую ошибку

nx.draw_networkx_nodes(G,pos, node_color=color_map)

Мое требование иметь разные цвета для разных узлов. Было бы очень полезно, если бы я мог получить некоторую помощь в этом.

Решение:

Согласно предложению из принятого ответа, я добавил условие для всех трех наборов узлов, так что теперь

for node in G:
    if node in emc["entity"].values:
       color_map.append("red")
    elif node in EMM["id"].values:
        color_map.append("green")
    else:
        color_map.append("blue") # solution

1 Ответ

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

В этих строках:

color_map = []
for node in G:
    if node in emc["entity"].values:
        print(node)
        color_map.append('red')
    elif node in EMM["id"].values:
        color_map.append('green')

вы назначаете цвет узлу, только если он находится в emc["entity"].values или EMM["id"].values. Я думаю, что у вас есть некоторые узлы, которые ни в одном. Поэтому, когда вы пытаетесь нарисовать его, список узлов длиннее, чем список цветов.

Каждый раз, когда вы используете elif, вам необходимо учитывать возможность того, что есть вещи, которые не удовлетворяют ни одному из условий. В противном случае вы должны использовать else.

...