网络图绘制函数的图例(Legend)

7

所以我有一个函数来绘制我正在处理的问题。它基本上是一个关键节点检测问题或拦截问题。我有一些数值x,和决定攻击节点z。基本上,我想用活动和非活动节点以及正在被处理/攻击的节点来着色我的图形。以下是我目前的代码。

def draw_solution(g, zsolution, xsolution, T, xmin=0, filename='test.pdf'):

# draw solution
pos = {n: ndata['coord'] for n,ndata in g.nodes_iter(data=True)}
ncolour=[]
for n,ndata in g.nodes_iter(data=True):
    if ndata['fuel_load'] < xmin:
        ncolour.append('gold')
    else:
        ncolour.append('yellowgreen')
pp = PdfPages(filename)
fig = plt.figure(figsize=(11.7,8.3))
fig.suptitle('full graph and initial fuel load')
plt.axis('off')
nx.draw_networkx(g, pos, font_size=9, node_color=ncolour)
fig.savefig(pp, format='pdf')
fig.clf()

for t in range(T):
    g_copy = g.copy()
    #node colour
    ncolour=[]
    for i in g.nodes_iter():
        if zsolution[i,t] > 0.99:
            ncolour.append('lightcoral')
            #g_copy.remove_edges_from(g.edges(i))
        elif xsolution[i,t] < xmin:
            ncolour.append('gold')
            g_copy.remove_edges_from(g.edges(i))
        else:
            ncolour.append('yellowgreen')

    plt.axis('off')
    fig.suptitle('t={}, before treatment'.format(t))
    nx.draw_networkx(g_copy, pos, font_size=9, node_color=ncolour, label=ncolour)
    fig.savefig(pp, format='pdf')
    fig.clf()

    g_copy = g.copy()
    #node colour
    ncolour=[]
    for i in g.nodes_iter():
        if zsolution[i,t] > 0.99:
            ncolour.append('lightcoral')
            g_copy.remove_edges_from(g.edges(i))
        elif xsolution[i,t] < xmin:
            ncolour.append('gold')
            g_copy.remove_edges_from(g.edges(i))
        else:
            ncolour.append('yellowgreen')

    plt.axis('off')
    fig.suptitle('t={}, after treatment'.format(t))
    nx.draw_networkx(g_copy, pos, font_size=9, node_color=ncolour, label=ncolour)
    fig.savefig(pp, format='pdf')
    fig.clf()

pp.close()
fig.clf()  

由于某些原因,我无法正确显示图例?
请帮忙!谢谢!

你想要发生什么事情却没有发生? - 你所说的“传奇”是什么意思? - Joel
我想要一个与颜色相对应的图例。所以我想要类似以下的内容:淡珊瑚色 - 攻击金色 - 活跃黄绿色 - 不活跃 - Art Zahar
2个回答

23

这是您需要的吗?

import networkx as nx
import matplotlib.pyplot as plt

G = nx.fast_gnp_random_graph(20,0.2)

rednodes = [1,2,4,5]
bluenodes = [10,12]
greennodes = [3,6,9]
yellowgreennodes = [node for node in G.nodes() if
                    node not in rednodes + greennodes + bluenodes]
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos=pos, nodelist=rednodes,
                       node_color='red', label='red nodes')
nx.draw_networkx_nodes(G, pos=pos, nodelist=bluenodes,
                       node_color='blue', label='blue nodes')
nx.draw_networkx_nodes(G, pos=pos, nodelist=greennodes,
                       node_color='green', label='green nodes')
nx.draw_networkx_nodes(G, pos=pos, nodelist=yellowgreennodes,
                       node_color='yellowgreen', label='yellowgreen nodes')
nx.draw_networkx_edges(G, pos=pos)
plt.legend(scatterpoints = 1)
plt.show()

在此输入图片描述


1

我有类似的需求。以下是我用来添加图例的方法,这个方法对我的情况很有效。希望它也能帮助其他寻求类似解决方案的人。

from matplotlib.lines import Line2D

legend_elements = [
    Line2D([0], [0], marker='o', color='w', label='Label1',markerfacecolor='g', markersize=15),
    Line2D([0], [0], marker='o', color='w', label='label2',markerfacecolor='r', markersize=15),        
]

nx.draw_networkx(G, pos=nx.spring_layout(G),edge_color=(0.8,0.6,0.3), node_color=color)

plt.legend(handles=legend_elements, loc='upper right')
plt.savefig('network_graph.png')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接