python networkx中的传奇

时间:2014-04-10 15:10:53

标签: python legend networkx

我有以下代码用节点绘制图形,但我很想添加一个合适的图例: (对不起,我无法发布图像,似乎我没有声誉)

我想要一个带有4种颜色的传奇,例如"浅蓝色=过时,红色=草稿,黄色=发布,深蓝色=初始化"。

我已经看到了一些解决方案" scatter"但我觉得它太复杂了。有没有办法用" plt.legend(G.nodes)"?

感谢您的帮助!!

以下是代码:

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
G=nx.Graph()
G.add_node("kind1")
G.add_node("kind2")
G.add_node("Obsolete")
G.add_node("Draft")
G.add_node("Release")
G.add_node("Initialisation")
val_map = {'kind1': 2,'kind2': 2,'Obsolete': 2,'Initialisation': 1,'Draft': 4,'Release': 3}
values = [val_map.get(node, 0) for node in G.nodes()]
nodes = nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)



plt.legend(G.nodes())

plt.show() 

2 个答案:

答案 0 :(得分:4)

使用nx.draw时似乎存在某种错误。尝试使用nx.draw_networkx。 然后使用matplotlib中的轴在绘制图形时传递它。该轴应包含节点的标签和颜色,同时绘制(0,0) - >中的点。这是棘手的部分。

希望它有所帮助!这是我运行的代码:

    import networkx as nx
    import matplotlib.pyplot as plt
    import numpy as np
    # For color mapping
    import matplotlib.colors as colors
    import matplotlib.cm as cmx

    G=nx.Graph()
    G.add_node("kind1")
    G.add_node("kind2")
    G.add_node("Obsolete")
    G.add_node("Draft")
    G.add_node("Release")
    G.add_node("Initialisation")

    # You were missing the position.
    pos=nx.spring_layout(G)
    val_map = {'kind1': 2,'kind2': 2,'Obsolete': 2,'Initialisation': 1,'Draft':         4,'Release': 3}
    values = [val_map.get(node, 0) for node in G.nodes()]
    # Color mapping
    jet = cm = plt.get_cmap('jet')
    cNorm  = colors.Normalize(vmin=0, vmax=max(values))
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)

    # Using a figure to use it as a parameter when calling nx.draw_networkx
    f = plt.figure(1)
    ax = f.add_subplot(1,1,1)
    for label in val_map:
        ax.plot([0],[0],
                color=scalarMap.to_rgba(val_map[label]),
                label=label)

    # Just fixed the color map
    nx.draw_networkx(G,pos, cmap = jet, vmin=0, vmax= max(values),
                     node_color=values,
                     with_labels=False,ax=ax)

    # Here is were I get an error with your code                                                                                                                         
    #nodes = nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)                                                                             

    # Setting it to how it was looking before.                                                                                                              
    plt.axis('off')
    f.set_facecolor('w')

    plt.legend(loc='center')


    f.tight_layout()
    plt.show()

一些有用的资料来源:

[1] http://pydoc.net/Python/networkx/1.0.1/networkx.drawing.nx_pylab/

[2] http://matplotlib.org/api/legend_api.html

[3] Using Colormaps to set color of line in matplotlib

[4] http://matplotlib.org/1.3.1/users/artists.html

答案 1 :(得分:3)

非常感谢你的帮助,但这并不是我想要的。我做了一些改动,所以我可以从节点中获得颜色图例的不同名称'名。

以下是最终代码:

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# For color mapping
import matplotlib.colors as colors
import matplotlib.cm as cmx

G=nx.Graph()
G.add_node("kind1")
G.add_node("kind2")
G.add_node("kind3")
G.add_node("kind4")
G.add_node("kind5")
G.add_node("kind6")

# You were missing the position.
pos=nx.spring_layout(G)
val_map = {'kind1': 2,'kind2': 2,'kind3': 2,'kind4': 1,'kind5':4,'kind6': 3}
#I had this list for the name corresponding t the color but different from the node name
ColorLegend = {'Obsolete': 2,'Initialisation': 1,'Draft': 4,'Release': 3}
values = [val_map.get(node, 0) for node in G.nodes()]
# Color mapping
jet = cm = plt.get_cmap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=max(values))
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)

# Using a figure to use it as a parameter when calling nx.draw_networkx
f = plt.figure(1)
ax = f.add_subplot(1,1,1)
for label in ColorLegend:
    ax.plot([0],[0],color=scalarMap.to_rgba(ColorLegend[label]),label=label)

# Just fixed the color map
nx.draw_networkx(G,pos, cmap = jet, vmin=0, vmax= max(values),node_color=values,with_labels=True,ax=ax)

# Setting it to how it was looking before.                                                                                                              
plt.axis('off')
f.set_facecolor('w')

plt.legend()

f.tight_layout()
plt.show()