用饼图作为networkx中的节点

4

我想知道如何绘制一个网络(如果可以的话),但是我不想使用圆形作为节点,而是要用饼图,因为我有一个包含社区的图表,我希望用每个部门工作人数来表示每个社区。

编辑: 好的,我刚刚尝试了这段代码,结果还不错:

import community
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import random as rnd
import operator as op
import matplotlib.patches as mpatches
import math

Com = nx.Graph()

Com.add_nodes_from(['0','1','2','3','4'])
comlist=[('0','2',5.0),('3','0',3.0),('1','3',1.0),('2','3',7.3)]
Com.add_weighted_edges_from(comlist)
ListDeps = ['literature','maths','science','physical education']
HistCom = {'0':{'literature':20,
                'maths':24,
                'science':12},
           '1':{'literature':1,
                'physical education':14,
                'science':6},
           '2':{'science':15},
           '3':{'physical education':4,
                'maths':20},
           '4':{'literature':20,
                'maths':24,
                'science':12}}

pos=nx.spring_layout(Com)

fig=plt.figure(figsize=(5,5))
ax=plt.axes([0,0,1,1])
ax.set_aspect('equal')
nx.draw_networkx_edges(Com,pos,ax=ax)

plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)

trans=ax.transData.transform
trans2=fig.transFigure.inverted().transform

piesize=0.1 #Degree
p2=piesize/2.0

dep_color = dict()
for com in Com:
    xx,yy=trans(pos[com]) # figure coordinates
    xa,ya=trans2((xx,yy)) # axes coordinates
    a = plt.axes([xa-p2,ya-p2, piesize, piesize])
    a.set_aspect('equal')
    contats = len(HistCom[com].items())
    fracs = []
    ColorFrac = []
    for dep,n in sorted(HistCom[com].items(), key=op.itemgetter(1), reverse=True):
        fracs.append(n/sum(HistCom[com].values()))
        dep_color[dep] = dep_color.get(dep, (rnd.random(),rnd.random(),rnd.random()))
        ColorFrac.append(dep_color[dep])
    a.pie(fracs, colors = ColorFrac)


P = [mpatches.Patch(color=dep_color[dep], label=dep) for dep in dep_color]
plt.legend(handles=P,bbox_to_anchor=(0.,1.02,1.,.102), loc=3,ncol=3, mode="expand", borderaxespad=0.)
plt.show()

我遇到的问题是,当我尝试绘制图例时,我试图将其放置在图形上方,但它出现在中间。


看http://matplotlib.org/examples/api/scatter_piecharts.html需要一些操作。pie函数还有一个kwarg可以设置它的中心(但我认为只有在主分支上),所以你可以使用networkx来获取中心/绘制边缘,然后使用上述两种技术之一来绘制标记。我不认为有一个完整的解决方案适用于你想要的东西。 - tacaswell
1
此外,你的问题被投票下降是因为它相当模糊/没有代码。我建议尝试我提出的两件事情之一,当你有具体问题时,提出一个新问题,并且你会得到更好的回答。(“我尝试了代码X,它应该做Y,但它却做了Y-prime。发生了什么?”) - tacaswell
1个回答

7

这是我一段时间以前在networkx-discuss邮件列表上发布的内容。 "transforms" 部分不太正确(需要matplotlib专家),因此缩放不起作用。但这是一个开始。

import networkx as nx
import matplotlib.pyplot as plt
G=nx.complete_graph(4)
pos=nx.spring_layout(G)

fig=plt.figure(figsize=(5,5))
ax=plt.axes([0,0,1,1])
ax.set_aspect('equal')
nx.draw_networkx_edges(G,pos,ax=ax)

plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)

trans=ax.transData.transform
trans2=fig.transFigure.inverted().transform

piesize=0.2
p2=piesize/2.0
for n in G:
    xx,yy=trans(pos[n]) # figure coordinates
    xa,ya=trans2((xx,yy)) # axes coordinates
    a = plt.axes([xa-p2,ya-p2, piesize, piesize])
    a.set_aspect('equal')
    fracs = [15,30,45, 10]
    a.pie(fracs)

plt.savefig('pc.png')

enter image description here


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