【问题标题】:Networkx: Graph Labels getting mixed up and not adjustedNetworkx:图形标签混淆且未调整
【发布时间】:2019-06-26 23:43:07
【问题描述】:

所以我使用 networkx 库制作了我的图,它是一个单部分图。当我贴上标签时,它似乎不正确,它变得混乱了。有些单词的长度比其他单词长,并且超出了节点的边界。可以调整我的图表以使一切看起来清晰易懂吗?

而且我还希望节点像一个点,并且标签出现在节点上而不是节点内。

这样

我制作的图表..

这是代码..

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from networkx.algorithms import community
from networkx.algorithms import bipartite


G1 = nx.read_edgelist("abcd.txt")
print(nx.info(G1))
c = bipartite.color(G1)
nx.set_node_attributes(G1, c, 'bipartite')
type1  = {n for n, d in G1.nodes(data=True) if d['bipartite']==0}
type2  = {n for n, d in G1.nodes(data=True) if d['bipartite']==1}
G = bipartite.projected_graph(G1, type1)
type2g = bipartite.projected_graph(G1, type2)


pos = nx.spring_layout(G,k=0.30,iterations=50)

nx.is_bipartite(G1)
#average clustering
nx.average_clustering(G1)

#Diameter
print("Diameter:",nx.diameter(G1))

options = {
    'node_color': 'purple',
    'node_size': 40,
    'line_color': 'yellow',
    'linewidths': 0,
    'width': 0.3,
}

#degeree plotting
def plot_degree_distribution(wiki):
    degs = {}
    for n in wiki.nodes():
        deg = wiki.degree(n)

        if deg not in degs:
            degs[deg] = 0

        degs[deg] += 1
    items = sorted(degs.items())

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot([k for (k, v) in items], [v for (k, v) in items])
    ax.set_xscale('log')
    ax.set_yscale('log')
    plt.title("Degree Distribution")
    fig.savefig("degree_distribution.png")


# plot_degree_distribution(G)
d = []  # create a set
for n in G.nodes():
    d.append(G.degree(n))

ec = []  # create a set
for e in G.edges():
    if (G.degree(e[0]) > G.degree(e[1])):
        ec.append(G.degree(e[0]))
    else:
        ec.append(G.degree(e[1]))

pos = nx.spring_layout(G,k=1.5, iterations=200)

factor = 25  # to change the size of nodes with respect to their degree


nx.draw_networkx(G, pos,
        edge_color=ec, edge_cmap=plt.cm.plasma,  # edge color
        node_color=d, cmap=plt.cm.plasma,  # node color
        node_size=[x * factor for x in d])  # node sizse
plt.savefig ("simple_graph.png")
fig = plt.gcf()
fig.set_size_inches((10,10))
plt.show()

【问题讨论】:

    标签: python matplotlib graph networkx


    【解决方案1】:

    将弹簧布局更改为圆形布局将帮助您获得更好的标签可视化效果。

    cgraph=nx.gnp_random_graph(15,p=0.5)
    labels={}
    for k in range(15):
        labels[k]='long named node '+str(k)
    
    circPos=nx.circular_layout(cgraph)
    nx.draw_networkx_labels(cgraph,pos=circPos,labels=labels) 
    nx.draw(cgraph,pos=circPos)
    

    此外,如果边缘标签难以可视化,您可以通过更改布局位置来更改标签的位置,如下所示。

    pos_attrs = {}
    for node, coords in circPos.items():
        pos_attrs[node] = (coords[0]+0.1*(-1)*np.sign(coords[0]), coords[1]+0.1*(-1)*np.sign(coords[1]))
    nx.draw_networkx_labels(cgraph,pos=circPos,labels=labels) 
    nx.draw(cgraph,pos=pos_attrs)
    

    这里介绍了另一种处理圆形布局标签的好方法: NetworkX node labels relative position

    希望对你有帮助

    【讨论】:

    • pos_attr 给我错误'浮动对象不可调用'
    • 我更新了答案,coords[1]+0.1*(-1)*np.sign(coords[1]) 上缺少 *
    • 它不起作用标签仍然出现在节点上
    • 我用的是spring layout是不是因为这个?
    • 是的,因为布局。如果您需要使用这种布局,请尝试将节点聚类到类别中,或者只是为最重要的节点添加标签。希望对你有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2012-11-12
    • 1970-01-01
    • 2020-01-22
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多