【问题标题】:Networkx cmap: Problem associated with color of network nodesNetworkx cmap:与网络节点颜色相关的问题
【发布时间】:2019-07-26 17:37:32
【问题描述】:

我正在尝试根据 my_value 中定义的权重用蓝色 (cmap=plt.cm.Blues) 绘制节点网络。该代码正在生成一个权重正确但只有黑色的网络。

请帮助我。感谢期待。

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.cm

df1 = pd.DataFrame({'from': ['1', '2', '3', '4', '4', '4'], 'to': ['2', '3', '4', '5', '6', '7']})
carac = pd.DataFrame({'ID': ['1', '2', '3', '4', '5', '6', '7'], 'myvalue': ['0.1', '0.5', '0.1', '0.5', '0.1', '0.1', '0.2']})
G = nx.from_pandas_edgelist(df1, 'from', 'to', create_using=nx.Graph())
G.nodes()
carac = carac.set_index('ID')
carac = carac.reindex(G.nodes())

nx.draw_networkx(G, with_labels=True, cmap=plt.cm.Blues, node_color=carac['myvalue'], node_size=1500, edge_color='b')
plt.show()

【问题讨论】:

    标签: python pandas dataframe networkx


    【解决方案1】:

    要获得所需的节点着色,涉及到参数node_colorcmapvminvmax。 Colormap (cmap) 提供基于定义的 vmin 和 vmax 值范围的颜色映射。

    下面是相关代码(import语句省略):

    df1 = pd.DataFrame({'from': ['1', '2', '3', '4', '4', '4'], 'to': ['2', '3', '4', '5', '6', '7']})
    carac = pd.DataFrame({'ID': ['1', '2', '3', '4', '5', '6', '7'], 'myvalue': ['0.1', '0.5', '0.1', '0.5', '0.1', '0.1', '0.2']})
    
    G = nx.from_pandas_edgelist(df1, 'from', 'to', create_using=nx.Graph())
    
    carac = carac.set_index('ID')
    carac = carac.reindex(G.nodes())
    
    nx.draw_networkx(G, with_labels=True, cmap=plt.cm.Blues, \
                     node_color=[np.float(t) for t in carac.myvalue.values], \
                     node_size=1500, edge_color='b', \
                     font_size=12, font_color='r', font_weight='bold', \
                     vmax=float(max(carac['myvalue'])), \
                     vmin=float(min(carac['myvalue'])))
    
    plt.show()
    

    输出图将与此类似:

    编辑 1

    这是上述代码的更新版本。它还绘制一个颜色条作为节点颜色的图例。

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    import networkx as nx
    import matplotlib as mpl
    
    df1 = pd.DataFrame({'from': ['1', '2', '3', '4', '4', '4'], 'to': ['2', '3', '4', '5', '6', '7']})
    carac = pd.DataFrame({'ID': ['1', '2', '3', '4', '5', '6', '7'], 'myvalue': ['0.1', '0.5', '0.1', '0.5', '0.1', '0.1', '0.2']})
    
    G = nx.from_pandas_edgelist(df1, 'from', 'to', create_using=nx.Graph())
    
    carac = carac.set_index('ID')
    carac = carac.reindex(G.nodes())
    
    # some parameters for colorbar
    cmap = plt.cm.Blues
    vmin = float(min(carac['myvalue']))
    vmax = float(max(carac['myvalue']))
    norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
    
    # plot network
    nx.draw_networkx(G, with_labels=True, cmap=plt.cm.Blues, \
                     node_color=[np.float(t) for t in carac.myvalue.values], \
                     node_size=1500, edge_color='b', \
                     font_size=12, font_color='r', font_weight='bold', \
                     vmax=vmax, \
                     vmin=vmin)
    
    # create colorbar
    sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax))
    sm._A = []
    cb1 = plt.colorbar(sm)
    cb1.set_label('Some Units')
    
    # hide x,y ticks
    plt.xticks([])
    plt.yticks([])
    
    #set background color
    plt.gca().set_facecolor('beige') 
    
    plt.show()
    

    示例图:

    【讨论】:

    • 你好@swatchai,我还需要在我的图中添加颜色条。我使用以下命令:nc = nx.draw_networkx(G, with_labels=True, cmap=plt.cm.cool, node_color=[np.float(t) for t in carac.myvalue.values], node_size=1500 , edge_color='b', font_size=12, font_color='b', font_weight='bold', vmax=float(max(carac['myvalue'])), vmin=float(min(carac['myvalue'] ))) plt.colorbar(nc) 但不知何故它不起作用。你能帮忙吗?
    • @Anks 我认为应该作为一个新问题提出,更多人会看到并提供帮助。希望你能得到更多的分数。
    • 好的。感谢您的建议。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多