我有以下数据框:
Src Dst
A [A,B]
B [B,A]
C [C]
D [D,E,F]
E [E,D,F]
F [F,D,E]
...
我想生成一个网络,其中Src
是节点,Dst
是边,并且新列Weight
可以为节点分配不同的颜色(绿色)是A
或D,其他都一样(例如蓝色)。
我尝试如下:
nd=["A","D"]
df['Weight'] = np.where(df.Src.isin(nd), 1, 0)
这里的问题是我不知道如何分配颜色,所以我只是尝试为A或D分配值1,为所有其他值分配值0,并分别更改颜色。
对于图形,我使用了以下
G = nx.from_pandas_edgelist(df, 'Src', 'Dst')
上面的代码行与Dst中的节点的行未连接,我无法理解原因。
我发现了一些可能有助于分配颜色的东西:
colors=[]
for n in df.Src:
if n in df.Weight:
colors.append('g')
else:
colors.append('b')
# nodes
nx.draw_networkx_nodes(G,pos, node_color = colors)
但是我遇到了这个错误:
ValueError:'c'参数包含79个元素,与以下元素不一致 尺寸为76的“ x”和“ y”。
下面的图片将类似于我的预期输出(A
和D
节点为绿色,其他节点为蓝色,并且基于Dst
数据的链接;请注意,下面的图片当前不重现颜色或预期边缘。
您能帮我给我一些建议吗?
答案 0 :(得分:1)
这是一种实现方法:
df["color"] = "blue"
df.loc[df.Src.isin(["A", "D"]), "color"] = "green"
# The following line is needed because, at least in the way my dataset
# is created, 'Dst' is not a list but rather a string.
# For example, Dst of 'A' is the string "[A,B]". Here,
# I'm converting it to the list ["A", "B"]
# If your data doesn't need this, just comment this line out.
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color)
输出为: