def g2pair(self,ni,nf,ei,ef1,ef2,ew,numFile,mapFile,weightFile): inobj = [] inobj.append(nm.mcut(f="%s:node"%(ef1),i=ei ).msetstr(a="flag",v=0)) inobj.append(nm.mcut(f="%s:node"%(ef2),i=ei ).msetstr(a="flag",v=0)) if nf : inobj.append(nm.mcut(f="%s:node"%(nf),i=ni ).msetstr(a="flag",v=1)) f = nm.mbest(i=inobj,k="node",s="flag",fr=0,size=1 ) # isolated nodes are set to the end of position in mapping file. # S= must start from 0 (but inside R vertex number will be added one) f <<= nm.mnumber(s="flag,node",a="num",S=0,o=mapFile) f.run() f = None f <<= nm.mcut(f=[ef1,ef2] , i=ei) f <<= nm.mjoin( k=ef1 , K="node" , m=mapFile ,f="num:num1") f <<= nm.mjoin( k=ef2 , K="node" , m=mapFile ,f="num:num2") f <<= nm.mcut(f="num1,num2") f <<= nm.mfsort(f="num1,num2") f <<= nm.msortf(f="num1%n,num2%n",nfno=True) f <<= nm.cmd("tr ',' ' ' " ) f <<= nm.mwrite(o=numFile) f.run() nodeSize=mrecount(i=mapFile) if ew: nm.mcut(f=ew,i=ei,o=weightFile).run() else: ew="weight" nm.msetstr(v=1,a=ew,i=ei).mcut(f=ew,o=weightFile).run() return nodeSize
def g2pair(self,ni,nf,ei,ef1,ef2,ew,numFile,mapFile,weightFile): #MCMD::msgLog("converting graph files into a pair of numbered nodes ...") #wf=MCMD::Mtemp.new #wf1=wf.file #wf2=wf.file #wf3=wf.file allinObj =[] wf1 = nm.mcut(f="%s:node"%(ef1),i=ei ).msetstr(v=0,a="flag") wf2 = nm.mcut(f="%s:node"%(ef2),i=ei ).msetstr(v=0,a="flag") f = None if nf: f <<= nm.mcut(i=[wf1,wf2,nm.mcut(f=nf+":node",i=ni).msetstr(v=1,a="flag")],f="node,flag") f <<= nm.mbest(k="node" , s="flag" , fr=0 ,size=1) else: f <<= nm.mcut(i=[wf1,wf2],f="node,flag") f <<= nm.muniq(k="node") f <<= nm.mnumber(s="flag,node",a="num",S=0,o=mapFile) f.run() f = None f <<= nm.mcut(f=[ef1,ef2],i=ei) f <<= nm.mjoin(k=ef1 , K="node",m=mapFile , f="num:num1") f <<= nm.mjoin(k=ef2 , K="node",m=mapFile , f="num:num2") f <<= nm.mcut(f="num1,num2") f <<= nm.mfsort(f="num1,num2") f <<= nm.msortf(f="num1%n,num2%n",nfno=True) f <<= nm.cmd("tr ',' ' ' ") f <<= nm.mwrite(o=numFile) f.run() if ew : nm.mcut(f=ew,i=ei,o=weightFile).run() else: ew="weight" nm.msetstr(v=1 , a=ew ,i=ei).mcut(f=ew,o=weightFile).run() nodeSize=mrecount(i=mapFile) return nodeSize
def g2pair(self, ni, nf, ei, ef1, ef2, numFile, mapFile): #MCMD::msgLog("converting graph files into a pair of numbered nodes ...") #wf=MCMD::Mtemp.new #wf1=wf.file #wf2=wf.file #wf3=wf.file inobj = [] inobj.append(nm.mcut(f="%s:node" % (ef1), i=ei).msetstr(a="flag", v=0)) inobj.append(nm.mcut(f="%s:node" % (ef2), i=ei).msetstr(a="flag", v=0)) if nf: inobj.append( nm.mcut(f="%s:node" % (nf), i=ni).msetstr(a="flag", v=1)) f = nm.mbest(i=inobj, k="node", s="flag", fr=0, size=1) # isolated nodes are set to the end of position in mapping file. # S= must start from 0 (but inside R vertex number will be added one) f <<= nm.mnumber(s="flag,node", a="num", S=0, o=mapFile) f.run() f = None f <<= nm.mcut(f=[ef1, ef2], i=ei) f <<= nm.mjoin(k=ef1, K="node", m=mapFile, f="num:num1") f <<= nm.mjoin(k=ef2, K="node", m=mapFile, f="num:num2") f <<= nm.mcut(f="num1,num2") #f << "mfsort f=num1,num2 |" f <<= nm.msortf(f="num1%n,num2%n", nfno=True) f <<= nm.cmd("tr ',' ' ' ") f <<= nm.mwrite(o=numFile) f.run() nodeSize = mrecount(i=mapFile) return nodeSize
def run(self): temp = mtemp.Mtemp() ### mtra2gc xxsimgN = temp.file() xxsimgE = temp.file() xxsimgE0 = temp.file() param = {} param["i"] = self.iFile if self.idFN: param["tid"] = self.idFN if self.itemFN: param["item"] = self.itemFN if self.sp1: param["s"] = self.sp1 if self.sp2: param["S"] = self.sp2 ##################### # 異なる向きのconfidenceを列挙するためにsim=C th=0として双方向列挙しておく # 出力データは倍になるが、mfriendsで-directedとすることで元が取れている param["sim"] = "C" param["th"] = "0" param["node_support"] = True if self.numtp: param["num"] = True param["no"] = xxsimgN param["eo"] = xxsimgE0 nt.mtra2gc(**param).run() f = nm.readcsv(xxsimgE0) for i in range(self.filterSize): f <<= nm.mselnum(f=self.filter[i], c="[%s,%s]" % (self.lb[i], self.ub[i])) f <<= nm.writecsv(xxsimgE) f.run() ### mfrirends xxfriends = temp.file() xxfriendE = temp.file() xxw = temp.file() xxf = temp.file() xxff = temp.file() xxor = temp.file() if not os.path.isdir(xxfriends): os.makedirs(xxfriends) col = [["FF000080", "FF888880"], ["0000FF80", "8888FF80"], ["00FF0080", "88FF8880"]] for i in range(len(self.sim)): paramf = {} paramf["ei"] = xxsimgE paramf["ni"] = xxsimgN paramf["ef"] = "node1,node2" paramf["nf"] = "node" paramf["eo"] = xxfriendE paramf["no"] = xxfriends + "/n_" + str(i) paramf["sim"] = self.sim[i] paramf["dir"] = self.dir[i] paramf["rank"] = self.rank[i] paramf["directed"] = True nt.mfriends(**paramf).run() frec2 = nm.mfsort(f="node1,node2", i=xxfriendE) frec2 <<= nm.msummary(k="node1,node2", f=self.sim[i], c="count,mean") frec2 <<= nm.mselstr(f="count", v=2) # node1%0,node2%1,fld,count,mean # a,b,support,2,0.1818181818 # a,d,support,2,0.1818181818 f = nm.mjoin(k="node1,node2", K="node1,node2", m=frec2, f="mean:s1", n=True, i=xxfriendE) f <<= nm.mjoin(k="node2,node1", K="node1,node2", m=frec2, f="mean:s2", n=True) # 1) xxrecs2でsimをjoinできない(s1,s2共にnull)ということは、それは片方向枝なので"F"をつける # 2) 双方向枝a->b,b->aのうちa->bのみ(s1がnullでない)に"W"の印をつける。 # 3) それ以外の枝は"D"として削除 f <<= nm.mcal( c='if(isnull($s{s1}),if(isnull($s{s2}),\"F\",\"D\"),\"W\")', a="dir") f <<= nm.mselstr(f="dir", v="D", r=True) f <<= nm.mcal(c='if($s{dir}==\"W\",$s{s1},$s{%s})' % (self.sim[i]), a="sim") f <<= nm.mchgstr(f="dir:color", c='W:%s,F:%s' % (col[i][0], col[i][1]), A=True) f <<= nm.msetstr(v=[self.sim[i], str(i)], a="simType,simPriority") f <<= nm.mcut(f="simType,simPriority,node1,node2,sim,dir,color", o=xxfriends + "/e_" + str(i)) f.run() # node1%1,node2%0,simType,sim,dir,color # b,a,jaccard,0.3333333333,F,8888FF # j,c,jaccard,0.3333333333,F,8888FF # b,d,jaccard,0.3333333333,F,8888FF # a,e,jaccard,0.5,W,0000FF # d,e,jaccard,0.5,W,0000FF # rule fileの出力 if self.orFile: mmm = nm.mcat(i=xxfriends + "/e_*").muniq(k="node1,node2") nm.mcommon(k="node1,node2", i=xxsimgE, m=mmm, o=self.orFile).run() # マルチ枝の単一化(W優先,パラメータ位置優先) if self.prune: """ # 双方向と片方向に分割 nm.mcat(i=xxfriends+"/e_*").mselstr(f="dir",v="W",o=xxw,u=xxf).run() # 片方向のみの枝を選択 f = nm.mcommon(k="node1,node2",K="node1,node2",r=True,m=xxw,i=xxf) f <<= nm.mcommon(k="node1,node2",K="node2,node1",r=True,m=xxw,o=xxff) f.run() f = nm.mcat(i=xxw+","+xxff).mbest(k="node1,node2",s="dir%r,simPriority%n",o=self.oeFile).run() """ #これだめ fo = nm.mcat(i=xxfriends + "/e_*").mselstr(f="dir", v="W") fu = fo.direction("u") # これは再考 fu <<= nm.mcommon(k="node1,node2", K="node1,node2", r=True, m=fo) fu <<= nm.mcommon(k="node1,node2", K="node2,node1", r=True, m=fo) #f = nm.m2cat() f = nm.mbest(i=[fo, fu], k="node1,node2", s="dir%r,simPriority%n", o=self.oeFile) f.run() else: nm.mcat(i=xxfriends + "/e_*", o=self.oeFile).run() nm.mcat(i=xxfriends + "/n_0", o=self.onFile).run()
def mnetpie(ei, ni, ef, nf, o, nodeSizeFld=None, nodeTipsFld=None, nodeColorFld=None, edgeWidthFld=None, edgeColorFld=None, pieDataFld=None, pieTipsFld=None, picFld=None, undirect=False, offline=False): #ei:edge file #ef:egfile if type(ef) is str: ef = ef.split(',') if len(ef) != 2: raise Exception("ef= takes just two field names") if not ((pieDataFld == None and pieTipsFld == None) or (pieDataFld != None and pieTipsFld != None)): raise Exception( "pieDataFld= pieTipsFld= are necessary at the same time") if picFld != None and pieDataFld != None: raise Exception( "picFld= cannot be specified with pieDataFld= pieTipsFld=") if nodeColorFld != None: if picFld != None or pieDataFld != None or pieTipsFld != None: raise Exception( "nodeColorFld= cannot be specified with pieDataFld= pieTipsFld= picFld=" ) if pieDataFld != None and pieTipsFld != None: caseNo = 1 elif picFld != None: caseNo = 2 else: caseNo = 0 tempW = mtemp.Mtemp() xxnode = tempW.file() nodefld = [] nodedmy1 = [] nodedmy2 = [] nodefld.append("%s:node" % (nf)) if nodeSizeFld != None: nodefld.append("%s:nodesize" % (nodeSizeFld)) else: nodedmy1.append("nodesize") nodedmy2.append("50") if nodeTipsFld != None: nodefld.append("%s:nodeT" % (nodeTipFld)) else: nodedmy1.append("nodeT") nodedmy2.append("") if nodeColorFld != None: nodefld.append("%s:nodeClr" % (nodeColorFld)) else: nodedmy1.append("nodeClr") nodedmy2.append("skyblue") if caseNo == 1: nodefld.append("%s:pieD" % (pieDataFld)) nodefld.append("%s:pieT" % (pieTipsFld)) elif caseNo == 2: nodefld.append("%s:pic" % (picFld)) else: nodedmy1.append("pic") nodedmy2.append("") f1 = None f1 <<= nm.mcut(i=ni, f=nodefld) if len(nodedmy1) != 0: f1 <<= nm.msetstr(a=nodedmy1, v=nodedmy2) if caseNo == 1: f1 <<= nm.mshare(k="node", f="pieD:pieDS") f1 <<= nm.mnumber(k="node", a="nodeid", B=True) f2 = nm.muniq(k="pieT", i=f1) f2 <<= nm.mnumber(q=True, a="pieTno") f2 <<= nm.mjoin(k="pieT", f="pieTno", i=f1).iredirect("m") f2 <<= nm.msortf(f="nodeid%n,pieTno%n", o=xxnode) else: f2 = nm.mnumber(a="nodeid%n", q=True, i=f1, o=xxnode) f2.run() xxedge = tempW.file() # MAKE EDGE DATA edgefld = [] edgedmy1 = [] edgedmy2 = [] edgefld.append("%s:edgeS" % (ef[0])) edgefld.append("%s:edgeE" % (ef[1])) if edgeWidthFld != None: edgefld.append("%s:edgesize" % (edgeWidthFld)) else: edgedmy1.append("edgesize") edgedmy2.append("1") if edgeColorFld != None: edgefld.append("%s:edgecolor" % (edgeColorFld)) else: edgedmy1.append("edgecolor") edgedmy2.append("black") f3 = None f3 <<= nm.mcut(i=ei, f=edgefld) if len(edgedmy1) != 0: f3 <<= nm.msetstr(a=edgedmy1, v=edgedmy2) f3 <<= nm.mnumber(a="preNo", q=True) f3 <<= nm.mbest(k="edgeS,edgeE", s="preNo%nr") f3 <<= nm.mnumber(s="preNo%n", a="edgeID") f3 <<= nm.mjoin(k="edgeS", K="node", f="nodeid:edgeSid", m=xxnode) f3 <<= nm.mjoin(k="edgeE", K="node", f="nodeid:edgeEid", m=xxnode) #双方向チェック一応 f4 = None f4 <<= nm.mfsort(i=f3, f="edgeS,edgeE") f4 <<= nm.mcount(k="edgeS,edgeE", a="edgecnt") f4 <<= nm.mselnum(c="[2,]", f="edgecnt") f4 <<= nm.msetstr(a="biflg", v=1) f4 <<= nm.mjoin(k="edgeID", f="biflg", n=True, i=f3).iredirect("m") f4 <<= nm.msortf(f="edgeID%n", o=xxedge) f4.run() gdata = "{\"nodes\":[" if caseNo == 1: nodedatastk = [] nodedatas = "" for val, top, bot in nm.readcsv(xxnode).getline(k="nodeid", otype='dict', q=True): name = val["node"] r = val["nodesize"] title = val["nodeT"] if top: nodedatas = "{\"name\":\"%s\",\"title\":\"%s\",\"r\":%s,\"node\":[" % ( name, title, r) pieTno = val["pieTno"] pieT = val["pieT"] pieDS = val["pieDS"] nodedatas += "{\"group\":%s,\"color\":%s,\"value\":%s,\"title\":\"%s\"}" % ( pieTno, pieDS, pieDS, pieT) if bot: nodedatas += "]}" nodedatastk.append(nodedatas) nodedatas = "" else: nodedatas += "," gdata += ",".join(nodedatastk) else: nodedatastk = [] for val in nm.readcsv(xxnode).getline(otype='dict'): name = val["node"] r = val["nodesize"] title = val["nodeT"] pic = val["pic"] nclr = val["nodeClr"] nodedatas = "{\"name\":\"%s\",\"title\":\"%s\",\"pic\":\"%s\",\"color\":\"%s\",\"r\":%s}" % ( name, title, pic, nclr, r) nodedatastk.append(nodedatas) gdata += ",".join(nodedatastk) gdata += "],\"links\": [" edgedatastk = [] for val in nm.readcsv(xxedge).getline(otype='dict'): es = val["edgeSid"] et = val["edgeEid"] esize = val["edgesize"] ecolor = val["edgecolor"] edgedatas = "{\"source\":%s,\"target\":%s,\"length\":500,\"ewidth\":%s,\"color\":\"%s\"}" % ( es, et, esize, ecolor) edgedatastk.append(edgedatas) gdata += ','.join(edgedatastk) gdata += "]}" direct = ".attr('marker-end','url(#arrowhead)')" if undirect: direct = "" nodeTemplate = ''' node .append("circle") .attr("r",function(d){return d.r/4;}) .attr("fill", function(d){return d.color;}) .append("title") .text(function(d){return d.title;}) ''' nodemakeTemplate = ''' for(var i=0 ; i< graph.nodes.length;i++){ graph.nodes[i].id = i } ''' if pieDataFld != None: nodeTemplate = ''' node.selectAll("path") .data( function(d, i){ return pie(d.node); }) .enter() .append("svg:path") .attr("d", arc) .attr("fill", function(d, i) { return color(d.data.group); }) .append("title") .text(function(d){{return d.data.title;}}) node.append("circle") .attr("r",function(d){{return d.r/4;}}) .attr({ 'fill': 'white' }) .append("title") .text(function(d){{return d.title;}}); ''' nodemakeTemplate = ''' for(var i=0 ; i< graph.nodes.length;i++){ var r = graph.nodes[i].r for(var j=0 ; j< graph.nodes[i].node.length;j++){ graph.nodes[i].node[j]['r'] = r } graph.nodes[i].id = i } ''' elif picFld != None: nodeTemplate = ''' node .append("image") .attr("height",function(d){return d.r;}) .attr("width",function(d){return d.r;}) .attr("x",function(d){return -1 * d.r/2; }) .attr("y",function(d){return -1 * d.r/2; }) .attr("xlink:href",function(d){return d.pic; }) .append("title") .text(function(d){return d.title;}) ''' d3js_str = "<script type='text/javascript' src='http://d3js.org/d3.v3.min.js'></script>" if offline: d3js_str = "<script>%s<script>" % (vjs.ViewJs.d3jsMin()) outTemplate = ''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> {d3js_str} <style></style> </head> <body> <script type="text/javascript"> var graph = {gdata} ; var width = 4000, height = 3000; var color = d3.scale.category10(); {nodemakeTemplate}; for(var i=0 ; i< graph.links.length;i++){{ graph.links[i].id = i }} var pie = d3.layout.pie() .sort(null) .value(function(d) {{ return d.value; }}); var arc = d3.svg.arc() .outerRadius( function(d){{ return d.data.r ; }}) .innerRadius( function(d){{ return d.data.r/2 ; }} ); var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height); d3.select("svg").append('defs').append('marker') .attr({{'id':'arrowhead', 'viewBox':'-0 -5 10 10', 'refX':30, 'refY':0, 'orient':'auto-start-reverse', 'markerWidth':5, 'markerHeight':5, 'xoverflow':'visible'}}) .append('path') .attr('d', 'M 0,-5 L 10 ,0 L 0,5') .attr('fill', '#999') .style('stroke','none'); var g = svg.append("g"); var node = g.selectAll(".node"); var link = g.selectAll(".link"); nodes = graph.nodes links = graph.links var force = d3.layout.force() .linkDistance(200) .linkStrength(3.5) .charge(-3500) .gravity(0.1) .friction(0.95) .size([width, height]) .on("tick", function() {{ link .attr("x1", function(d) {{ return d.source.x; }}) .attr("y1", function(d) {{ return d.source.y; }}) .attr("x2", function(d) {{ return d.target.x; }}) .attr("y2", function(d) {{ return d.target.y; }}); node .attr("x", function(d) {{ return d.x; }}) .attr("y", function(d) {{ return d.y; }}) .attr("transform", function(d) {{ return "translate(" + d.x + "," + d.y + ")"}}); }}); node = node.data(nodes, function( d ) {{ return d.id; }} ); link = link.data(links, function( d ) {{ return d.id; }} ); link .enter() .append("line") .attr("class", "link") .style("stroke", function( d ) {{ return d.color; }} ) .style("stroke-width", function( d ) {{ return d.ewidth; }}) {direct} node .enter() .append("g") .attr("class", "node") .style({{}}) .call(force.drag) .on("contextmenu", function(nd) {{ d3.event.preventDefault(); force.stop() nodes.splice( nd.index, 1 ); links = links.filter(function(nl) {{ return nl.source.index != nd.index && nl.target.index != nd.index; }}); node = node.data(nodes, function( d ) {{ return d.id; }} ); node.exit().remove(); link = link.data( links, function( d ) {{ return d.id; }} ); link.exit().remove(); force.nodes(nodes) .links(links) .start(); }}); {nodeTemplate} node .append("text") .attr("text-anchor", "middle") .style("stroke", "black") .text(function(d) {{ return d.name; }}); force.nodes(nodes) .links(links) .start(); </script> </body> </html> '''.format(d3js_str=d3js_str, gdata=gdata, nodemakeTemplate=nodemakeTemplate, direct=direct, nodeTemplate=nodeTemplate) html = sys.stdout if not o == None: html = open(o, "w") html.write(outTemplate) if not o == None: html.close()
def __init__(self, nc, ni, col, order): self.nc = nc self.ni = ni self.col = col self.range = 0 self.min = 0 self.max = 0 self.order = order if self.nc and self.ni: if self.col == "category": self.type = "category" # preparing a color pallet pallet = [] val = [ "FF", "80", "C0", "40", "E0", "60", "A0", "20", "F0", "70", "B0", "30", "D0", "50", "90", "10" ] for v in val: pallet.append("%s0000" % (v)) pallet.append("00%s00" % (v)) pallet.append("0000%s" % (v)) pallet.append("%s%s00" % (v, v)) pallet.append("00%s%s" % (v, v)) pallet.append("%s00%s" % (v, v)) # read color field data and make a mapping table(data to pallet) f = None f <<= nm.mcut(f="%s:ckey" % (self.nc), i=self.ni) f <<= nm.mdelnull(f="ckey") f <<= nm.mcount(k="ckey", a="freq") if self.order == "descend": f <<= nm.mbest(s="freq%nr,ckey", fr=0, size=96) #,o=#{xxcTable} elif self.order == "ascend": f <<= nm.mbest(s="freq%n,ckey", fr=0, size=96) # o=#{xxcTable}" else: f <<= nm.mbest(s="ckey", fr=0, size=96) #o=#{xxcTable}" self.cTable = {} i = 0 for flds in f.getline(otype="dict"): cK = flds["ckey"] self.cTable[cK] = pallet[i] i += 1 else: self.type = "numeric" ary = col.split(",") if len(ary) != 2 or len(ary[0]) != 6 or len(ary[1]) != 6: raise ValueError( "col= takes two 6-digites HEX codes like FF0000,00FF00" ) self.r0 = int(ary[0][0:2], 16) self.g0 = int(ary[0][2:4], 16) self.b0 = int(ary[0][4:6], 16) self.r1 = int(ary[1][0:2], 16) self.g1 = int(ary[1][2:4], 16) self.b1 = int(ary[1][4:6], 16) f = None f <<= nm.mcut(f="%s:ckey" % (self.nc), i=self.ni) f <<= nm.mdelnull(f="ckey") f <<= nm.msummary(f="ckey", c="min,max") xxcTable = f.run() if len(xxcTable) > 0: if len(xxcTable[0]) >= 2: if xxcTable[0][1] != "": self.min = float(xxcTable[0][1]) if xxcTable[0][2] != "": self.max = float(xxcTable[0][2]) if xxcTable[0][1] != "" and xxcTable[0][2] != "": self.range = self.max - self.min