简体   繁体   English

Networkx:图形标签混淆不清

[英]Networkx: Graph Labels getting mixed up and not adjusted

So I made my graph using networkx library which is a unipartite graph. 所以我使用networkx库(单图)制作了我的图。 When I put the labels it doesn't seem right, its getting mixed up. 当我贴标签时,它看起来不正确,变得混乱起来。 There are some words which has more length than the others and its out of the boundary of the nodes. 有些单词的长度比其他单词更长,并且超出了节点的边界。 Can my graph be adjusted so everything look clear and understandable? 可以调整我的图表,使所有内容看起来清晰易懂吗?

And also I want the node to be like a dot and the labels appearing over the nodes not inside the nodes. 我也希望节点像一个点,并且标签出现在节点上而不是节点内部。

Like this 像这样

图片

Graph I made.. 我做的图..

图片

Here is the code.. 这是代码。

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()

Changing the spring layout to a circular layout will help you to get a better label visualization. 将弹簧布局更改为圆形布局将帮助您获得更好的标签可视化效果。

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)

在此处输入图片说明

Also if the edge label is difficult to visualize, you can change the position of the labels by changing the layout position as follows. 同样,如果边缘标签难以可视化,则可以通过如下更改布局位置来更改标签的位置。

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)

在此处输入图片说明

Another great way to deal with labels on circular layouts is presented here: NetworkX node labels relative position 此处介绍了另一种在圆形布局上处理标签的好方法: NetworkX节点标签的相对位置

Hope it helps 希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM