2014-11-03 50 views
2

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

编辑: 好吧,我只是尝试这样的代码,其结果是OK:

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

我已经是当我尝试绘制传说的问题,我试图把它上面的情节,但它出现在中间。

+0

见http://matplotlib.org/examples/api/scatter_piecharts.html需要一番努力。饼图函数也有一个kwarg来设置它的中心(但我认为只有在主人),所以你可以使用networkx来获取中心/绘制边缘,然后使用上述两种技术之一来绘制标记。我不认为你想要什么是完整的交钥匙解决方案。 – tacaswell 2014-11-03 13:32:38

+1

此外,你的问题是被拒绝投票,因为它是相当大/没有代码。我会建议尝试我建议的两件事情之一,当你遇到特定问题时,请提出一个关于该问题的新问题,你会得到更好的答复。 ('我尝试了代码X,它应该做Y,但它正在做Y-prime,发生了什么事?') – tacaswell 2014-11-03 13:35:15

回答

3

这是我回到网络讨论邮件列表的东西。 “变换”部分并不完全正确(需要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