├── .gitattributes ├── GraphShow.py ├── README.md ├── VIS └── dist │ ├── vis.css │ ├── vis.js │ ├── vis.map │ ├── vis.min.css │ └── vis.min.js ├── build ├── dist │ ├── chart │ │ ├── bar.js │ │ ├── chord.js │ │ ├── eventRiver.js │ │ ├── force.js │ │ ├── funnel.js │ │ ├── gauge.js │ │ ├── heatmap.js │ │ ├── k.js │ │ ├── line.js │ │ ├── map.js │ │ ├── pie.js │ │ ├── radar.js │ │ ├── scatter.js │ │ ├── tree.js │ │ ├── treemap.js │ │ ├── venn.js │ │ └── wordCloud.js │ ├── echarts-all.js │ └── echarts.js ├── echarts-optimize-conf.js └── source │ ├── chart │ ├── bar.js │ ├── chord.js │ ├── eventRiver.js │ ├── force.js │ ├── funnel.js │ ├── gauge.js │ ├── heatmap.js │ ├── k.js │ ├── line.js │ ├── map.js │ ├── pie.js │ ├── radar.js │ ├── scatter.js │ ├── tree.js │ ├── treemap.js │ ├── venn.js │ └── wordCloud.js │ ├── echarts-all.js │ └── echarts.js ├── graph_show.html ├── image ├── 中兴事件.png ├── 同学杀人事件.png ├── 雷洋嫖娼事件.png └── 魏则西事件.png ├── keywords_textrank.py ├── sentence_parser.py └── text_grapher.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=Python 2 | *.css linguist-language=Python 3 | *.html linguist-language=Python 4 | -------------------------------------------------------------------------------- /GraphShow.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | # File: GraphShow.py 4 | # Author: lhy 5 | # Date: 18-7-24 6 | 7 | '''创建展示页面''' 8 | class GraphShow(): 9 | def __init__(self): 10 | self.base = ''' 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 59 | 60 | 61 | ''' 62 | '''读取文件数据''' 63 | def create_page(self, events): 64 | nodes = [] 65 | for event in events: 66 | nodes.append(event[0]) 67 | nodes.append(event[1]) 68 | node_dict = {node: index for index, node in enumerate(nodes)} 69 | 70 | data_nodes = [] 71 | data_edges = [] 72 | for node, id in node_dict.items(): 73 | data = {} 74 | data["group"] = 'Event' 75 | data["id"] = id 76 | data["label"] = node 77 | data_nodes.append(data) 78 | 79 | for edge in events: 80 | data = {} 81 | data['from'] = node_dict.get(edge[0]) 82 | data['label'] = '' 83 | data['to'] = node_dict.get(edge[1]) 84 | data_edges.append(data) 85 | 86 | self.create_html(data_nodes, data_edges) 87 | return 88 | 89 | '''生成html文件''' 90 | def create_html(self, data_nodes, data_edges): 91 | f = open('graph_show.html', 'w+') 92 | html = self.base.replace('data_nodes', str(data_nodes)).replace('data_edges', str(data_edges)) 93 | f.write(html) 94 | f.close() 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TextGrapher 2 | Text Content Grapher based on keyinfo extraction by NLP method。输入一篇文档,将文档进行关键信息提取,进行结构化,并最终组织成图谱组织形式,形成对文章语义信息的图谱化展示。 3 | # 项目介绍 4 | 如何用图谱和结构化的方式,即以简洁的方式对输入的文本内容进行最佳的语义表示是个难题。 本项目将对这一问题进行尝试,采用的方法为:输入一篇文档,将文档进行关键信息提取,并进行结构化,并最终组织成图谱组织形式,形成对文章语义信息的图谱化展示。   5 | # 使用方式 6 | from text_grapher import * 7 | content = '你要分析的文本' 8 | handler = CrimeMining() 9 | handler.main(content) 10 | 结果保存在graph.html文件当中。   11 | 12 | # 事件举例 13 | 1) 中兴事件  14 | ![image](https://github.com/liuhuanyong/TextGrapher/blob/master/image/%E4%B8%AD%E5%85%B4%E4%BA%8B%E4%BB%B6.png) 15 | 16 | 2) 魏则西事件  17 | ![image](https://github.com/liuhuanyong/TextGrapher/blob/master/image/%E9%AD%8F%E5%88%99%E8%A5%BF%E4%BA%8B%E4%BB%B6.png) 18 | 19 | 3) 雷洋事件  20 | ![image](https://github.com/liuhuanyong/TextGrapher/blob/master/image/%E9%9B%B7%E6%B4%8B%E5%AB%96%E5%A8%BC%E4%BA%8B%E4%BB%B6.png) 21 | 22 | 4) 同学杀人事件  23 | ![image](https://github.com/liuhuanyong/TextGrapher/blob/master/image/%E5%90%8C%E5%AD%A6%E6%9D%80%E4%BA%BA%E4%BA%8B%E4%BB%B6.png) 24 | 25 | # 总结 26 | 1)如何用图谱和结构化的方式,即以简洁的方式对输入的文本内容进行最佳的语义表示是个难题。 27 | 2)本项目采用了高频词,关键词,命名实体识别,主谓宾短语识别等抽取方式,并尝试将三类信息进行图谱组织表示,这种表示方式是一种尝试。 28 | 3)命名实体识别以及关键信息抽取受限于NLP的性能,在算法和方式上还存在多处不足。 29 | # Question? 30 | send mail to lhy_in_blcu@126.com 31 | If any question about the project or me ,see https://liuhuanyong.github.io/ 32 | -------------------------------------------------------------------------------- /build/dist/chart/bar.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/bar",["require","./base","zrender/shape/Rectangle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Rectangle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.bar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,barGap:"30%",barCategoryGap:"20%",itemStyle:{normal:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}},emphasis:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_BAR,_buildShape:function(){this._buildPosition()},_buildNormal:function(e,t,i,o,r){for(var s,l,h,d,c,m,p,u,V,U,g,f,y=this.series,b=i[0][0],_=y[b],x="horizontal"==r,k=this.component.xAxis,v=this.component.yAxis,L=x?k.getAxis(_.xAxisIndex):v.getAxis(_.yAxisIndex),w=this._mapSize(L,i),W=w.gap,X=w.barGap,I=w.barWidthMap,S=w.barMaxWidthMap,K=w.barWidth,C=w.barMinHeightMap,T=w.interval,E=this.deepQuery([this.ecTheme,a],"island.r"),z=0,A=t;A>z&&null!=L.getNameByIndex(z);z++){x?d=L.getCoordByIndex(z)-W/2:c=L.getCoordByIndex(z)+W/2;for(var M=0,F=i.length;F>M;M++){var J=y[i[M][0]].yAxisIndex||0,P=y[i[M][0]].xAxisIndex||0;s=x?v.getAxis(J):k.getAxis(P),p=m=V=u=s.getCoord(0);for(var O=0,D=i[M].length;D>O;O++)b=i[M][O],_=y[b],g=_.data[z],f=this.getDataFromOption(g,"-"),o[b]=o[b]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},h=Math.min(S[b]||Number.MAX_VALUE,I[b]||K),"-"!==f&&(f>0?(l=O>0?s.getCoordSize(f):x?p-s.getCoord(f):s.getCoord(f)-p,1===D&&C[b]>l&&(l=C[b]),x?(m-=l,c=m):(d=m,m+=l)):0>f?(l=O>0?s.getCoordSize(f):x?s.getCoord(f)-V:V-s.getCoord(f),1===D&&C[b]>l&&(l=C[b]),x?(c=u,u+=l):(u-=l,d=u)):(l=0,x?(m-=l,c=m):(d=m,m+=l)),o[b][z]=x?d+h/2:c-h/2,o[b].min>f&&(o[b].min=f,x?(o[b].minY=c,o[b].minX=o[b][z]):(o[b].minX=d+l,o[b].minY=o[b][z])),o[b].maxO;O++)b=i[M][O],_=y[b],g=_.data[z],f=this.getDataFromOption(g,"-"),h=Math.min(S[b]||Number.MAX_VALUE,I[b]||K),"-"==f&&this.deepQuery([g,_,this.option],"calculable")&&(x?(m-=E,c=m):(d=m,m+=E),U=this._getBarItem(b,z,L.getNameByIndex(z),d,c-(x?0:h),x?h:E,x?E:h,x?"vertical":"horizontal"),U.hoverable=!1,U.draggable=!1,U.style.lineWidth=1,U.style.brushType="stroke",U.style.strokeColor=_.calculableHolderColor||this.ecTheme.calculableHolderColor||a.calculableHolderColor,this.shapeList.push(new n(U)));x?d+=h+X:c-=h+X}}this._calculMarkMapXY(o,i,x?"y":"x")},_buildHorizontal:function(e,t,i,n){return this._buildNormal(e,t,i,n,"horizontal")},_buildVertical:function(e,t,i,n){return this._buildNormal(e,t,i,n,"vertical")},_buildOther:function(e,t,i,a){for(var o=this.series,r=0,s=i.length;s>r;r++)for(var l=0,h=i[r].length;h>l;l++){var d=i[r][l],c=o[d],m=c.xAxisIndex||0,p=this.component.xAxis.getAxis(m),u=p.getCoord(0),V=c.yAxisIndex||0,U=this.component.yAxis.getAxis(V),g=U.getCoord(0);a[d]=a[d]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var f=0,y=c.data.length;y>f;f++){var b=c.data[f],_=this.getDataFromOption(b,"-");if(_ instanceof Array){var x,k,v=p.getCoord(_[0]),L=U.getCoord(_[1]),w=[b,c],W=this.deepQuery(w,"barWidth")||10,X=this.deepQuery(w,"barHeight");null!=X?(x="horizontal",_[0]>0?(W=v-u,v-=W):W=_[0]<0?u-v:0,k=this._getBarItem(d,f,_[0],v,L-X/2,W,X,x)):(x="vertical",_[1]>0?X=g-L:_[1]<0?(X=L-g,L-=X):X=0,k=this._getBarItem(d,f,_[0],v-W/2,L,W,X,x)),this.shapeList.push(new n(k)),v=p.getCoord(_[0]),L=U.getCoord(_[1]),a[d].min0>_[0]&&(a[d].min0=_[0],a[d].minY0=L,a[d].minX0=v),a[d].max0<_[0]&&(a[d].max0=_[0],a[d].maxY0=L,a[d].maxX0=v),a[d].sum0+=_[0],a[d].counter0++,a[d].min1>_[1]&&(a[d].min1=_[1],a[d].minY1=L,a[d].minX1=v),a[d].max1<_[1]&&(a[d].max1=_[1],a[d].maxY1=L,a[d].maxX1=v),a[d].sum1+=_[1],a[d].counter1++}}}this._calculMarkMapXY(a,i,"xy")},_mapSize:function(e,t,i){var n,a,o=this._findSpecialBarSzie(t,i),r=o.barWidthMap,s=o.barMaxWidthMap,l=o.barMinHeightMap,h=o.sBarWidthCounter,d=o.sBarWidthTotal,c=o.barGap,m=o.barCategoryGap,p=1;if(t.length!=h){if(i)n=e.getGap(),c=0,a=+(n/t.length).toFixed(2),0>=a&&(p=Math.floor(t.length/n),a=1);else if(n="string"==typeof m&&m.match(/%$/)?(e.getGap()*(100-parseFloat(m))/100).toFixed(2)-0:e.getGap()-m,"string"==typeof c&&c.match(/%$/)?(c=parseFloat(c)/100,a=+((n-d)/((t.length-1)*c+t.length-h)).toFixed(2),c=a*c):(c=parseFloat(c),a=+((n-d-c*(t.length-1))/(t.length-h)).toFixed(2)),0>=a)return this._mapSize(e,t,!0)}else if(n=h>1?"string"==typeof m&&m.match(/%$/)?+(e.getGap()*(100-parseFloat(m))/100).toFixed(2):e.getGap()-m:d,a=0,c=h>1?+((n-d)/(h-1)).toFixed(2):0,0>c)return this._mapSize(e,t,!0);return this._recheckBarMaxWidth(t,r,s,l,n,a,c,p)},_findSpecialBarSzie:function(e,t){for(var i,n,a,o,r=this.series,s={},l={},h={},d=0,c=0,m=0,p=e.length;p>m;m++)for(var u={barWidth:!1,barMaxWidth:!1},V=0,U=e[m].length;U>V;V++){var g=e[m][V],f=r[g];if(!t){if(u.barWidth)s[g]=i;else if(i=this.query(f,"barWidth"),null!=i){s[g]=i,c+=i,d++,u.barWidth=!0;for(var y=0,b=V;b>y;y++){var _=e[m][y];s[_]=i}}if(u.barMaxWidth)l[g]=n;else if(n=this.query(f,"barMaxWidth"),null!=n){l[g]=n,u.barMaxWidth=!0;for(var y=0,b=V;b>y;y++){var _=e[m][y];l[_]=n}}}h[g]=this.query(f,"barMinHeight"),a=null!=a?a:this.query(f,"barGap"),o=null!=o?o:this.query(f,"barCategoryGap")}return{barWidthMap:s,barMaxWidthMap:l,barMinHeightMap:h,sBarWidth:i,sBarMaxWidth:n,sBarWidthCounter:d,sBarWidthTotal:c,barGap:a,barCategoryGap:o}},_recheckBarMaxWidth:function(e,t,i,n,a,o,r,s){for(var l=0,h=e.length;h>l;l++){var d=e[l][0];i[d]&&i[d]0&&y.height>f&&y.width>f?(y.y+=f/2,y.height-=f,y.x+=f/2,y.width-=f):y.brushType="fill",d.highlightStyle.textColor=d.highlightStyle.color,d=this.addLabel(d,m,p,i,h);for(var b=[y,d.highlightStyle],_=0,x=b.length;x>_;_++){var k=b[_].textPosition;if("insideLeft"===k||"insideRight"===k||"insideTop"===k||"insideBottom"===k){var v=5;switch(k){case"insideLeft":b[_].textX=y.x+v,b[_].textY=y.y+y.height/2,b[_].textAlign="left",b[_].textBaseline="middle";break;case"insideRight":b[_].textX=y.x+y.width-v,b[_].textY=y.y+y.height/2,b[_].textAlign="right",b[_].textBaseline="middle";break;case"insideTop":b[_].textX=y.x+y.width/2,b[_].textY=y.y+v/2,b[_].textAlign="center",b[_].textBaseline="top";break;case"insideBottom":b[_].textX=y.x+y.width/2,b[_].textY=y.y+y.height-v/2,b[_].textAlign="center",b[_].textBaseline="bottom"}b[_].textPosition="specific",b[_].textColor=b[_].textColor||"#fff"}}return this.deepQuery([p,m,this.option],"calculable")&&(this.setCalculable(d),d.draggable=!0),o.pack(d,c[e],e,c[e].data[t],t,i),d},getMarkCoord:function(e,t){var i,n,a=this.series[e],o=this.xMarkMap[e],r=this.component.xAxis.getAxis(a.xAxisIndex),s=this.component.yAxis.getAxis(a.yAxisIndex);if(!t.type||"max"!==t.type&&"min"!==t.type&&"average"!==t.type)if(o.isHorizontal){i="string"==typeof t.xAxis&&r.getIndexByName?r.getIndexByName(t.xAxis):t.xAxis||0;var l=o[i];l=null!=l?l:"string"!=typeof t.xAxis&&r.getCoordByIndex?r.getCoordByIndex(t.xAxis||0):r.getCoord(t.xAxis||0),n=[l,s.getCoord(t.yAxis||0)]}else{i="string"==typeof t.yAxis&&s.getIndexByName?s.getIndexByName(t.yAxis):t.yAxis||0;var h=o[i];h=null!=h?h:"string"!=typeof t.yAxis&&s.getCoordByIndex?s.getCoordByIndex(t.yAxis||0):s.getCoord(t.yAxis||0),n=[r.getCoord(t.xAxis||0),h]}else{var d=null!=t.valueIndex?t.valueIndex:null!=o.maxX0?"1":"";n=[o[t.type+"X"+d],o[t.type+"Y"+d],o[t.type+"Line"+d],o[t.type+d]]}return n},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){V--,0===V&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,d,c,m,p,u,V=0,r=this.shapeList.length-1;r>=0;r--)if(p=o.get(this.shapeList[r],"seriesIndex"),a[p]&&!a[p][3]&&"rectangle"===this.shapeList[r].type){if(u=o.get(this.shapeList[r],"dataIndex"),m=n[p],a[p][2]&&u===m.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[p][2]&&0===u){this.zr.delShape(this.shapeList[r].id);continue}"horizontal"===this.shapeList[r]._orient?(c=this.component.yAxis.getAxis(m.yAxisIndex||0).getGap(),d=a[p][2]?-c:c,l=0):(h=this.component.xAxis.getAxis(m.xAxisIndex||0).getGap(),l=a[p][2]?h:-h,d=0),this.shapeList[r].position=[0,0],V++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,d]}).done(i).start()}V||t&&t()}},r.inherits(t,i),e("../chart").define("bar",t),t}); -------------------------------------------------------------------------------- /build/dist/chart/chord.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/chord",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Sector","../util/shape/Ribbon","../util/shape/Icon","zrender/shape/BezierCurve","../config","../util/ecData","zrender/tool/util","zrender/tool/vector","../data/Graph","../layout/Chord","../chart"],function(e){"use strict";function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.scaleLineLength=4,this.scaleUnitAngle=4,this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Sector"),r=e("../util/shape/Ribbon"),s=e("../util/shape/Icon"),l=e("zrender/shape/BezierCurve"),h=e("../config");h.chord={zlevel:0,z:2,clickable:!0,radius:["65%","75%"],center:["50%","50%"],padding:2,sort:"none",sortSub:"none",startAngle:90,clockWise:!0,ribbonType:!0,minRadius:10,maxRadius:20,symbol:"circle",showScale:!1,showScaleText:!1,itemStyle:{normal:{borderWidth:0,borderColor:"#000",label:{show:!0,rotate:!1,distance:5},chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999",opacity:.5}},emphasis:{borderWidth:0,borderColor:"#000",chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999"}}}};var d=e("../util/ecData"),c=e("zrender/tool/util"),p=e("zrender/tool/vector"),m=e("../data/Graph"),u=e("../layout/Chord");return t.prototype={type:h.CHART_TYPE_CHORD,_init:function(){var e=this.series;this.selectedMap={};for(var t={},i={},n=0,a=e.length;a>n;n++)if(e[n].type===this.type){var o=this.isSelected(e[n].name);this.selectedMap[e[n].name]=o,o&&this.buildMark(n),this.reformOption(e[n]),t[e[n].name]=e[n]}for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type)if(e[n].insertToSerie){var r=t[e[n].insertToSerie];e[n]._referenceSerie=r}else i[e[n].name]=[e[n]];for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type&&e[n].insertToSerie){for(var s=e[n]._referenceSerie;s&&s._referenceSerie;)s=s._referenceSerie;i[s.name]&&this.selectedMap[e[n].name]&&i[s.name].push(e[n])}for(var l in i)this._buildChords(i[l]);this.addShapeList()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t){var i=this._getNodeCategory(e,t);return[t,i,e]},_getEdgeQueryTarget:function(e,t,i){return i=i||"normal",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].chordStyle]},_buildChords:function(e){for(var t=[],i=e[0],n=function(e){return e.layout.size>0},a=function(e){return function(t){return e.getEdge(t.node2,t.node1)}},o=0;oa;a++){var r=n[a];if(r&&!r.ignore){var s=this._getNodeCategory(t,r),l=s?s.name:r.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=i.addNode(r.name,r);h.rawIndex=a}}}for(var a=0,o=e.links.length;o>a;a++){var d=e.links[a],c=d.source,p=d.target;"number"==typeof c&&(c=n[c],c&&(c=c.name)),"number"==typeof p&&(p=n[p],p&&(p=p.name));var u=i.addEdge(c,p,d);u&&(u.rawIndex=a)}return i.eachNode(function(e){var i=e.data.value;if(null==i)if(i=0,t.ribbonType)for(var n=0;n0&&(u.style.brushType="both"),u.highlightStyle.lineWidth>0&&(u.highlightStyle.brushType="both"),d.pack(u,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(u),i.shape=u},this)},_buildNodeIcons:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),o=this.parseRadius(this.zr,n.radius),r=o[1];i.eachNode(function(i){var o=i.layout.startAngle,l=i.layout.endAngle,h=(o+l)/2,c=r*Math.cos(h),p=r*Math.sin(h),m=this._getNodeQueryTarget(n,i.data),u=this._getNodeCategory(n,i.data),g=this.deepQuery(m,"itemStyle.normal.color");g||(g=this.getColor(u?u.name:i.id));var V=new s({zlevel:e.zlevel,z:e.z+1,style:{x:-i.layout.size,y:-i.layout.size,width:2*i.layout.size,height:2*i.layout.size,iconType:this.deepQuery(m,"symbol"),color:g,brushType:"both",lineWidth:this.deepQuery(m,"itemStyle.normal.borderWidth"),strokeColor:this.deepQuery(m,"itemStyle.normal.borderColor")},highlightStyle:{color:this.deepQuery(m,"itemStyle.emphasis.color"),lineWidth:this.deepQuery(m,"itemStyle.emphasis.borderWidth"),strokeColor:this.deepQuery(m,"itemStyle.emphasis.borderColor")},clickable:n.clickable,position:[c+a[0],p+a[1]]});d.pack(V,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(V),i.shape=V},this)},_buildLabels:function(e,t,i,a){var o=this.query(a,"itemStyle.normal.label.rotate"),r=this.query(a,"itemStyle.normal.label.distance"),s=this.parseCenter(this.zr,a.center),l=this.parseRadius(this.zr,a.radius),h=a.clockWise,d=h?1:-1;i.eachNode(function(t){var i=t.layout.startAngle/Math.PI*180*d,h=t.layout.endAngle/Math.PI*180*d,c=(i*-d+h*-d)/2;c%=360,0>c&&(c+=360);var m=90>=c||c>=270;c=c*Math.PI/180;var u=[Math.cos(c),-Math.sin(c)],g=0;g=a.ribbonType?a.showScaleText?35+r:r:r+t.layout.size;var V=p.scale([],u,l[1]+g);p.add(V,V,s);var y={zlevel:e.zlevel,z:e.z+1,hoverable:!1,style:{text:null==t.data.label?t.id:t.data.label,textAlign:m?"left":"right"}};o?(y.rotation=m?c:Math.PI+c,y.style.x=m?l[1]+g:-l[1]-g,y.style.y=0,y.position=s.slice()):(y.style.x=V[0],y.style.y=V[1]),y.style.color=this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle.color")||"#000000",y.style.textFont=this.getFont(this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle")),y=new n(y),this.shapeList.push(y),t.labelShape=y},this)},_buildRibbons:function(e,t,i,n){var a=e[t],o=this.parseCenter(this.zr,n.center),s=this.parseRadius(this.zr,n.radius);i.eachEdge(function(l,h){var c,p=i.getEdge(l.node2,l.node1);if(p&&!l.shape){if(p.shape)return void(l.shape=p.shape);var m=l.layout.startAngle/Math.PI*180,u=l.layout.endAngle/Math.PI*180,g=p.layout.startAngle/Math.PI*180,V=p.layout.endAngle/Math.PI*180;c=this.getColor(1===e.length?l.layout.weight<=p.layout.weight?l.node1.id:l.node2.id:a.name);var y,f,U=this._getEdgeQueryTarget(a,l.data),_=this._getEdgeQueryTarget(a,l.data,"emphasis"),b=new r({zlevel:a.zlevel,z:a.z,style:{x:o[0],y:o[1],r:s[0],source0:m,source1:u,target0:g,target1:V,brushType:"both",opacity:this.deepQuery(U,"opacity"),color:c,lineWidth:this.deepQuery(U,"borderWidth"),strokeColor:this.deepQuery(U,"borderColor"),clockWise:n.clockWise},clickable:n.clickable,highlightStyle:{brushType:"both",opacity:this.deepQuery(_,"opacity"),lineWidth:this.deepQuery(_,"borderWidth"),strokeColor:this.deepQuery(_,"borderColor")}});l.layout.weight<=p.layout.weight?(y=p.node1,f=p.node2):(y=l.node1,f=l.node2),d.pack(b,a,t,l.data,null==l.rawIndex?h:l.rawIndex,l.data.name||y.id+"-"+f.id,y.id,f.id),this.shapeList.push(b),l.shape=b}},this)},_buildEdgeCurves:function(e,t,i,n,a){var o=e[t],r=this.parseCenter(this.zr,n.center);i.eachEdge(function(e,i){var n=a.getNodeById(e.node1.id),s=a.getNodeById(e.node2.id),h=n.shape,c=s.shape,p=this._getEdgeQueryTarget(o,e.data),m=this._getEdgeQueryTarget(o,e.data,"emphasis"),u=new l({zlevel:o.zlevel,z:o.z,style:{xStart:h.position[0],yStart:h.position[1],xEnd:c.position[0],yEnd:c.position[1],cpX1:r[0],cpY1:r[1],lineWidth:this.deepQuery(p,"width"),strokeColor:this.deepQuery(p,"color"),opacity:this.deepQuery(p,"opacity")},highlightStyle:{lineWidth:this.deepQuery(m,"width"),strokeColor:this.deepQuery(m,"color"),opacity:this.deepQuery(m,"opacity")}});d.pack(u,o,t,e.data,null==e.rawIndex?i:e.rawIndex,e.data.name||e.node1.id+"-"+e.node2.id,e.node1.id,e.node2.id),this.shapeList.push(u),e.shape=u},this)},_buildScales:function(e,t,i){var o,r,s=e.clockWise,l=this.parseCenter(this.zr,e.center),h=this.parseRadius(this.zr,e.radius),d=s?1:-1,c=0,m=-(1/0);e.showScaleText&&(i.eachNode(function(e){var t=e.data.value;t>m&&(m=t),c+=t}),m>1e10?(o="b",r=1e-9):m>1e7?(o="m",r=1e-6):m>1e4?(o="k",r=.001):(o="",r=1));var u=c/(360-e.padding);i.eachNode(function(t){for(var i=t.layout.startAngle/Math.PI*180,c=t.layout.endAngle/Math.PI*180,m=i;;){if(s&&m>c||!s&&c>m)break;var g=m/180*Math.PI,V=[Math.cos(g),Math.sin(g)],y=p.scale([],V,h[1]+1);p.add(y,y,l);var f=p.scale([],V,h[1]+this.scaleLineLength);p.add(f,f,l);var U=new a({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{xStart:y[0],yStart:y[1],xEnd:f[0],yEnd:f[1],lineCap:"round",brushType:"stroke",strokeColor:"#666",lineWidth:1}});this.shapeList.push(U),m+=d*this.scaleUnitAngle}if(e.showScaleText)for(var _=i,b=5*u*this.scaleUnitAngle,x=0;;){if(s&&_>c||!s&&c>_)break;var g=_;g%=360,0>g&&(g+=360);var k=90>=g||g>=270,v=new n({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{x:k?h[1]+this.scaleLineLength+4:-h[1]-this.scaleLineLength-4,y:0,text:Math.round(10*x)/10+o,textAlign:k?"left":"right"},position:l.slice(),rotation:k?[-g/180*Math.PI,0,0]:[-(g+180)/180*Math.PI,0,0]});this.shapeList.push(v),x+=b*r,_+=d*this.scaleUnitAngle*5}},this)},refresh:function(e){if(e&&(this.option=e,this.series=e.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this.backupShapeList(),this._init()},reformOption:function(e){var t=c.merge;e=t(t(e||{},this.ecTheme.chord),h.chord),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),this.z=e.z,this.zlevel=e.zlevel}},c.inherits(t,i),e("../chart").define("chord",t),t}),define("echarts/util/shape/Ribbon",["require","zrender/shape/Base","zrender/shape/util/PathProxy","zrender/tool/util","zrender/tool/area"],function(e){function t(e){i.call(this,e),this._pathProxy=new n}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/PathProxy"),a=e("zrender/tool/util"),o=e("zrender/tool/area");return t.prototype={type:"ribbon",buildPath:function(e,t){var i=t.clockWise||!1,n=this._pathProxy;n.begin(e);var a=t.x,o=t.y,r=t.r,s=t.source0/180*Math.PI,l=t.source1/180*Math.PI,h=t.target0/180*Math.PI,d=t.target1/180*Math.PI,c=a+Math.cos(s)*r,p=o+Math.sin(s)*r,m=a+Math.cos(l)*r,u=o+Math.sin(l)*r,g=a+Math.cos(h)*r,V=o+Math.sin(h)*r,y=a+Math.cos(d)*r,f=o+Math.sin(d)*r;n.moveTo(c,p),n.arc(a,o,t.r,s,l,!i),n.bezierCurveTo(.7*(a-m)+m,.7*(o-u)+u,.7*(a-g)+g,.7*(o-V)+V,g,V),(t.source0!==t.target0||t.source1!==t.target1)&&(n.arc(a,o,t.r,h,d,!i),n.bezierCurveTo(.7*(a-y)+y,.7*(o-f)+f,.7*(a-c)+c,.7*(o-p)+p,c,p))},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.getRect(this.style);return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?o.isInsidePath(this._pathProxy.pathCommands,0,"fill",e,t):void 0}},a.inherits(t,i),t}),define("echarts/data/Graph",["require","zrender/tool/util"],function(e){var t=e("zrender/tool/util"),i=function(e){this._directed=e||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={}};i.prototype.isDirected=function(){return this._directed},i.prototype.addNode=function(e,t){if(this._nodesMap[e])return this._nodesMap[e];var n=new i.Node(e,t);return this.nodes.push(n),this._nodesMap[e]=n,n},i.prototype.getNodeById=function(e){return this._nodesMap[e]},i.prototype.addEdge=function(e,t,n){if("string"==typeof e&&(e=this._nodesMap[e]),"string"==typeof t&&(t=this._nodesMap[t]),e&&t){var a=e.id+"-"+t.id;if(this._edgesMap[a])return this._edgesMap[a];var o=new i.Edge(e,t,n);return this._directed&&(e.outEdges.push(o),t.inEdges.push(o)),e.edges.push(o),e!==t&&t.edges.push(o),this.edges.push(o),this._edgesMap[a]=o,o}},i.prototype.removeEdge=function(e){var i=e.node1,n=e.node2,a=i.id+"-"+n.id;this._directed&&(i.outEdges.splice(t.indexOf(i.outEdges,e),1),n.inEdges.splice(t.indexOf(n.inEdges,e),1)),i.edges.splice(t.indexOf(i.edges,e),1),i!==n&&n.edges.splice(t.indexOf(n.edges,e),1),delete this._edgesMap[a],this.edges.splice(t.indexOf(this.edges,e),1)},i.prototype.getEdge=function(e,t){return"string"!=typeof e&&(e=e.id),"string"!=typeof t&&(t=t.id),this._directed?this._edgesMap[e+"-"+t]:this._edgesMap[e+"-"+t]||this._edgesMap[t+"-"+e]},i.prototype.removeNode=function(e){if("string"!=typeof e||(e=this._nodesMap[e])){delete this._nodesMap[e.id],this.nodes.splice(t.indexOf(this.nodes,e),1);for(var i=0;in;)e.call(t,this.nodes[n],n)?n++:(this.removeNode(this.nodes[n]),i--)},i.prototype.filterEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;)e.call(t,this.edges[n],n)?n++:(this.removeEdge(this.edges[n]),i--)},i.prototype.eachNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;n++)this.nodes[n]&&e.call(t,this.nodes[n],n)},i.prototype.eachEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;n++)this.edges[n]&&e.call(t,this.edges[n],n)},i.prototype.clear=function(){this.nodes.length=0,this.edges.length=0,this._nodesMap={},this._edgesMap={}},i.prototype.breadthFirstTraverse=function(e,t,i,n){if("string"==typeof t&&(t=this._nodesMap[t]),t){var a="edges";"out"===i?a="outEdges":"in"===i&&(a="inEdges");for(var o=0;or;r++){var s=o.addNode(e[r].id,e[r]);s.data.value=0,n&&(s.data.outValue=s.data.inValue=0)}for(var r=0;a>r;r++)for(var l=0;a>l;l++){var h=t[r][l];n&&(o.nodes[r].data.outValue+=h,o.nodes[l].data.inValue+=h),o.nodes[r].data.value+=h,o.nodes[l].data.value+=h}for(var r=0;a>r;r++)for(var l=r;a>l;l++){var h=t[r][l];if(0!==h){var d=o.nodes[r],c=o.nodes[l],p=o.addEdge(d,c,{});if(p.data.weight=h,r!==l&&n&&t[l][r]){var m=o.addEdge(c,d,{});m.data.weight=t[l][r]}}}return o}},i}),define("echarts/layout/Chord",["require"],function(){var e=function(e){e=e||{},this.sort=e.sort||null,this.sortSub=e.sortSub||null,this.padding=.05,this.startAngle=e.startAngle||0,this.clockWise=null==e.clockWise?!1:e.clockWise,this.center=e.center||[0,0],this.directed=!0};e.prototype.run=function(e){e instanceof Array||(e=[e]);var n=e.length;if(n){for(var a=e[0],o=a.nodes.length,r=[],s=0,l=0;o>l;l++){var h=a.nodes[l],d={size:0,subGroups:[],node:h};r.push(d);for(var c=0,p=0;pl;l++){var d=r[l];d.node.layout.startAngle=_,d.node.layout.endAngle=_+b*d.size*U,d.node.layout.subGroups=[];for(var V=0;Vn;n++)if(i[n].type===this.type){e=this.component.xAxis.getAxis(i[n].xAxisIndex||0);for(var o=0,r=i[n].data.length;r>o;o++){t=i[n].data[o].evolution;for(var l=0,h=t.length;h>l;l++)t[l].timeScale=e.getCoord(s.getNewDate(t[l].time)-0),t[l].valueScale=Math.pow(t[l].value,.8)}}this._intervalX=Math.round(this.component.grid.getWidth()/40)},_drawEventRiver:function(){for(var e=this.series,t=0;ta)){for(var o=[],r=[],s=0;a>s;s++)o.push(n[s].timeScale),r.push(n[s].valueScale);var l=[];l.push([o[0],i]);var s=0;for(s=0;a-1>s;s++)l.push([(o[s]+o[s+1])/2,r[s]/-2+i]);for(l.push([(o[s]+(o[s]+t))/2,r[s]/-2+i]),l.push([o[s]+t,i]),l.push([(o[s]+(o[s]+t))/2,r[s]/2+i]),s=a-1;s>0;s--)l.push([(o[s]+o[s-1])/2,r[s-1]/2+i]);return l}},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1)},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},l.inherits(t,i),e("../chart").define("eventRiver",t),t}),define("echarts/layout/eventRiver",["require"],function(){function e(e,i,o){function r(e,t){var i=e.importance,n=t.importance;return i>n?-1:n>i?1:0}for(var s=4,l=0;l=e)return[0];for(var t=[];e--;)t.push(0);return t}(),u=c.slice(0),y=[],g=0,b=0,l=0;l.5?.5:1,r=t.y,s=(t.height-n)/i,l=0,h=e.length;h>l;l++){var m=e[l];m.y=r+s*m.y+m._offset*o,delete m.time,delete m.value,delete m.xpx,delete m.ypx,delete m._offset;for(var V=m.evolution,U=0,d=V.length;d>U;U++)V[U].valueScale*=s}}function i(e,t,i,n){if(e===i)throw new Error("x0 is equal with x1!!!");if(t===n)return function(){return t};var a=(t-n)/(e-i),o=(n*e-t*i)/(e-i);return function(e){return a*e+o}}function n(e,t,n){var a=~~t,o=e.time.length;e.xpx=[],e.ypx=[];for(var r,s=0,l=0,h=0,m=0,V=0;o>s;s++){l=~~e.time[s],m=e.value[s]/2,s===o-1?(h=l+a,V=0):(h=~~e.time[s+1],V=e.value[s+1]/2),r=i(l,m,h,V);for(var U=l;h>U;U++)e.xpx.push(U-n),e.ypx.push(r(U))}e.xpx.push(h-n),e.ypx.push(V)}function a(e,t,i){for(var n,a=0,o=t.xpx.length,r=0;o>r;r++)n=i(t,r),a=Math.max(a,n+e[t.xpx[r]]);for(r=0;o>r;r++)n=i(t,r),e[t.xpx[r]]=a+n;return a}return e}); -------------------------------------------------------------------------------- /build/dist/chart/funnel.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/funnel",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Polygon","../config","../util/ecData","../util/number","zrender/tool/util","zrender/tool/color","zrender/tool/area","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Polygon"),r=e("../config");r.funnel={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,x:80,y:60,x2:80,y2:60,min:0,max:100,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",itemStyle:{normal:{borderColor:"#fff",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:10,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0},labelLine:{show:!0}}}};var s=e("../util/ecData"),l=e("../util/number"),h=e("zrender/tool/util"),m=e("zrender/tool/color"),V=e("zrender/tool/area");return t.prototype={type:r.CHART_TYPE_FUNNEL,_buildShape:function(){var e=this.series,t=this.component.legend;this._paramsMap={},this._selected={},this.selectedMap={};for(var i,n=0,a=e.length;a>n;n++)if(e[n].type===r.CHART_TYPE_FUNNEL){if(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,i=e[n].name||"",this.selectedMap[i]=t?t.isSelected(i):!0,!this.selectedMap[i])continue;this._buildSingleFunnel(n),this.buildMark(n)}this.addShapeList()},_buildSingleFunnel:function(e){var t=this.component.legend,i=this.series[e],n=this._mapData(e),a=this._getLocation(e);this._paramsMap[e]={location:a,data:n};for(var o,r=0,s=[],h=0,m=n.length;m>h;h++)o=n[h].name,this.selectedMap[o]=t?t.isSelected(o):!0,this.selectedMap[o]&&!isNaN(n[h].value)&&(s.push(n[h]),r++);if(0!==r){for(var V,U,d,p,c=this._buildFunnelCase(e),u=i.funnelAlign,y=i.gap,g=r>1?(a.height-(r-1)*y)/r:a.height,b=a.y,f="descending"===i.sort?this._getItemWidth(e,s[0].value):l.parsePercent(i.minSize,a.width),k="descending"===i.sort?1:0,_=a.centerX,x=[],h=0,m=s.length;m>h;h++)if(o=s[h].name,this.selectedMap[o]&&!isNaN(s[h].value)){switch(V=m-2>=h?this._getItemWidth(e,s[h+k].value):"descending"===i.sort?l.parsePercent(i.minSize,a.width):l.parsePercent(i.maxSize,a.width),u){case"left":U=a.x;break;case"right":U=a.x+a.width-f;break;default:U=_-f/2}d=this._buildItem(e,s[h]._index,t?t.getColor(o):this.zr.getColor(s[h]._index),U,b,f,V,g,u),b+=g+y,p=d.style.pointList,x.unshift([p[0][0]-10,p[0][1]]),x.push([p[1][0]+10,p[1][1]]),0===h&&(0===f?(p=x.pop(),"center"==u&&(x[0][0]+=10),"right"==u&&(x[0][0]=p[0]),x[0][1]-="center"==u?10:15,1==m&&(p=d.style.pointList)):(x[x.length-1][1]-=5,x[0][1]-=5)),f=V}c&&(x.unshift([p[3][0]-10,p[3][1]]),x.push([p[2][0]+10,p[2][1]]),0===f?(p=x.pop(),"center"==u&&(x[0][0]+=10),"right"==u&&(x[0][0]=p[0]),x[0][1]+="center"==u?10:15):(x[x.length-1][1]+=5,x[0][1]+=5),c.style.pointList=x)}},_buildFunnelCase:function(e){var t=this.series[e];if(this.deepQuery([t,this.option],"calculable")){var i=this._paramsMap[e].location,n=10,a={hoverable:!1,style:{pointListd:[[i.x-n,i.y-n],[i.x+i.width+n,i.y-n],[i.x+i.width+n,i.y+i.height+n],[i.x-n,i.y+i.height+n]],brushType:"stroke",lineWidth:1,strokeColor:t.calculableHolderColor||this.ecTheme.calculableHolderColor||r.calculableHolderColor}};return s.pack(a,t,e,void 0,-1),this.setCalculable(a),a=new o(a),this.shapeList.push(a),a}},_getLocation:function(e){var t=this.series[e],i=this.zr.getWidth(),n=this.zr.getHeight(),a=this.parsePercent(t.x,i),o=this.parsePercent(t.y,n),r=null==t.width?i-a-this.parsePercent(t.x2,i):this.parsePercent(t.width,i);return{x:a,y:o,width:r,height:null==t.height?n-o-this.parsePercent(t.y2,n):this.parsePercent(t.height,n),centerX:a+r/2}},_mapData:function(e){function t(e,t){return"-"===e.value?1:"-"===t.value?-1:t.value-e.value}function i(e,i){return-t(e,i)}for(var n=this.series[e],a=h.clone(n.data),o=0,r=a.length;r>o;o++)a[o]._index=o;return"none"!=n.sort&&a.sort("descending"===n.sort?t:i),a},_buildItem:function(e,t,i,n,a,o,r,l,h){var m=this.series,V=m[e],U=V.data[t],d=this.getPolygon(e,t,i,n,a,o,r,l,h);s.pack(d,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(d);var p=this.getLabel(e,t,i,n,a,o,r,l,h);s.pack(p,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(p),this._needLabel(V,U,!1)||(p.invisible=!0);var c=this.getLabelLine(e,t,i,n,a,o,r,l,h);this.shapeList.push(c),this._needLabelLine(V,U,!1)||(c.invisible=!0);var u=[],y=[];return this._needLabelLine(V,U,!0)&&(u.push(c.id),y.push(c.id)),this._needLabel(V,U,!0)&&(u.push(p.id),y.push(d.id)),d.hoverConnect=u,p.hoverConnect=y,d},_getItemWidth:function(e,t){var i=this.series[e],n=this._paramsMap[e].location,a=i.min,o=i.max,r=l.parsePercent(i.minSize,n.width),s=l.parsePercent(i.maxSize,n.width);return(t-a)*(s-r)/(o-a)+r},getPolygon:function(e,t,i,n,a,r,s,l,h){var V,U=this.series[e],d=U.data[t],p=[d,U],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=this.getItemStyleColor(c.color,e,t,d)||i,g=this.getItemStyleColor(u.color,e,t,d)||("string"==typeof y?m.lift(y,-.2):y);switch(h){case"left":V=n;break;case"right":V=n+(r-s);break;default:V=n+(r-s)/2}var b={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(p,"clickable"),style:{pointList:[[n,a],[n+r,a],[V+s,a+l],[V,a+l]],brushType:"both",color:y,lineWidth:c.borderWidth,strokeColor:c.borderColor},highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};return this.deepQuery([d,U,this.option],"calculable")&&(this.setCalculable(b),b.draggable=!0),new o(b)},getLabel:function(e,t,i,a,o,r,s,l,U){var d,p=this.series[e],c=p.data[t],u=this._paramsMap[e].location,y=h.merge(h.clone(c.itemStyle)||{},p.itemStyle),g="normal",b=y[g].label,f=b.textStyle||{},k=y[g].labelLine.length,_=this.getLabelText(e,t,g),x=this.getFont(f),L=i;b.position=b.position||y.normal.label.position,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(_,x)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left";var W={zlevel:p.zlevel,z:p.z+1,style:{x:this._getLabelPoint(b.position,a,u,r,s,k,U),y:o+l/2,color:f.color||L,text:_,textAlign:f.align||d,textBaseline:f.baseline||"middle",textFont:x}};return g="emphasis",b=y[g].label||b,f=b.textStyle||f,k=y[g].labelLine.length||k,b.position=b.position||y.normal.label.position,_=this.getLabelText(e,t,g),x=this.getFont(f),L=i,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(_,x)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left",W.highlightStyle={x:this._getLabelPoint(b.position,a,u,r,s,k,U),color:f.color||L,text:_,textAlign:f.align||d,textFont:x,brushType:"fill"},new n(W)},getLabelText:function(e,t,i){var n=this.series,a=n[e],o=a.data[t],r=this.deepQuery([o,a],"itemStyle."+i+".label.formatter");return r?"function"==typeof r?r.call(this.myChart,{seriesIndex:e,seriesName:a.name||"",series:a,dataIndex:t,data:o,name:o.name,value:o.value}):"string"==typeof r?r=r.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{a0}",a.name).replace("{b0}",o.name).replace("{c0}",o.value):void 0:o.name},getLabelLine:function(e,t,i,n,o,r,s,l,m){var V=this.series[e],U=V.data[t],d=this._paramsMap[e].location,p=h.merge(h.clone(U.itemStyle)||{},V.itemStyle),c="normal",u=p[c].labelLine,y=p[c].labelLine.length,g=u.lineStyle||{},b=p[c].label;b.position=b.position||p.normal.label.position;var f={zlevel:V.zlevel,z:V.z+1,hoverable:!1,style:{xStart:this._getLabelLineStartPoint(n,d,r,s,m),yStart:o+l/2,xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),yEnd:o+l/2,strokeColor:g.color||i,lineType:g.type,lineWidth:g.width}};return c="emphasis",u=p[c].labelLine||u,y=p[c].labelLine.length||y,g=u.lineStyle||g,b=p[c].label||b,b.position=b.position,f.highlightStyle={xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),strokeColor:g.color||i,lineType:g.type,lineWidth:g.width},new a(f)},_getLabelPoint:function(e,t,i,n,a,o,r){switch(e="inner"===e||"inside"===e?"center":e){case"center":return"center"==r?t+n/2:"left"==r?t+10:t+n-10;case"left":return"auto"===o?i.x-10:"center"==r?i.centerX-Math.max(n,a)/2-o:"right"==r?t-(a>n?a-n:0)-o:i.x-o;default:return"auto"===o?i.x+i.width+10:"center"==r?i.centerX+Math.max(n,a)/2+o:"right"==r?i.x+i.width+o:t+Math.max(n,a)+o}},_getLabelLineStartPoint:function(e,t,i,n,a){return"center"==a?t.centerX:n>i?e+Math.min(i,n)/2:e+Math.max(i,n)/2},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},h.inherits(t,i),e("../chart").define("funnel",t),t}); -------------------------------------------------------------------------------- /build/dist/chart/gauge.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/gauge",["require","./base","../util/shape/GaugePointer","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","zrender/shape/Circle","zrender/shape/Sector","../config","../util/ecData","../util/accMath","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/GaugePointer"),a=e("zrender/shape/Text"),o=e("zrender/shape/Line"),r=e("zrender/shape/Rectangle"),s=e("zrender/shape/Circle"),l=e("zrender/shape/Sector"),h=e("../config");h.gauge={zlevel:0,z:2,center:["50%","50%"],clickable:!0,legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#228b22"],[.8,"#48b"],[1,"#ff4500"]],width:30}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,textStyle:{color:"auto"}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},pointer:{show:!0,length:"80%",width:8,color:"auto"},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{color:"#333",fontSize:15}},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:40,offsetCenter:[0,"40%"],textStyle:{color:"auto",fontSize:30}}};var m=e("../util/ecData"),V=e("../util/accMath"),U=e("zrender/tool/util");return t.prototype={type:h.CHART_TYPE_GAUGE,_buildShape:function(){var e=this.series;this._paramsMap={},this.selectedMap={};for(var t=0,i=e.length;i>t;t++)e[t].type===h.CHART_TYPE_GAUGE&&(this.selectedMap[e[t].name]=!0,e[t]=this.reformOption(e[t]),this.legendHoverLink=e[t].legendHoverLink||this.legendHoverLink,this._buildSingleGauge(t),this.buildMark(t));this.addShapeList()},_buildSingleGauge:function(e){var t=this.series[e];this._paramsMap[e]={center:this.parseCenter(this.zr,t.center),radius:this.parseRadius(this.zr,t.radius),startAngle:t.startAngle.toFixed(2)-0,endAngle:t.endAngle.toFixed(2)-0},this._paramsMap[e].totalAngle=this._paramsMap[e].startAngle-this._paramsMap[e].endAngle,this._colorMap(e),this._buildAxisLine(e),this._buildSplitLine(e),this._buildAxisTick(e),this._buildAxisLabel(e),this._buildPointer(e),this._buildTitle(e),this._buildDetail(e)},_buildAxisLine:function(e){var t=this.series[e];if(t.axisLine.show)for(var i,n,a=t.min,o=t.max-a,r=this._paramsMap[e],s=r.center,l=r.startAngle,h=r.totalAngle,V=r.colorArray,U=t.axisLine.lineStyle,d=this.parsePercent(U.width,r.radius[1]),p=r.radius[1],c=p-d,u=l,y=0,g=V.length;g>y;y++)n=l-h*(V[y][0]-a)/o,i=this._getSector(s,c,p,n,u,V[y][1],U,t.zlevel,t.z),u=n,i._animationAdd="r",m.set(i,"seriesIndex",e),m.set(i,"dataIndex",y),this.shapeList.push(i)},_buildSplitLine:function(e){var t=this.series[e];if(t.splitLine.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.splitLine,V=this.parsePercent(m.length,r.radius[1]),U=m.lineStyle,d=U.color,p=r.center,c=r.startAngle*Math.PI/180,u=r.totalAngle*Math.PI/180,y=r.radius[1],g=y-V,b=0;s>=b;b++)i=c-u/s*b,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:p[0]+a*y,yStart:p[1]-n*y,xEnd:p[0]+a*g,yEnd:p[1]-n*g,strokeColor:"auto"===d?this._getColor(e,l+h/s*b):d,lineType:U.type,lineWidth:U.width,shadowColor:U.shadowColor,shadowBlur:U.shadowBlur,shadowOffsetX:U.shadowOffsetX,shadowOffsetY:U.shadowOffsetY}}))},_buildAxisTick:function(e){var t=this.series[e];if(t.axisTick.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisTick,V=m.splitNumber,U=this.parsePercent(m.length,r.radius[1]),d=m.lineStyle,p=d.color,c=r.center,u=r.startAngle*Math.PI/180,y=r.totalAngle*Math.PI/180,g=r.radius[1],b=g-U,f=0,k=s*V;k>=f;f++)f%V!==0&&(i=u-y/k*f,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:c[0]+a*g,yStart:c[1]-n*g,xEnd:c[0]+a*b,yEnd:c[1]-n*b,strokeColor:"auto"===p?this._getColor(e,l+h/k*f):p,lineType:d.type,lineWidth:d.width,shadowColor:d.shadowColor,shadowBlur:d.shadowBlur,shadowOffsetX:d.shadowOffsetX,shadowOffsetY:d.shadowOffsetY}})))},_buildAxisLabel:function(e){var t=this.series[e];if(t.axisLabel.show)for(var i,n,o,r,s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisLabel.textStyle,U=this.getFont(m),d=m.color,p=this._paramsMap[e],c=p.center,u=p.startAngle,y=p.totalAngle,g=p.radius[1]-this.parsePercent(t.splitLine.length,p.radius[1])-5,b=0;s>=b;b++)r=V.accAdd(l,V.accMul(V.accDiv(h,s),b)),i=u-y/s*b,n=Math.sin(i*Math.PI/180),o=Math.cos(i*Math.PI/180),i=(i+360)%360,this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{x:c[0]+o*g,y:c[1]-n*g,color:"auto"===d?this._getColor(e,r):d,text:this._getLabelText(t.axisLabel.formatter,r),textAlign:i>=110&&250>=i?"left":70>=i||i>=290?"right":"center",textBaseline:i>=10&&170>=i?"top":i>=190&&350>=i?"bottom":"middle",textFont:U,shadowColor:m.shadowColor,shadowBlur:m.shadowBlur,shadowOffsetX:m.shadowOffsetX,shadowOffsetY:m.shadowOffsetY}}))},_buildPointer:function(e){var t=this.series[e];if(t.pointer.show){var i=t.max-t.min,a=t.pointer,o=this._paramsMap[e],r=this.parsePercent(a.length,o.radius[1]),l=this.parsePercent(a.width,o.radius[1]),h=o.center,V=this._getValue(e);V=V2?2:l/2,color:"#fff"}});m.pack(p,this.series[e],e,this.series[e].data[0],0,this.series[e].data[0].name,V),this.shapeList.push(p),this.shapeList.push(new s({zlevel:t.zlevel,z:t.z+2,hoverable:!1,style:{x:h[0],y:h[1],r:a.width/2.5,color:"#fff"}}))}},_buildTitle:function(e){var t=this.series[e];if(t.title.show){var i=t.data[0],n=null!=i.name?i.name:"";if(""!==n){var o=t.title,r=o.offsetCenter,s=o.textStyle,l=s.color,h=this._paramsMap[e],m=h.center[0]+this.parsePercent(r[0],h.radius[1]),V=h.center[1]+this.parsePercent(r[1],h.radius[1]);this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+(Math.abs(m-h.center[0])+Math.abs(V-h.center[1])<2*s.fontSize?2:1),hoverable:!1,style:{x:m,y:V,color:"auto"===l?this._getColor(e):l,text:n,textAlign:"center",textFont:this.getFont(s),shadowColor:s.shadowColor,shadowBlur:s.shadowBlur,shadowOffsetX:s.shadowOffsetX,shadowOffsetY:s.shadowOffsetY}}))}}},_buildDetail:function(e){var t=this.series[e];if(t.detail.show){var i=t.detail,n=i.offsetCenter,a=i.backgroundColor,o=i.textStyle,s=o.color,l=this._paramsMap[e],h=this._getValue(e),m=l.center[0]-i.width/2+this.parsePercent(n[0],l.radius[1]),V=l.center[1]+this.parsePercent(n[1],l.radius[1]);this.shapeList.push(new r({zlevel:t.zlevel,z:t.z+(Math.abs(m+i.width/2-l.center[0])+Math.abs(V+i.height/2-l.center[1])r;r++)o.push([a[r][0]*n+i,a[r][1]]);this._paramsMap[e].colorArray=o},_getColor:function(e,t){null==t&&(t=this._getValue(e));for(var i=this._paramsMap[e].colorArray,n=0,a=i.length;a>n;n++)if(i[n][0]>=t)return i[n][1];return i[i.length-1][1]},_getSector:function(e,t,i,n,a,o,r,s,h){return new l({zlevel:s,z:h,hoverable:!1,style:{x:e[0],y:e[1],r0:t,r:i,startAngle:n,endAngle:a,brushType:"fill",color:o,shadowColor:r.shadowColor,shadowBlur:r.shadowBlur,shadowOffsetX:r.shadowOffsetX,shadowOffsetY:r.shadowOffsetY}})},_getLabelText:function(e,t){if(e){if("function"==typeof e)return e.call(this.myChart,t);if("string"==typeof e)return e.replace("{value}",t)}return t},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},U.inherits(t,i),e("../chart").define("gauge",t),t}),define("echarts/util/shape/GaugePointer",["require","zrender/shape/Base","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/tool/util");return t.prototype={type:"gauge-pointer",buildPath:function(e,t){var i=t.r,n=t.width,a=t.angle,o=t.x-Math.cos(a)*n*(n>=i/3?1:2),r=t.y+Math.sin(a)*n*(n>=i/3?1:2);a=t.angle-Math.PI/2,e.moveTo(o,r),e.lineTo(t.x+Math.cos(a)*n,t.y-Math.sin(a)*n),e.lineTo(t.x+Math.cos(t.angle)*i,t.y-Math.sin(t.angle)*i),e.lineTo(t.x-Math.cos(a)*n,t.y+Math.sin(a)*n),e.lineTo(o,r)},getRect:function(e){if(e.__rect)return e.__rect;var t=2*e.width,i=e.x,n=e.y,a=i+Math.cos(e.angle)*e.r,o=n-Math.sin(e.angle)*e.r;return e.__rect={x:Math.min(i,a)-t,y:Math.min(n,o)-t,width:Math.abs(i-a)+t,height:Math.abs(n-o)+t},e.__rect},isCover:e("./normalIsCover")},n.inherits(t,i),t}); -------------------------------------------------------------------------------- /build/dist/chart/heatmap.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/heatmap",["require","./base","../layer/heatmap","../config","../util/ecData","zrender/tool/util","zrender/tool/color","zrender/shape/Image","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../layer/heatmap"),a=e("../config"),o=(e("../util/ecData"),e("zrender/tool/util")),r=(e("zrender/tool/color"),e("zrender/shape/Image"));return a.heatmap={zlevel:0,z:2,clickable:!0},t.prototype={type:a.CHART_TYPE_HEATMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=e.series),this._init()},_init:function(){var e=this.series;this.backupShapeList();for(var t=e.length,i=0;t>i;++i)if(e[i].type===a.CHART_TYPE_HEATMAP){e[i]=this.reformOption(e[i]);var o=new n(e[i]),s=o.getCanvas(e[i].data,this.zr.getWidth(),this.zr.getHeight()),l=new r({position:[0,0],scale:[1,1],hoverable:this.option.hoverable,style:{x:0,y:0,image:s,width:s.width,height:s.height}});this.shapeList.push(l)}this.addShapeList()}},o.inherits(t,i),e("../chart").define("heatmap",t),t}),define("echarts/layer/heatmap",["require"],function(){function e(e){if(this.option=e,e)for(var i in t)this.option[i]=void 0!==e[i]?e[i]:t[i];else this.option=t}var t={blurSize:30,gradientColors:["blue","cyan","lime","yellow","red"],minAlpha:.05,valueScale:1,opacity:1},i=20,n=256;return e.prototype={getCanvas:function(e,t,a){var o=this._getBrush(),r=this._getGradient(),s=i+this.option.blurSize,l=document.createElement("canvas");l.width=t,l.height=a;for(var h=l.getContext("2d"),m=e.length,V=0;m>V;++V){var d=e[V],U=d[0],p=d[1],c=d[2],u=Math.min(1,Math.max(c*this.option.valueScale||this.option.minAlpha,this.option.minAlpha));h.globalAlpha=u,h.drawImage(o,U-s,p-s)}for(var g=h.getImageData(0,0,l.width,l.height),y=g.data,m=y.length/4;m--;){var b=4*m+3,u=y[b]/256,f=Math.floor(u*(n-1));y[b-3]=r[4*f],y[b-2]=r[4*f+1],y[b-1]=r[4*f+2],y[b]*=this.option.opacity}return h.putImageData(g,0,0),l},_getBrush:function(){if(!this._brushCanvas){this._brushCanvas=document.createElement("canvas");var e=i+this.option.blurSize,t=2*e;this._brushCanvas.width=t,this._brushCanvas.height=t;var n=this._brushCanvas.getContext("2d");n.shadowOffsetX=t,n.shadowBlur=this.option.blurSize,n.shadowColor="black",n.beginPath(),n.arc(-e,e,i,0,2*Math.PI,!0),n.closePath(),n.fill()}return this._brushCanvas},_getGradient:function(){if(!this._gradientPixels){var e=n,t=document.createElement("canvas");t.width=1,t.height=e;for(var i=t.getContext("2d"),a=i.createLinearGradient(0,0,0,e),o=this.option.gradientColors.length,r=0;o>r;++r)"string"==typeof this.option.gradientColors[r]?a.addColorStop((r+1)/o,this.option.gradientColors[r]):a.addColorStop(this.option.gradientColors[r].offset,this.option.gradientColors[r].color);i.fillStyle=a,i.fillRect(0,0,1,e),this._gradientPixels=i.getImageData(0,0,1,e).data}return this._gradientPixels}},e}),define("echarts/layer/heatmap",["require"],function(){function e(e){if(this.option=e,e)for(var i in t)this.option[i]=void 0!==e[i]?e[i]:t[i];else this.option=t}var t={blurSize:30,gradientColors:["blue","cyan","lime","yellow","red"],minAlpha:.05,valueScale:1,opacity:1},i=20,n=256;return e.prototype={getCanvas:function(e,t,a){var o=this._getBrush(),r=this._getGradient(),s=i+this.option.blurSize,l=document.createElement("canvas");l.width=t,l.height=a;for(var h=l.getContext("2d"),m=e.length,V=0;m>V;++V){var d=e[V],U=d[0],p=d[1],c=d[2],u=Math.min(1,Math.max(c*this.option.valueScale||this.option.minAlpha,this.option.minAlpha));h.globalAlpha=u,h.drawImage(o,U-s,p-s)}for(var g=h.getImageData(0,0,l.width,l.height),y=g.data,m=y.length/4;m--;){var b=4*m+3,u=y[b]/256,f=Math.floor(u*(n-1));y[b-3]=r[4*f],y[b-2]=r[4*f+1],y[b-1]=r[4*f+2],y[b]*=this.option.opacity}return h.putImageData(g,0,0),l},_getBrush:function(){if(!this._brushCanvas){this._brushCanvas=document.createElement("canvas");var e=i+this.option.blurSize,t=2*e;this._brushCanvas.width=t,this._brushCanvas.height=t;var n=this._brushCanvas.getContext("2d");n.shadowOffsetX=t,n.shadowBlur=this.option.blurSize,n.shadowColor="black",n.beginPath(),n.arc(-e,e,i,0,2*Math.PI,!0),n.closePath(),n.fill()}return this._brushCanvas},_getGradient:function(){if(!this._gradientPixels){var e=n,t=document.createElement("canvas");t.width=1,t.height=e;for(var i=t.getContext("2d"),a=i.createLinearGradient(0,0,0,e),o=this.option.gradientColors.length,r=0;o>r;++r)"string"==typeof this.option.gradientColors[r]?a.addColorStop((r+1)/o,this.option.gradientColors[r]):a.addColorStop(this.option.gradientColors[r].offset,this.option.gradientColors[r].color);i.fillStyle=a,i.fillRect(0,0,1,e),this._gradientPixels=i.getImageData(0,0,1,e).data}return this._gradientPixels}},e}); -------------------------------------------------------------------------------- /build/dist/chart/k.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/k",["require","./base","../util/shape/Candle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/Candle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.k={zlevel:0,z:2,clickable:!0,hoverable:!0,legendHoverLink:!1,xAxisIndex:0,yAxisIndex:0,itemStyle:{normal:{color:"#fff",color0:"#00aa11",lineStyle:{width:1,color:"#ff3200",color0:"#00aa11"},label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util");return t.prototype={type:a.CHART_TYPE_K,_buildShape:function(){var e=this.series;this.selectedMap={};for(var t,i={top:[],bottom:[]},n=0,o=e.length;o>n;n++)e[n].type===a.CHART_TYPE_K&&(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,t=this.component.xAxis.getAxis(e[n].xAxisIndex),t.type===a.COMPONENT_TYPE_AXIS_CATEGORY&&i[t.getPosition()].push(n));for(var r in i)i[r].length>0&&this._buildSinglePosition(r,i[r]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){this._buildHorizontal(t,a,n);for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n=this.series,a=this.component.legend,o=[],r=0,s=0,l=e.length;l>s;s++)t=n[e[s]],i=t.name,this.selectedMap[i]=a?a.isSelected(i):!0,this.selectedMap[i]&&o.push(e[s]),r=Math.max(r,t.data.length);return{locationMap:o,maxDataLength:r}},_buildHorizontal:function(e,t,i){for(var n,a,o,r,s,l,h,d,c,m,p=this.series,u={},g=0,V=i.length;V>g;g++){n=i[g],a=p[n],o=a.xAxisIndex||0,r=this.component.xAxis.getAxis(o),h=a.barWidth||Math.floor(r.getGap()/2),m=a.barMaxWidth,m&&h>m&&(h=m),s=a.yAxisIndex||0,l=this.component.yAxis.getAxis(s),u[n]=[];for(var U=0,y=t;y>U&&null!=r.getNameByIndex(U);U++)d=a.data[U],c=this.getDataFromOption(d,"-"),"-"!==c&&4==c.length&&u[n].push([r.getCoordByIndex(U),h,l.getCoord(c[0]),l.getCoord(c[1]),l.getCoord(c[2]),l.getCoord(c[3]),U,r.getNameByIndex(U)])}this._buildKLine(e,u)},_buildKLine:function(e,t){for(var i,n,o,r,s,l,h,d,c,m,p,u,g,V,U,y,f,_=this.series,b=0,x=e.length;x>b;b++)if(f=e[b],p=_[f],V=t[f],this._isLarge(V)&&(V=this._getLargePointList(V)),p.type===a.CHART_TYPE_K&&null!=V){u=p,i=this.query(u,"itemStyle.normal.lineStyle.width"),n=this.query(u,"itemStyle.normal.lineStyle.color"),o=this.query(u,"itemStyle.normal.lineStyle.color0"),r=this.query(u,"itemStyle.normal.color"),s=this.query(u,"itemStyle.normal.color0"),l=this.query(u,"itemStyle.emphasis.lineStyle.width"),h=this.query(u,"itemStyle.emphasis.lineStyle.color"),d=this.query(u,"itemStyle.emphasis.lineStyle.color0"),c=this.query(u,"itemStyle.emphasis.color"),m=this.query(u,"itemStyle.emphasis.color0");for(var k=0,v=V.length;v>k;k++)U=V[k],g=p.data[U[6]],u=g,y=U[3]a;a++)n[a]=e[Math.floor(i/t*a)];return n},_getCandle:function(e,t,i,a,r,s,l,h,d,c,m,p,u,g,V){var U=this.series,y=U[e],f=y.data[t],_=[f,y],b={zlevel:y.zlevel,z:y.z,clickable:this.deepQuery(_,"clickable"),hoverable:this.deepQuery(_,"hoverable"),style:{x:a,y:[s,l,h,d],width:r,color:c,strokeColor:p,lineWidth:m,brushType:"both"},highlightStyle:{color:u,strokeColor:V,lineWidth:g},_seriesIndex:e};return b=this.addLabel(b,y,f,i),o.pack(b,y,e,f,t,i),b=new n(b)},getMarkCoord:function(e,t){var i=this.series[e],n=this.component.xAxis.getAxis(i.xAxisIndex),a=this.component.yAxis.getAxis(i.yAxisIndex);return["string"!=typeof t.xAxis&&n.getCoordByIndex?n.getCoordByIndex(t.xAxis||0):n.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&a.getCoordByIndex?a.getCoordByIndex(t.yAxis||0):a.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){u--,0===u&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,d,c,m,p,u=0,r=0,s=this.shapeList.length;s>r;r++)if(m=this.shapeList[r]._seriesIndex,a[m]&&!a[m][3]&&"candle"===this.shapeList[r].type){if(p=o.get(this.shapeList[r],"dataIndex"),c=n[m],a[m][2]&&p===c.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[m][2]&&0===p){this.zr.delShape(this.shapeList[r].id);continue}h=this.component.xAxis.getAxis(c.xAxisIndex||0).getGap(),l=a[m][2]?h:-h,d=0,u++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,d]}).done(i).start()}u||t&&t()}},r.inherits(t,i),e("../chart").define("k",t),t}); -------------------------------------------------------------------------------- /build/dist/chart/line.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/line",["require","./base","zrender/shape/Polyline","../util/shape/Icon","../util/shape/HalfSmoothPolygon","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o),this.refresh(a)}function i(e,t,i){var n=t.x,a=t.y,r=t.width,s=t.height,l=s/2;t.symbol.match("empty")&&(e.fillStyle="#fff"),t.brushType="both";var h=t.symbol.replace("empty","").toLowerCase();h.match("star")?(l=h.replace("star","")-0||5,a-=1,h="star"):("rectangle"===h||"arrow"===h)&&(n+=(r-s)/2,r=s);var d="";if(h.match("image")&&(d=h.replace(new RegExp("^image:\\/\\/"),""),h="image",n+=Math.round((r-s)/2)-1,r=s+=2),h=o.prototype.iconLibrary[h]){var c=t.x,m=t.y;e.moveTo(c,m+l),e.lineTo(c+5,m+l),e.moveTo(c+t.width-5,m+l),e.lineTo(c+t.width,m+l);var p=this;h(e,{x:n+4,y:a+4,width:r-8,height:s-8,n:l,image:d},function(){p.modSelf(),i()})}else e.moveTo(n,a+l),e.lineTo(n+r,a+l)}var n=e("./base"),a=e("zrender/shape/Polyline"),o=e("../util/shape/Icon"),r=e("../util/shape/HalfSmoothPolygon");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var s=e("../config");s.line={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,dataFilter:"nearest",itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid",shadowColor:"rgba(0,0,0,0)",shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0}},emphasis:{label:{show:!1}}},symbolSize:2,showAllSymbol:!1};var l=e("../util/ecData"),h=e("zrender/tool/util"),d=e("zrender/tool/color");return t.prototype={type:s.CHART_TYPE_LINE,_buildShape:function(){this.finalPLMap={},this._buildPosition()},_buildHorizontal:function(e,t,i,n){for(var a,o,r,s,l,h,d,c,m,p=this.series,u=i[0][0],V=p[u],U=this.component.xAxis.getAxis(V.xAxisIndex||0),g={},f=0,y=t;y>f&&null!=U.getNameByIndex(f);f++){o=U.getCoordByIndex(f);for(var b=0,_=i.length;_>b;b++){a=this.component.yAxis.getAxis(p[i[b][0]].yAxisIndex||0),l=s=d=h=a.getCoord(0);for(var x=0,k=i[b].length;k>x;x++)u=i[b][x],V=p[u],c=V.data[f],m=this.getDataFromOption(c,"-"),g[u]=g[u]||[],n[u]=n[u]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==m?(m>=0?(s-=x>0?a.getCoordSize(m):l-a.getCoord(m),r=s):0>m&&(h+=x>0?a.getCoordSize(m):a.getCoord(m)-d,r=h),g[u].push([o,r,f,U.getNameByIndex(f),o,l]),n[u].min>m&&(n[u].min=m,n[u].minY=r,n[u].minX=o),n[u].max0&&(this.finalPLMap[u]=this.finalPLMap[u]||[],this.finalPLMap[u].push(g[u]),g[u]=[])}s=this.component.grid.getY();for(var v,b=0,_=i.length;_>b;b++)for(var x=0,k=i[b].length;k>x;x++)u=i[b][x],V=p[u],c=V.data[f],m=this.getDataFromOption(c,"-"),"-"==m&&this.deepQuery([c,V,this.option],"calculable")&&(v=this.deepQuery([c,V],"symbolSize"),s+=2*v+5,r=s,this.shapeList.push(this._getCalculableItem(u,f,U.getNameByIndex(f),o,r,"horizontal")))}for(var L in g)g[L].length>0&&(this.finalPLMap[L]=this.finalPLMap[L]||[],this.finalPLMap[L].push(g[L]),g[L]=[]);this._calculMarkMapXY(n,i,"y"),this._buildBorkenLine(e,this.finalPLMap,U,"horizontal")},_buildVertical:function(e,t,i,n){for(var a,o,r,s,l,h,d,c,m,p=this.series,u=i[0][0],V=p[u],U=this.component.yAxis.getAxis(V.yAxisIndex||0),g={},f=0,y=t;y>f&&null!=U.getNameByIndex(f);f++){r=U.getCoordByIndex(f);for(var b=0,_=i.length;_>b;b++){a=this.component.xAxis.getAxis(p[i[b][0]].xAxisIndex||0),l=s=d=h=a.getCoord(0);for(var x=0,k=i[b].length;k>x;x++)u=i[b][x],V=p[u],c=V.data[f],m=this.getDataFromOption(c,"-"),g[u]=g[u]||[],n[u]=n[u]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==m?(m>=0?(s+=x>0?a.getCoordSize(m):a.getCoord(m)-l,o=s):0>m&&(h-=x>0?a.getCoordSize(m):d-a.getCoord(m),o=h),g[u].push([o,r,f,U.getNameByIndex(f),l,r]),n[u].min>m&&(n[u].min=m,n[u].minX=o,n[u].minY=r),n[u].max0&&(this.finalPLMap[u]=this.finalPLMap[u]||[],this.finalPLMap[u].push(g[u]),g[u]=[])}s=this.component.grid.getXend();for(var v,b=0,_=i.length;_>b;b++)for(var x=0,k=i[b].length;k>x;x++)u=i[b][x],V=p[u],c=V.data[f],m=this.getDataFromOption(c,"-"),"-"==m&&this.deepQuery([c,V,this.option],"calculable")&&(v=this.deepQuery([c,V],"symbolSize"),s-=2*v+5,o=s,this.shapeList.push(this._getCalculableItem(u,f,U.getNameByIndex(f),o,r,"vertical")))}for(var L in g)g[L].length>0&&(this.finalPLMap[L]=this.finalPLMap[L]||[],this.finalPLMap[L].push(g[L]),g[L]=[]);this._calculMarkMapXY(n,i,"x"),this._buildBorkenLine(e,this.finalPLMap,U,"vertical")},_buildOther:function(e,t,i,n){for(var a,o=this.series,r={},s=0,l=i.length;l>s;s++)for(var h=0,d=i[s].length;d>h;h++){var c=i[s][h],m=o[c];a=this.component.xAxis.getAxis(m.xAxisIndex||0);var p=this.component.yAxis.getAxis(m.yAxisIndex||0),u=p.getCoord(0);r[c]=r[c]||[],n[c]=n[c]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var V=0,U=m.data.length;U>V;V++){var g=m.data[V],f=this.getDataFromOption(g,"-");if(f instanceof Array){var y=a.getCoord(f[0]),b=p.getCoord(f[1]);r[c].push([y,b,V,f[0],y,u]),n[c].min0>f[0]&&(n[c].min0=f[0],n[c].minY0=b,n[c].minX0=y),n[c].max0f[1]&&(n[c].min1=f[1],n[c].minY1=b,n[c].minX1=y),n[c].max10&&(this.finalPLMap[_]=this.finalPLMap[_]||[],this.finalPLMap[_].push(r[_]),r[_]=[]);this._calculMarkMapXY(n,i,"xy"),this._buildBorkenLine(e,this.finalPLMap,a,"other")},_buildBorkenLine:function(e,t,i,n){for(var o,s="other"==n?"horizontal":n,c=this.series,m=e.length-1;m>=0;m--){var p=e[m],u=c[p],V=t[p];if(u.type===this.type&&null!=V)for(var U=this._getBbox(p,s),g=this._sIndex2ColorMap[p],f=this.query(u,"itemStyle.normal.lineStyle.width"),y=this.query(u,"itemStyle.normal.lineStyle.type"),b=this.query(u,"itemStyle.normal.lineStyle.color"),_=this.getItemStyleColor(this.query(u,"itemStyle.normal.color"),p,-1),x=null!=this.query(u,"itemStyle.normal.areaStyle"),k=this.query(u,"itemStyle.normal.areaStyle.color"),v=0,L=V.length;L>v;v++){var w=V[v],W="other"!=n&&this._isLarge(s,w);if(W)w=this._getLargePointList(s,w,u.dataFilter);else for(var X=0,I=w.length;I>X;X++)o=u.data[w[X][2]],(this.deepQuery([o,u,this.option],"calculable")||this.deepQuery([o,u],"showAllSymbol")||"categoryAxis"===i.type&&i.isMainAxis(w[X][2])&&"none"!=this.deepQuery([o,u],"symbol"))&&this.shapeList.push(this._getSymbol(p,w[X][2],w[X][3],w[X][0],w[X][1],s));var S=new a({zlevel:u.zlevel,z:u.z,style:{miterLimit:f,pointList:w,strokeColor:b||_||g,lineWidth:f,lineType:y,smooth:this._getSmooth(u.smooth),smoothConstraint:U,shadowColor:this.query(u,"itemStyle.normal.lineStyle.shadowColor"),shadowBlur:this.query(u,"itemStyle.normal.lineStyle.shadowBlur"),shadowOffsetX:this.query(u,"itemStyle.normal.lineStyle.shadowOffsetX"),shadowOffsetY:this.query(u,"itemStyle.normal.lineStyle.shadowOffsetY")},hoverable:!1,_main:!0,_seriesIndex:p,_orient:s});if(l.pack(S,c[p],p,0,v,c[p].name),this.shapeList.push(S),x){var K=new r({zlevel:u.zlevel,z:u.z,style:{miterLimit:f,pointList:h.clone(w).concat([[w[w.length-1][4],w[w.length-1][5]],[w[0][4],w[0][5]]]),brushType:"fill",smooth:this._getSmooth(u.smooth),smoothConstraint:U,color:k?k:d.alpha(g,.5)},highlightStyle:{brushType:"fill"},hoverable:!1,_main:!0,_seriesIndex:p,_orient:s});l.pack(K,c[p],p,0,v,c[p].name),this.shapeList.push(K)}}}},_getBbox:function(e,t){var i=this.component.grid.getBbox(),n=this.xMarkMap[e];return null!=n.minX0?[[Math.min(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.min(n.minY0,n.maxY0,n.minY1,n.maxY1)],[Math.max(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.max(n.minY0,n.maxY0,n.minY1,n.maxY1)]]:("horizontal"===t?(i[0][1]=Math.min(n.minY,n.maxY),i[1][1]=Math.max(n.minY,n.maxY)):(i[0][0]=Math.min(n.minX,n.maxX),i[1][0]=Math.max(n.minX,n.maxX)),i)},_isLarge:function(e,t){return t.length<2?!1:"horizontal"===e?Math.abs(t[0][0]-t[1][0])<.5:Math.abs(t[0][1]-t[1][1])<.5},_getLargePointList:function(e,t,i){var n;n="horizontal"===e?this.component.grid.getWidth():this.component.grid.getHeight();var a=t.length,o=[];if("function"!=typeof i)switch(i){case"min":i=function(e){return Math.max.apply(null,e)};break;case"max":i=function(e){return Math.min.apply(null,e)};break;case"average":i=function(e){for(var t=0,i=0;is;s++){var l=Math.floor(a/n*s),h=Math.min(Math.floor(a/n*(s+1)),a);if(!(l>=h)){for(var d=l;h>d;d++)r[d-l]="horizontal"===e?t[d][1]:t[d][0];r.length=h-l;for(var c=i(r),m=-1,p=1/0,d=l;h>d;d++){var u="horizontal"===e?t[d][1]:t[d][0],V=Math.abs(u-c);p>V&&(m=d,p=V)}var U=t[m].slice();"horizontal"===e?U[1]=c:U[0]=c,o.push(U)}}return o},_getSmooth:function(e){return e?.3:0},_getCalculableItem:function(e,t,i,n,a,o){var r=this.series,l=r[e].calculableHolderColor||this.ecTheme.calculableHolderColor||s.calculableHolderColor,h=this._getSymbol(e,t,i,n,a,o);return h.style.color=l,h.style.strokeColor=l,h.rotation=[0,0],h.hoverable=!1,h.draggable=!1,h.style.text=void 0,h},_getSymbol:function(e,t,i,n,a,o){var r=this.series,s=r[e],l=s.data[t],h=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],this._sIndex2ColorMap[e],"#fff","vertical"===o?"horizontal":"vertical");return h.zlevel=s.zlevel,h.z=s.z+1,this.deepQuery([l,s,this.option],"calculable")&&(this.setCalculable(h),h.draggable=!0),h},getMarkCoord:function(e,t){var i=this.series[e],n=this.xMarkMap[e],a=this.component.xAxis.getAxis(i.xAxisIndex),o=this.component.yAxis.getAxis(i.yAxisIndex);if(t.type&&("max"===t.type||"min"===t.type||"average"===t.type)){var r=null!=t.valueIndex?t.valueIndex:null!=n.maxX0?"1":"";return[n[t.type+"X"+r],n[t.type+"Y"+r],n[t.type+"Line"+r],n[t.type+r]]}return["string"!=typeof t.xAxis&&a.getCoordByIndex?a.getCoordByIndex(t.xAxis||0):a.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&o.getCoordByIndex?o.getCoordByIndex(t.yAxis||0):o.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ontooltipHover:function(e,t){for(var i,n,a=e.seriesIndex,o=e.dataIndex,r=a.length;r--;)if(i=this.finalPLMap[a[r]])for(var s=0,l=i.length;l>s;s++){n=i[s];for(var h=0,d=n.length;d>h;h++)o===n[h][2]&&t.push(this._getSymbol(a[r],n[h][2],n[h][3],n[h][0],n[h][1],"horizontal"))}},addDataAnimation:function(e,t){function i(){V--,0===V&&t&&t()}function n(e){e.style.controlPointList=null}for(var a=this.series,o={},r=0,s=e.length;s>r;r++)o[e[r][0]]=e[r];for(var l,h,d,c,m,p,u,V=0,r=this.shapeList.length-1;r>=0;r--)if(m=this.shapeList[r]._seriesIndex,o[m]&&!o[m][3]){if(this.shapeList[r]._main&&this.shapeList[r].style.pointList.length>1){if(p=this.shapeList[r].style.pointList,h=Math.abs(p[0][0]-p[1][0]),c=Math.abs(p[0][1]-p[1][1]),u="horizontal"===this.shapeList[r]._orient,o[m][2]){if("half-smooth-polygon"===this.shapeList[r].type){var U=p.length;this.shapeList[r].style.pointList[U-3]=p[U-2],this.shapeList[r].style.pointList[U-3][u?0:1]=p[U-4][u?0:1],this.shapeList[r].style.pointList[U-2]=p[U-1]}this.shapeList[r].style.pointList.pop(),u?(l=h,d=0):(l=0,d=-c)}else{if(this.shapeList[r].style.pointList.shift(),"half-smooth-polygon"===this.shapeList[r].type){var g=this.shapeList[r].style.pointList.pop();u?g[0]=p[0][0]:g[1]=p[0][1],this.shapeList[r].style.pointList.push(g)}u?(l=-h,d=0):(l=0,d=c)}this.shapeList[r].style.controlPointList=null,this.zr.modShape(this.shapeList[r])}else{if(o[m][2]&&this.shapeList[r]._dataIndex===a[m].data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!o[m][2]&&0===this.shapeList[r]._dataIndex){this.zr.delShape(this.shapeList[r].id);continue}}this.shapeList[r].position=[0,0],V++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,d]}).during(n).done(i).start()}V||t&&t()}},o.prototype.iconLibrary.legendLineIcon=i,h.inherits(t,n),e("../chart").define("line",t),t}),define("echarts/util/shape/HalfSmoothPolygon",["require","zrender/shape/Base","zrender/shape/util/smoothBezier","zrender/tool/util","zrender/shape/Polygon"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/smoothBezier"),a=e("zrender/tool/util");return t.prototype={type:"half-smooth-polygon",buildPath:function(t,i){var a=i.pointList;if(!(a.length<2))if(i.smooth){var o=n(a.slice(0,-2),i.smooth,!1,i.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var r,s,l,h=a.length,d=0;h-3>d;d++)r=o[2*d],s=o[2*d+1],l=a[d+1],t.bezierCurveTo(r[0],r[1],s[0],s[1],l[0],l[1]);t.lineTo(a[h-2][0],a[h-2][1]),t.lineTo(a[h-1][0],a[h-1][1]),t.lineTo(a[0][0],a[0][1])}else e("zrender/shape/Polygon").prototype.buildPath(t,i)}},a.inherits(t,i),t}); -------------------------------------------------------------------------------- /build/dist/chart/pie.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/pie",["require","./base","zrender/shape/Text","zrender/shape/Ring","zrender/shape/Circle","zrender/shape/Sector","zrender/shape/Polyline","../config","../util/ecData","zrender/tool/util","zrender/tool/math","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r.shapeHandler.onmouseover=function(e){var t=e.target,i=h.get(t,"seriesIndex"),n=h.get(t,"dataIndex"),a=h.get(t,"special"),o=[t.style.x,t.style.y],s=t.style.startAngle,l=t.style.endAngle,d=((l+s)/2+360)%360,c=t.highlightStyle.color,m=r.getLabel(i,n,a,o,d,c,!0);m&&r.zr.addHoverShape(m);var p=r.getLabelLine(i,n,o,t.style.r0,t.style.r,d,c,!0);p&&r.zr.addHoverShape(p)},this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Ring"),o=e("zrender/shape/Circle"),r=e("zrender/shape/Sector"),s=e("zrender/shape/Polyline"),l=e("../config");l.pie={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,center:["50%","50%"],radius:[0,"75%"],clockWise:!0,startAngle:90,minAngle:0,selectedOffset:10,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!1},labelLine:{show:!1,length:20,lineStyle:{width:1,type:"solid"}}}}};var h=e("../util/ecData"),d=e("zrender/tool/util"),c=e("zrender/tool/math"),m=e("zrender/tool/color");return t.prototype={type:l.CHART_TYPE_PIE,_buildShape:function(){var e=this.series,t=this.component.legend;this.selectedMap={},this._selected={};var i,n,r;this._selectedMode=!1;for(var s,d=0,c=e.length;c>d;d++)if(e[d].type===l.CHART_TYPE_PIE){if(e[d]=this.reformOption(e[d]),this.legendHoverLink=e[d].legendHoverLink||this.legendHoverLink,s=e[d].name||"",this.selectedMap[s]=t?t.isSelected(s):!0,!this.selectedMap[s])continue;i=this.parseCenter(this.zr,e[d].center),n=this.parseRadius(this.zr,e[d].radius),this._selectedMode=this._selectedMode||e[d].selectedMode,this._selected[d]=[],this.deepQuery([e[d],this.option],"calculable")&&(r={zlevel:e[d].zlevel,z:e[d].z,hoverable:!1,style:{x:i[0],y:i[1],r0:n[0]<=10?0:n[0]-10,r:n[1]+10,brushType:"stroke",lineWidth:1,strokeColor:e[d].calculableHolderColor||this.ecTheme.calculableHolderColor||l.calculableHolderColor}},h.pack(r,e[d],d,void 0,-1),this.setCalculable(r),r=n[0]<=10?new o(r):new a(r),this.shapeList.push(r)),this._buildSinglePie(d),this.buildMark(d)}this.addShapeList()},_buildSinglePie:function(e){for(var t,i=this.series,n=i[e],a=n.data,o=this.component.legend,r=0,s=0,l=0,h=Number.NEGATIVE_INFINITY,d=[],c=0,m=a.length;m>c;c++)t=a[c].name,this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t]&&!isNaN(a[c].value)&&(0!==+a[c].value?r++:s++,l+=+a[c].value,h=Math.max(h,+a[c].value));if(0!==l){for(var p,u,g,V,U,y,f=100,_=n.clockWise,b=(n.startAngle.toFixed(2)-0+360)%360,x=n.minAngle||.01,k=360-x*r-.01*s,v=n.roseType,c=0,m=a.length;m>c;c++)if(t=a[c].name,this.selectedMap[t]&&!isNaN(a[c].value)){if(u=o?o.getColor(t):this.zr.getColor(c),f=a[c].value/l,p="area"!=v?_?b-f*k-(0!==f?x:.01):f*k+b+(0!==f?x:.01):_?b-360/m:360/m+b,p=p.toFixed(2)-0,f=(100*f).toFixed(2),g=this.parseCenter(this.zr,n.center),V=this.parseRadius(this.zr,n.radius),U=+V[0],y=+V[1],"radius"===v?y=a[c].value/h*(y-U)*.8+.2*(y-U)+U:"area"===v&&(y=Math.sqrt(a[c].value/h)*(y-U)+U),_){var L;L=b,b=p,p=L}this._buildItem(d,e,c,f,a[c].selected,g,U,y,b,p,u),_||(b=p)}this._autoLabelLayout(d,g,y);for(var c=0,m=d.length;m>c;c++)this.shapeList.push(d[c]);d=null}},_buildItem:function(e,t,i,n,a,o,r,s,l,d,c){var m=this.series,p=((d+l)/2+360)%360,u=this.getSector(t,i,n,a,o,r,s,l,d,c);h.pack(u,m[t],t,m[t].data[i],i,m[t].data[i].name,n),e.push(u);var g=this.getLabel(t,i,n,o,p,c,!1),V=this.getLabelLine(t,i,o,r,s,p,c,!1);V&&(h.pack(V,m[t],t,m[t].data[i],i,m[t].data[i].name,n),e.push(V)),g&&(h.pack(g,m[t],t,m[t].data[i],i,m[t].data[i].name,n),g._labelLine=V,e.push(g))},getSector:function(e,t,i,n,a,o,s,l,h,d){var p=this.series,u=p[e],g=u.data[t],V=[g,u],U=this.deepMerge(V,"itemStyle.normal")||{},y=this.deepMerge(V,"itemStyle.emphasis")||{},f=this.getItemStyleColor(U.color,e,t,g)||d,_=this.getItemStyleColor(y.color,e,t,g)||("string"==typeof f?m.lift(f,-.2):f),b={zlevel:u.zlevel,z:u.z,clickable:this.deepQuery(V,"clickable"),style:{x:a[0],y:a[1],r0:o,r:s,startAngle:l,endAngle:h,brushType:"both",color:f,lineWidth:U.borderWidth,strokeColor:U.borderColor,lineJoin:"round"},highlightStyle:{color:_,lineWidth:y.borderWidth,strokeColor:y.borderColor,lineJoin:"round"},_seriesIndex:e,_dataIndex:t};if(n){var x=((b.style.startAngle+b.style.endAngle)/2).toFixed(2)-0;b.style._hasSelected=!0,b.style._x=b.style.x,b.style._y=b.style.y;var k=this.query(u,"selectedOffset");b.style.x+=c.cos(x,!0)*k,b.style.y-=c.sin(x,!0)*k,this._selected[e][t]=!0}else this._selected[e][t]=!1;return this._selectedMode&&(b.onclick=this.shapeHandler.onclick),this.deepQuery([g,u,this.option],"calculable")&&(this.setCalculable(b),b.draggable=!0),(this._needLabel(u,g,!0)||this._needLabelLine(u,g,!0))&&(b.onmouseover=this.shapeHandler.onmouseover),b=new r(b)},getLabel:function(e,t,i,a,o,r,s){var l=this.series,h=l[e],m=h.data[t];if(this._needLabel(h,m,s)){var p,u,g,V=s?"emphasis":"normal",U=d.merge(d.clone(m.itemStyle)||{},h.itemStyle),y=U[V].label,f=y.textStyle||{},_=a[0],b=a[1],x=this.parseRadius(this.zr,h.radius),k="middle";y.position=y.position||U.normal.label.position,"center"===y.position?(p=_,u=b,g="center"):"inner"===y.position||"inside"===y.position?(x=(x[0]+x[1])*(y.distance||.5),p=Math.round(_+x*c.cos(o,!0)),u=Math.round(b-x*c.sin(o,!0)),r="#fff",g="center"):(x=x[1]- -U[V].labelLine.length,p=Math.round(_+x*c.cos(o,!0)),u=Math.round(b-x*c.sin(o,!0)),g=o>=90&&270>=o?"right":"left"),"center"!=y.position&&"inner"!=y.position&&"inside"!=y.position&&(p+="left"===g?20:-20),m.__labelX=p-("left"===g?5:-5),m.__labelY=u;var v=new n({zlevel:h.zlevel,z:h.z+1,hoverable:!1,style:{x:p,y:u,color:f.color||r,text:this.getLabelText(e,t,i,V),textAlign:f.align||g,textBaseline:f.baseline||k,textFont:this.getFont(f)},highlightStyle:{brushType:"fill"}});return v._radius=x,v._labelPosition=y.position||"outer",v._rect=v.getRect(v.style),v._seriesIndex=e,v._dataIndex=t,v}},getLabelText:function(e,t,i,n){var a=this.series,o=a[e],r=o.data[t],s=this.deepQuery([r,o],"itemStyle."+n+".label.formatter");return s?"function"==typeof s?s.call(this.myChart,{seriesIndex:e,seriesName:o.name||"",series:o,dataIndex:t,data:r,name:r.name,value:r.value,percent:i}):"string"==typeof s?(s=s.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{d}","{d0}"),s=s.replace("{a0}",o.name).replace("{b0}",r.name).replace("{c0}",r.value).replace("{d0}",i)):void 0:r.name},getLabelLine:function(e,t,i,n,a,o,r,l){var h=this.series,m=h[e],p=m.data[t];if(this._needLabelLine(m,p,l)){var u=l?"emphasis":"normal",g=d.merge(d.clone(p.itemStyle)||{},m.itemStyle),V=g[u].labelLine,U=V.lineStyle||{},y=i[0],f=i[1],_=a,b=this.parseRadius(this.zr,m.radius)[1]- -V.length,x=c.cos(o,!0),k=c.sin(o,!0);return new s({zlevel:m.zlevel,z:m.z+1,hoverable:!1,style:{pointList:[[y+_*x,f-_*k],[y+b*x,f-b*k],[p.__labelX,p.__labelY]],strokeColor:U.color||r,lineType:U.type,lineWidth:U.width},_seriesIndex:e,_dataIndex:t})}},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},_autoLabelLayout:function(e,t,i){for(var n=[],a=[],o=0,r=e.length;r>o;o++)("outer"===e[o]._labelPosition||"outside"===e[o]._labelPosition)&&(e[o]._rect._y=e[o]._rect.y,e[o]._rect.xa;a++)if(e[a]._rect.y+=n,e[a].style.y+=n,e[a]._labelLine&&(e[a]._labelLine.style.pointList[1][1]+=n,e[a]._labelLine.style.pointList[2][1]+=n),a>t&&i>a+1&&e[a+1]._rect.y>e[a]._rect.y+e[a]._rect.height)return void o(a,n/2);o(i-1,n/2)}function o(t,i){for(var n=t;n>=0&&(e[n]._rect.y-=i,e[n].style.y-=i,e[n]._labelLine&&(e[n]._labelLine.style.pointList[1][1]-=i,e[n]._labelLine.style.pointList[2][1]-=i),!(n>0&&e[n]._rect.y>e[n-1]._rect.y+e[n-1]._rect.height));n--);}function r(e,t,i,n,a){for(var o,r,s,l=i[0],h=i[1],d=a>0?t?Number.MAX_VALUE:0:t?Number.MAX_VALUE:0,c=0,m=e.length;m>c;c++)r=Math.abs(e[c]._rect.y-h),s=e[c]._radius-n,o=n+s>r?Math.sqrt((n+s+20)*(n+s+20)-Math.pow(e[c]._rect.y-h,2)):Math.abs(e[c]._rect.x+(a>0?0:e[c]._rect.width)-l),t&&o>=d&&(o=d-10),!t&&d>=o&&(o=d+10),e[c]._rect.x=e[c].style.x=l+o*a,e[c]._labelLine&&(e[c]._labelLine.style.pointList[2][0]=l+(o-5)*a,e[c]._labelLine.style.pointList[1][0]=l+(o-20)*a),d=o}e.sort(function(e,t){return e._rect.y-t._rect.y});for(var s,l=0,h=e.length,d=[],c=[],m=0;h>m;m++)s=e[m]._rect.y-l,0>s&&a(m,h,-s,n),l=e[m]._rect.y+e[m]._rect.height;this.zr.getHeight()-l<0&&o(h-1,l-this.zr.getHeight());for(var m=0;h>m;m++)e[m]._rect.y>=t[1]?c.push(e[m]):d.push(e[m]);r(c,!0,t,i,n),r(d,!1,t,i,n)},reformOption:function(e){var t=d.merge;return e=t(t(e||{},d.clone(this.ecTheme.pie||{})),d.clone(l.pie)),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),e.itemStyle.emphasis.label.textStyle=this.getTextStyle(e.itemStyle.emphasis.label.textStyle),this.z=e.z,this.zlevel=e.zlevel,e},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){s--,0===s&&t&&t()}for(var n=this.series,a={},o=0,r=e.length;r>o;o++)a[e[o][0]]=e[o];var s=0,h={},d={},c={},m=this.shapeList;this.shapeList=[];for(var p,u,g,V={},o=0,r=e.length;r>o;o++)p=e[o][0],u=e[o][2],g=e[o][3],n[p]&&n[p].type===l.CHART_TYPE_PIE&&(u?(g||(h[p+"_"+n[p].data.length]="delete"),V[p]=1):g?V[p]=0:(h[p+"_-1"]="delete",V[p]=-1),this._buildSinglePie(p));for(var U,y,o=0,r=this.shapeList.length;r>o;o++)switch(p=this.shapeList[o]._seriesIndex,U=this.shapeList[o]._dataIndex,y=p+"_"+U,this.shapeList[o].type){case"sector":h[y]=this.shapeList[o];break;case"text":d[y]=this.shapeList[o];break;case"polyline":c[y]=this.shapeList[o]}this.shapeList=[];for(var f,o=0,r=m.length;r>o;o++)if(p=m[o]._seriesIndex,a[p]){if(U=m[o]._dataIndex+V[p],y=p+"_"+U,f=h[y],!f)continue;if("sector"===m[o].type)"delete"!=f?(s++,this.zr.animate(m[o].id,"style").when(400,{startAngle:f.style.startAngle,endAngle:f.style.endAngle}).done(i).start()):(s++,this.zr.animate(m[o].id,"style").when(400,V[p]<0?{startAngle:m[o].style.startAngle}:{endAngle:m[o].style.endAngle}).done(i).start());else if("text"===m[o].type||"polyline"===m[o].type)if("delete"===f)this.zr.delShape(m[o].id);else switch(m[o].type){case"text":s++,f=d[y],this.zr.animate(m[o].id,"style").when(400,{x:f.style.x,y:f.style.y}).done(i).start();break;case"polyline":s++,f=c[y],this.zr.animate(m[o].id,"style").when(400,{pointList:f.style.pointList}).done(i).start()}}this.shapeList=m,s||t&&t()},onclick:function(e){var t=this.series;if(this.isClick&&e.target){this.isClick=!1;for(var i,n=e.target,a=n.style,o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),s=0,d=this.shapeList.length;d>s;s++)if(this.shapeList[s].id===n.id){if(o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),a._hasSelected)n.style.x=n.style._x,n.style.y=n.style._y,n.style._hasSelected=!1,this._selected[o][r]=!1;else{var m=((a.startAngle+a.endAngle)/2).toFixed(2)-0;n.style._hasSelected=!0,this._selected[o][r]=!0,n.style._x=n.style.x,n.style._y=n.style.y,i=this.query(t[o],"selectedOffset"),n.style.x+=c.cos(m,!0)*i,n.style.y-=c.sin(m,!0)*i}this.zr.modShape(n.id)}else this.shapeList[s].style._hasSelected&&"single"===this._selectedMode&&(o=h.get(this.shapeList[s],"seriesIndex"),r=h.get(this.shapeList[s],"dataIndex"),this.shapeList[s].style.x=this.shapeList[s].style._x,this.shapeList[s].style.y=this.shapeList[s].style._y,this.shapeList[s].style._hasSelected=!1,this._selected[o][r]=!1,this.zr.modShape(this.shapeList[s].id));this.messageCenter.dispatch(l.EVENT.PIE_SELECTED,e.event,{selected:this._selected,target:h.get(n,"name")},this.myChart),this.zr.refreshNextFrame()}}},d.inherits(t,i),e("../chart").define("pie",t),t}); -------------------------------------------------------------------------------- /build/dist/chart/radar.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/radar",["require","./base","zrender/shape/Polygon","../component/polar","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Polygon");e("../component/polar");var a=e("../config");a.radar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,polarIndex:0,itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid"}},emphasis:{label:{show:!1}}},symbolSize:2};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_RADAR,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._radarDataCounter=0;for(var e,t=this.series,i=this.component.legend,n=0,o=t.length;o>n;n++)t[n].type===a.CHART_TYPE_RADAR&&(this.serie=this.reformOption(t[n]),this.legendHoverLink=t[n].legendHoverLink||this.legendHoverLink,e=this.serie.name||"",this.selectedMap[e]=i?i.isSelected(e):!0,this.selectedMap[e]&&(this._queryTarget=[this.serie,this.option],this.deepQuery(this._queryTarget,"calculable")&&this._addDropBox(n),this._buildSingleRadar(n),this.buildMark(n)));this.addShapeList()},_buildSingleRadar:function(e){for(var t,i,n,a,o=this.component.legend,r=this.serie.data,s=this.deepQuery(this._queryTarget,"calculable"),l=0;lr;r++)n=this.getDataFromOption(t.value[r]),i="-"!=n?o.getVector(e,r,n):!1,i&&a.push(i);return a},_addSymbol:function(e,t,i,n,a){for(var r,s=this.series,l=this.component.polar,h=0,d=e.length;d>h;h++)r=this.getSymbolShape(this.deepMerge([s[n].data[i],s[n]]),n,s[n].data[i].value[h],h,l.getIndicatorText(a,h),e[h][0],e[h][1],this._symbol[this._radarDataCounter%this._symbol.length],t,"#fff","vertical"),r.zlevel=this.getZlevelBase(),r.z=this.getZBase()+1,o.set(r,"data",s[n].data[i]),o.set(r,"value",s[n].data[i].value),o.set(r,"dataIndex",i),o.set(r,"special",h),this.shapeList.push(r)},_addDataShape:function(e,t,i,a,r,l){var h=this.series,d=[i,this.serie],c=this.getItemStyleColor(this.deepQuery(d,"itemStyle.normal.color"),a,r,i),p=this.deepQuery(d,"itemStyle.normal.lineStyle.width"),m=this.deepQuery(d,"itemStyle.normal.lineStyle.type"),u=this.deepQuery(d,"itemStyle.normal.areaStyle.color"),g=this.deepQuery(d,"itemStyle.normal.areaStyle"),V={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:g?"both":"stroke",color:u||c||("string"==typeof t?s.alpha(t,.5):t),strokeColor:c||t,lineWidth:p,lineType:m},highlightStyle:{brushType:this.deepQuery(d,"itemStyle.emphasis.areaStyle")||g?"both":"stroke",color:this.deepQuery(d,"itemStyle.emphasis.areaStyle.color")||u||c||("string"==typeof t?s.alpha(t,.5):t),strokeColor:this.getItemStyleColor(this.deepQuery(d,"itemStyle.emphasis.color"),a,r,i)||c||t,lineWidth:this.deepQuery(d,"itemStyle.emphasis.lineStyle.width")||p,lineType:this.deepQuery(d,"itemStyle.emphasis.lineStyle.type")||m}};o.pack(V,h[a],a,i,r,i.name,this.component.polar.getIndicator(h[a].polarIndex)),l&&(V.draggable=!0,this.setCalculable(V)),V=new n(V),this.shapeList.push(V)},_addDropBox:function(e){var t=this.series,i=this.deepQuery(this._queryTarget,"polarIndex");if(!this._dropBoxList[i]){var n=this.component.polar.getDropBox(i);n.zlevel=this.getZlevelBase(),n.z=this.getZBase(),this.setCalculable(n),o.pack(n,t,e,void 0,-1),this.shapeList.push(n),this._dropBoxList[i]=!0}},ondragend:function(e,t){var i=this.series;if(this.isDragend&&e.target){var n=e.target,a=o.get(n,"seriesIndex"),r=o.get(n,"dataIndex");this.component.legend&&this.component.legend.del(i[a].data[r].name),i[a].data.splice(r,1),t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},ondrop:function(t,i){var n=this.series;if(this.isDrop&&t.target){var a,r,s=t.target,l=t.dragged,h=o.get(s,"seriesIndex"),d=o.get(s,"dataIndex"),c=this.component.legend;if(-1===d)a={value:o.get(l,"value"),name:o.get(l,"name")},n[h].data.push(a),c&&c.add(a.name,l.style.color||l.style.strokeColor);else{var p=e("../util/accMath");a=n[h].data[d],c&&c.del(a.name),a.name+=this.option.nameConnector+o.get(l,"name"),r=o.get(l,"value");for(var m=0;mh;h++)t=d.polar2cartesian(s,o*Math.PI/180+r*h),l.push({vector:[t[1],-t[0]]})},_getRadius:function(){var e=this.polar[this._index];return this.parsePercent(e.radius,Math.min(this.zr.getWidth(),this.zr.getHeight())/2)},_buildSpiderWeb:function(e){var t=this.polar[e],i=t.__ecIndicator,n=t.splitArea,a=t.splitLine,o=this.getCenter(e),r=t.splitNumber,s=a.lineStyle.color,l=a.lineStyle.width,h=a.show,d=this.deepQuery(this._queryTarget,"axisLine");this._addArea(i,r,o,n,s,l,h),d.show&&this._addLine(i,o,d)},_addAxisLabel:function(t){for(var i,a,o,r,a,s,l,d,c,p,m=e("../util/accMath"),u=this.polar[t],g=this.deepQuery(this._queryTarget,"indicator"),V=u.__ecIndicator,y=this.deepQuery(this._queryTarget,"splitNumber"),U=this.getCenter(t),f=0;f=x;x+=p+1)r=h.merge({},o),l=m.accAdd(s.min,m.accMul(s.step,x)),l="function"==typeof b?b(l):"string"==typeof b?b.replace("{a}","{a0}").replace("{a0}",l):this.numAddCommas(l),r.text=l,r.x=x*a[0]/y+Math.cos(d)*c+U[0],r.y=x*a[1]/y+Math.sin(d)*c+U[1],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:r,draggable:!1,hoverable:!1}))}},_buildText:function(e){for(var t,i,a,o,r,s,l,h=this.polar[e],d=h.__ecIndicator,c=this.deepQuery(this._queryTarget,"indicator"),p=this.getCenter(e),m=0,u=0,g=0;g0?"left":Math.round(t[0])<0?"right":"center",null==o.margin?t=this._mapVector(t,p,1.1):(s=o.margin,m=t[0]>0?s:-s,u=t[1]>0?s:-s,m=0===t[0]?0:m,u=0===t[1]?0:u,t=this._mapVector(t,p,1)),i.textAlign=a,i.x=t[0]+m,i.y=t[1]+u,r=o.rotate?[o.rotate/180*Math.PI,t[0],t[1]]:[0,0,0],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:i,draggable:!1,hoverable:!1,rotation:r})))},getIndicatorText:function(e,t){return this.polar[e]&&this.polar[e].__ecIndicator[t]&&this.polar[e].__ecIndicator[t].text},getDropBox:function(e){var t,i,e=e||0,n=this.polar[e],a=this.getCenter(e),o=n.__ecIndicator,r=o.length,s=[],l=n.type;if("polygon"==l){for(var h=0;r>h;h++)t=o[h].vector,s.push(this._mapVector(t,a,1.2));i=this._getShape(s,"fill","rgba(0,0,0,0)","",1)}else"circle"==l&&(i=this._getCircle("",1,1.2,a,"fill","rgba(0,0,0,0)"));return i},_addArea:function(e,t,i,n,a,o,r){for(var s,l,h,d,c=this.deepQuery(this._queryTarget,"type"),p=0;t>p;p++)l=(t-p)/t,r&&("polygon"==c?(d=this._getPointList(e,l,i),s=this._getShape(d,"stroke","",a,o)):"circle"==c&&(s=this._getCircle(a,o,l,i,"stroke")),this.shapeList.push(s)),n.show&&(h=(t-p-1)/t,this._addSplitArea(e,n,l,h,i,p))},_getCircle:function(e,t,i,n,a,o){var s=this._getRadius();return new r({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:s*i,brushType:a,strokeColor:e,lineWidth:t,color:o},hoverable:!1,draggable:!1})},_getRing:function(e,t,i,n){var a=this._getRadius();return new s({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:t*a,r0:i*a,color:e,brushType:"fill"},hoverable:!1,draggable:!1})},_getPointList:function(e,t,i){for(var n,a=[],o=e.length,r=0;o>r;r++)n=e[r].vector,a.push(this._mapVector(n,i,t));return a},_getShape:function(e,t,i,n,a){return new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:t,color:i,strokeColor:n,lineWidth:a},hoverable:!1,draggable:!1})},_addSplitArea:function(e,t,i,n,a,o){var r,s,l,h,d,c=e.length,p=t.areaStyle.color,m=[],c=e.length,u=this.deepQuery(this._queryTarget,"type");if("string"==typeof p&&(p=[p]),s=p.length,r=p[o%s],"polygon"==u)for(var g=0;c>g;g++)m=[],l=e[g].vector,h=e[(g+1)%c].vector,m.push(this._mapVector(l,a,i)),m.push(this._mapVector(l,a,n)),m.push(this._mapVector(h,a,n)),m.push(this._mapVector(h,a,i)),d=this._getShape(m,"fill",r,"",1),this.shapeList.push(d);else"circle"==u&&(d=this._getRing(r,i,n,a),this.shapeList.push(d))},_mapVector:function(e,t,i){return[e[0]*i+t[0],e[1]*i+t[1]]},getCenter:function(e){var e=e||0;return this.parseCenter(this.zr,this.polar[e].center)},_addLine:function(e,t,i){for(var n,a,o=e.length,r=i.lineStyle,s=r.color,l=r.width,h=r.type,d=0;o>d;d++)a=e[d].vector,n=this._getLine(t[0],t[1],a[0]+t[0],a[1]+t[1],s,l,h),this.shapeList.push(n)},_getLine:function(e,t,i,n,o,r,s){return new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:e,yStart:t,xEnd:i,yEnd:n,strokeColor:o,lineWidth:r,lineType:s},hoverable:!1})},_adjustIndicatorValue:function(t){for(var i,n,a,o=this.polar[t],r=this.deepQuery(this._queryTarget,"indicator"),s=r.length,l=o.__ecIndicator,h=this._getSeriesData(t),d=o.boundaryGap,c=o.splitNumber,p=o.scale,m=e("../util/smartSteps"),u=0;s>u;u++){if("number"==typeof r[u].max)i=r[u].max,n=r[u].min||0,a={max:i,min:n};else{var g=this._findValue(h,u,c,d);n=g.min,i=g.max}!p&&n>=0&&i>=0&&(n=0),!p&&0>=n&&0>=i&&(i=0);var V=m(n,i,c,a);l[u].value={min:V.min,max:V.max,step:V.step}}},_getSeriesData:function(e){for(var t,i,n,a=[],o=this.component.legend,r=0;ro||void 0===o)&&(o=e),(r>e||void 0===r)&&(r=e)}var o,r,s;if(e&&0!==e.length){if(1==e.length&&(r=0),1!=e.length)for(var l=0;l0?r=o/i:o/=i),{max:o,min:r}}},getVector:function(e,t,i){e=e||0,t=t||0;var n=this.polar[e].__ecIndicator;if(!(t>=n.length)){var a,o=this.polar[e].__ecIndicator[t],r=this.getCenter(e),s=o.vector,l=o.value.max,h=o.value.min;if("undefined"==typeof i)return r;switch(i){case"min":i=h;break;case"max":i=l;break;case"center":i=(l+h)/2}return a=l!=h?(i-h)/(l-h):.5,this._mapVector(s,r,a)}},isInside:function(e){var t=this.getNearestIndex(e);return t?t.polarIndex:-1},getNearestIndex:function(e){for(var t,i,n,a,o,r,s,l,h,c=0;ca[0])return{polarIndex:c,valueIndex:Math.floor((h+l/2)/l)%s}}},getIndicator:function(e){var e=e||0;return this.polar[e].indicator},refresh:function(e){e&&(this.option=e,this.polar=this.option.polar,this.series=this.option.series),this.clear(),this._buildShape()}},h.inherits(t,i),e("../component").define("polar",t),t}),define("echarts/util/coordinates",["require","zrender/tool/math"],function(e){function t(e,t){return[e*n.sin(t),e*n.cos(t)]}function i(e,t){return[Math.sqrt(e*e+t*t),Math.atan(t/e)]}var n=e("zrender/tool/math");return{polar2cartesian:t,cartesian2polar:i}}); -------------------------------------------------------------------------------- /build/dist/chart/tree.js: -------------------------------------------------------------------------------- 1 | define("echarts/chart/tree",["require","./base","../util/shape/Icon","zrender/shape/Image","zrender/shape/Line","zrender/shape/BezierCurve","../layout/Tree","../data/Tree","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=.618,a=e("../util/shape/Icon"),o=e("zrender/shape/Image"),r=e("zrender/shape/Line"),s=e("zrender/shape/BezierCurve"),l=e("../layout/Tree"),h=e("../data/Tree"),m=e("../config");m.tree={zlevel:1,z:2,calculable:!1,clickable:!0,rootLocation:{},orient:"vertical",symbol:"circle",symbolSize:20,nodePadding:30,layerPadding:100,itemStyle:{normal:{label:{show:!0},lineStyle:{width:1,color:"#777",type:"curve"}},emphasis:{}}};var V=e("../util/ecData"),U=(e("zrender/config"),e("zrender/tool/event"),e("zrender/tool/util"));return t.prototype={type:m.CHART_TYPE_TREE,_buildShape:function(e,t){var i=e.data[0];this.tree=h.fromOptionData(i.name,i.children),this.tree.root.data=i,this._setTreeShape(e),this.tree.traverse(function(i){this._buildItem(i,e,t),i.children.length>0&&this._buildLink(i,e)},this);var n=e.roam===!0||"move"===e.roam,a=e.roam===!0||"scale"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:n,zoomable:a}),(this.query("markPoint.effect.show")||this.query("markLine.effect.show"))&&this.zr.modLayer(m.EFFECT_ZLEVEL,{panable:n,zoomable:a}),this.addShapeList()},_buildItem:function(e,t,i){var n=[e.data,t],r=this.deepQuery(n,"symbol"),s=this.deepMerge(n,"itemStyle.normal")||{},l=this.deepMerge(n,"itemStyle.emphasis")||{},h=s.color||this.zr.getColor(),m=l.color||this.zr.getColor(),U=-e.layout.angle||0;e.id===this.tree.root.id&&(U=0);var d="right";Math.abs(U)>=Math.PI/2&&Math.abs(U)<3*Math.PI/2&&(U+=Math.PI,d="left");var p=[U,e.layout.position[0],e.layout.position[1]],c=new a({zlevel:this.getZlevelBase(),z:this.getZBase()+1,rotation:p,clickable:this.deepQuery(n,"clickable"),style:{x:e.layout.position[0]-.5*e.layout.width,y:e.layout.position[1]-.5*e.layout.height,width:e.layout.width,height:e.layout.height,iconType:r,color:h,brushType:"both",lineWidth:s.borderWidth,strokeColor:s.borderColor},highlightStyle:{color:m,lineWidth:l.borderWidth,strokeColor:l.borderColor}});c.style.iconType.match("image")&&(c.style.image=c.style.iconType.replace(new RegExp("^image:\\/\\/"),""),c=new o({rotation:p,style:c.style,highlightStyle:c.highlightStyle,clickable:c.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(n,"itemStyle.normal.label.show")&&(c.style.text=null==e.data.label?e.id:e.data.label,c.style.textPosition=this.deepQuery(n,"itemStyle.normal.label.position"),"radial"===t.orient&&"inside"!==c.style.textPosition&&(c.style.textPosition=d),c.style.textColor=this.deepQuery(n,"itemStyle.normal.label.textStyle.color"),c.style.textFont=this.getFont(this.deepQuery(n,"itemStyle.normal.label.textStyle")||{})),this.deepQuery(n,"itemStyle.emphasis.label.show")&&(c.highlightStyle.textPosition=this.deepQuery(n,"itemStyle.emphasis.label.position"),c.highlightStyle.textColor=this.deepQuery(n,"itemStyle.emphasis.label.textStyle.color"),c.highlightStyle.textFont=this.getFont(this.deepQuery(n,"itemStyle.emphasis.label.textStyle")||{})),V.pack(c,t,i,e.data,0,e.id),this.shapeList.push(c)},_buildLink:function(e,t){var i=t.itemStyle.normal.lineStyle;if("broken"===i.type)return void this._buildBrokenLine(e,i,t);for(var n=0;nr&&(t=r),r>n&&(n=r)}e.layout.position[0]=e.children.length>0?(t+n)/2:0;var s=this._layerOffsets[e.depth]||0;if(s>e.layout.position[0]){var l=s-e.layout.position[0];this._shiftSubtree(e,l);for(var a=e.depth+1;a=0&&(t.splice(i,1),e.parent=null)},t.prototype.traverse=function(e,t){e.call(t,this);for(var i=0;it&&(t=n.height)}this.height=t+1},t.prototype.getNodeById=function(e){if(this.id===e)return this;for(var t=0;tt.width||e.normal.label.y+U>t.height)&&(h=""):h="",e.emphasis.label.show?(s.x+u>t.width||s.y+y>t.height)&&(p=""):p="";var g={style:{textX:t.x+e.normal.label.x,textY:t.y+e.normal.label.y,text:h,textPosition:"specific",textColor:o.color,textFont:m},highlightStyle:{textX:t.x+e.emphasis.label.x,textY:t.y+e.emphasis.label.y,text:p,textColor:s.color,textPosition:"specific"}};return g},getLabelText:function(e,t,i){return i?"function"==typeof i?i.call(this.myChart,e,t):"string"==typeof i?(i=i.replace("{b}","{b0}").replace("{c}","{c0}"),i=i.replace("{b0}",e).replace("{c0}",t)):void 0:e},_buildChildrenTreemap:function(e,t,i,n){for(var a=i.width*i.height,o=0,r=[],l=0;l ":"")},V),clickable:!0,highlightStyle:p});m.set(u,"seriesIndex",t),m.set(u,"name",a[c]),i+=u.getRect(u.style).width,this.shapeList.push(u)}},__onclick:function(e){var t=e.target;if(t){var i=m.get(t,"seriesIndex"),n=m.get(t,"name"),a=this._treesMap[i],o=a.getNodeById(n);o&&o.children.length&&this._buildTreemap(o,i)}}},U.inherits(t,i),e("../chart").define("treemap",t),t}),define("echarts/layout/TreeMap",["require"],function(){function e(e){({x:e.x,y:e.y,width:e.width,height:e.height});this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height}return e.prototype.run=function(e){var t=[];return this._squarify(e,{x:this.x,y:this.y,width:this.width,height:this.height},t),t},e.prototype._squarify=function(e,t,i){var n="VERTICAL",a=t.width,o=t.height;t.widthl;l++)r[s].y+=r[l].height}var h={};if("VERTICAL"==n){for(var m=0;ml;l++){var h=i*e[l]/o;a.push({width:s,height:h})}return a},e.prototype._isFirstBetter=function(e,t){var i=e[0].height/e[0].width;i=i>1?1/i:i;var n=t[0].height/t[0].width;return n=n>1?1/n:n,Math.abs(i-1)<=Math.abs(n-1)?!0:!1},e}),define("echarts/data/Tree",["require","zrender/tool/util"],function(e){function t(e,t){this.id=e,this.depth=0,this.height=0,this.children=[],this.parent=null,this.data=t||null}function i(e){this.root=new t(e)}var n=e("zrender/tool/util");return t.prototype.add=function(e){var t=this.children;e.parent!==this&&(t.push(e),e.parent=this)},t.prototype.remove=function(e){var t=this.children,i=n.indexOf(t,e);i>=0&&(t.splice(i,1),e.parent=null)},t.prototype.traverse=function(e,t){e.call(t,this);for(var i=0;it&&(t=n.height)}this.height=t+1},t.prototype.getNodeById=function(e){if(this.id===e)return this;for(var t=0;ta[1].value?(t=this.zr.getHeight()/3,i=t*Math.sqrt(a[1].value)/Math.sqrt(a[0].value)):(i=this.zr.getHeight()/3,t=i*Math.sqrt(a[0].value)/Math.sqrt(a[1].value));var o=this.zr.getWidth()/2-t,r=(t+i)/2*Math.sqrt(a[2].value)/Math.sqrt((a[0].value+a[1].value)/2),s=t+i;0!==a[2].value&&(s=this._getCoincideLength(a[0].value,a[1].value,a[2].value,t,i,r,Math.abs(t-i),t+i));var l=o+s,h=this.zr.getHeight()/2;if(this._buildItem(e,0,a[0],o,h,t),this._buildItem(e,1,a[1],l,h,i),0!==a[2].value&&a[2].value!==a[0].value&&a[2].value!==a[1].value){var m=(t*t-i*i)/(2*s)+s/2,V=s/2-(t*t-i*i)/(2*s),U=Math.sqrt(t*t-m*m),d=0,p=0;a[0].value>a[1].value&&o+m>l&&(p=1),a[0].valuel&&(d=1),this._buildCoincideItem(e,2,a[2],o+m,h-U,h+U,t,i,d,p)}},_getCoincideLength:function(e,t,i,n,a,o,r,s){var l=(n*n-a*a)/(2*o)+o/2,h=o/2-(n*n-a*a)/(2*o),m=Math.acos(l/n),V=Math.acos(h/a),U=n*n*Math.PI,d=m*n*n-l*n*Math.sin(m)+V*a*a-h*a*Math.sin(V),p=d/U,c=i/e,u=Math.abs(p/c);return u>.999&&1.001>u?o:.999>=u?(s=o,o=(o+r)/2,this._getCoincideLength(e,t,i,n,a,o,r,s)):(r=o,o=(o+s)/2,this._getCoincideLength(e,t,i,n,a,o,r,s))},_buildItem:function(e,t,i,n,a,o){var r=this.series,l=r[e],h=this.getCircle(e,t,i,n,a,o);if(s.pack(h,l,e,i,t,i.name),this.shapeList.push(h),l.itemStyle.normal.label.show){var m=this.getLabel(e,t,i,n,a,o);s.pack(m,l,e,l.data[t],t,l.data[t].name),this.shapeList.push(m)}},_buildCoincideItem:function(e,t,i,n,a,r,l,h,m,V){var U=this.series,d=U[e],p=[i,d],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=c.color||this.zr.getColor(t),g=u.color||this.zr.getColor(t),b="M"+n+","+a+"A"+l+","+l+",0,"+m+",1,"+n+","+r+"A"+h+","+h+",0,"+V+",1,"+n+","+a,f={color:y,path:b},k={zlevel:d.zlevel,z:d.z,style:f,highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};k=new o(k),k.buildPathArray&&(k.style.pathArray=k.buildPathArray(f.path)),s.pack(k,U[e],0,i,t,i.name),this.shapeList.push(k)},getCircle:function(e,t,i,n,o,r){var s=this.series[e],l=[i,s],h=this.deepMerge(l,"itemStyle.normal")||{},m=this.deepMerge(l,"itemStyle.emphasis")||{},V=h.color||this.zr.getColor(t),U=m.color||this.zr.getColor(t),d={zlevel:s.zlevel,z:s.z,clickable:!0,style:{x:n,y:o,r:r,brushType:"fill",opacity:1,color:V},highlightStyle:{color:U,lineWidth:m.borderWidth,strokeColor:m.borderColor}};return this.deepQuery([i,s,this.option],"calculable")&&(this.setCalculable(d),d.draggable=!0),new a(d)},getLabel:function(e,t,i,a,o,r){var s=this.series[e],l=s.itemStyle,h=[i,s],m=this.deepMerge(h,"itemStyle.normal")||{},V="normal",U=l[V].label,d=U.textStyle||{},p=this.getLabelText(t,i,V),c=this.getFont(d),u=m.color||this.zr.getColor(t),y=d.fontSize||12,g={zlevel:s.zlevel,z:s.z,style:{x:a,y:o-r-y,color:d.color||u,text:p,textFont:c,textAlign:"center"}};return new n(g)},getLabelText:function(e,t,i){var n=this.series,a=n[0],o=this.deepQuery([t,a],"itemStyle."+i+".label.formatter");return o?"function"==typeof o?o(a.name,t.name,t.value):"string"==typeof o?(o=o.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}"),o=o.replace("{a0}",a.name).replace("{b0}",t.name).replace("{c0}",t.value)):void 0:t.name},refresh:function(e){e&&(this.option=e,this.series=e.series),this._buildShape()}},l.inherits(t,i),e("../chart").define("venn",t),t}),define("zrender/shape/Path",["require","./Base","./util/PathProxy","../tool/util"],function(e){var t=e("./Base"),i=e("./util/PathProxy"),n=i.PathSegment,a=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},o=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(a(e)*a(t))},r=function(e,t){return(e[0]*t[1]0&&""===d[0]&&d.shift();for(var p=0;p0&&!isNaN(d[0]);){var c,u,y,g,b,f,k,_,x=null,L=[],W=h,X=m;switch(U){case"l":h+=d.shift(),m+=d.shift(),x="L",L.push(h,m);break;case"L":h=d.shift(),m=d.shift(),L.push(h,m);break;case"m":h+=d.shift(),m+=d.shift(),x="M",L.push(h,m),U="l";break;case"M":h=d.shift(),m=d.shift(),x="M",L.push(h,m),U="L";break;case"h":h+=d.shift(),x="L",L.push(h,m);break;case"H":h=d.shift(),x="L",L.push(h,m);break;case"v":m+=d.shift(),x="L",L.push(h,m);break;case"V":m=d.shift(),x="L",L.push(h,m);break;case"C":L.push(d.shift(),d.shift(),d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"c":L.push(h+d.shift(),m+d.shift(),h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),x="C",L.push(h,m);break;case"S":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,d.shift(),d.shift()),h=d.shift(),m=d.shift(),x="C",L.push(h,m);break;case"s":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),x="C",L.push(h,m);break;case"Q":L.push(d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"q":L.push(h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),x="Q",L.push(h,m);break;case"T":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h=d.shift(),m=d.shift(),x="Q",L.push(c,u,h,m);break;case"t":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h+=d.shift(),m+=d.shift(),x="Q",L.push(c,u,h,m);break;case"A":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),_=d.shift(),W=h,X=m,h=d.shift(),m=d.shift(),x="A",L=this._convertPoint(W,X,h,m,k,_,g,b,f);break;case"a":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),_=d.shift(),W=h,X=m,h+=d.shift(),m+=d.shift(),x="A",L=this._convertPoint(W,X,h,m,k,_,g,b,f)}for(var v=0,K=L.length;K>v;v+=2)L[v]+=t,L[v+1]+=i;l.push(new n(x||U,L))}("z"===U||"Z"===U)&&l.push(new n("z",[]))}return l},_convertPoint:function(e,t,i,n,a,s,l,h,m){var V=m*(Math.PI/180),U=Math.cos(V)*(e-i)/2+Math.sin(V)*(t-n)/2,d=-1*Math.sin(V)*(e-i)/2+Math.cos(V)*(t-n)/2,p=U*U/(l*l)+d*d/(h*h);p>1&&(l*=Math.sqrt(p),h*=Math.sqrt(p));var c=Math.sqrt((l*l*h*h-l*l*d*d-h*h*U*U)/(l*l*d*d+h*h*U*U));a===s&&(c*=-1),isNaN(c)&&(c=0);var u=c*l*d/h,y=c*-h*U/l,g=(e+i)/2+Math.cos(V)*u-Math.sin(V)*y,b=(t+n)/2+Math.sin(V)*u+Math.cos(V)*y,f=r([1,0],[(U-u)/l,(d-y)/h]),k=[(U-u)/l,(d-y)/h],_=[(-1*U-u)/l,(-1*d-y)/h],x=r(k,_);return o(k,_)<=-1&&(x=Math.PI),o(k,_)>=1&&(x=0),0===s&&x>0&&(x-=2*Math.PI),1===s&&0>x&&(x+=2*Math.PI),[g,b,l,h,f,x,V,s]},buildPath:function(e,t){var i=t.path,n=t.x||0,a=t.y||0;t.pathArray=t.pathArray||this.buildPathArray(i,n,a);for(var o=t.pathArray,r=t.pointList=[],s=[],l=0,h=o.length;h>l;l++){"M"==o[l].command.toUpperCase()&&(s.length>0&&r.push(s),s=[]);for(var m=o[l].points,V=0,U=m.length;U>V;V+=2)s.push([m[V],m[V+1]])}s.length>0&&r.push(s);for(var l=0,h=o.length;h>l;l++){var d=o[l].command,m=o[l].points;switch(d){case"L":e.lineTo(m[0],m[1]);break;case"M":e.moveTo(m[0],m[1]);break;case"C":e.bezierCurveTo(m[0],m[1],m[2],m[3],m[4],m[5]);break;case"Q":e.quadraticCurveTo(m[0],m[1],m[2],m[3]);break;case"A":var p=m[0],c=m[1],u=m[2],y=m[3],g=m[4],b=m[5],f=m[6],k=m[7],_=u>y?u:y,x=u>y?1:u/y,L=u>y?y/u:1;e.translate(p,c),e.rotate(f),e.scale(x,L),e.arc(0,0,_,g,g+b,1-k),e.scale(1/x,1/L),e.rotate(-f),e.translate(-p,-c);break;case"z":e.closePath()}}},getRect:function(e){if(e.__rect)return e.__rect;var t;t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0;for(var i=Number.MAX_VALUE,n=Number.MIN_VALUE,a=Number.MAX_VALUE,o=Number.MIN_VALUE,r=e.x||0,s=e.y||0,l=e.pathArray||this.buildPathArray(e.path),h=0;hn&&(n=m[V])):(m[V]+so&&(o=m[V]));var U;return U=i===Number.MAX_VALUE||n===Number.MIN_VALUE||a===Number.MAX_VALUE||o===Number.MIN_VALUE?{x:0,y:0,width:0,height:0}:{x:Math.round(i-t/2),y:Math.round(a-t/2),width:n-i+t,height:o-a+t},e.__rect=U,U}},e("../tool/util").inherits(s,t),s}); -------------------------------------------------------------------------------- /build/echarts-optimize-conf.js: -------------------------------------------------------------------------------- 1 | exports.modules = { 2 | main: { 3 | name: 'echarts/echarts', 4 | includeShallow: [ 5 | 'echarts/component/dataRange' 6 | ] 7 | }, 8 | parts: [ 9 | {name: 'echarts/chart/line', weight: 100}, 10 | {name: 'echarts/chart/bar', weight: 100}, 11 | {name: 'echarts/chart/scatter', weight: 90}, 12 | {name: 'echarts/chart/k', weight: 30}, 13 | {name: 'echarts/chart/pie', weight: 90}, 14 | {name: 'echarts/chart/radar', weight: 30}, 15 | {name: 'echarts/chart/chord', weight: 30}, 16 | {name: 'echarts/chart/force', weight: 30}, 17 | { 18 | name: 'echarts/chart/map', 19 | weight: 90, 20 | includeShallow: [ 21 | 'echarts/util/mapData/geoJson/an_hui_geo', 22 | 'echarts/util/mapData/geoJson/ao_men_geo', 23 | 'echarts/util/mapData/geoJson/bei_jing_geo', 24 | 'echarts/util/mapData/geoJson/china_geo', 25 | 'echarts/util/mapData/geoJson/chong_qing_geo', 26 | 'echarts/util/mapData/geoJson/fu_jian_geo', 27 | 'echarts/util/mapData/geoJson/gan_su_geo', 28 | 'echarts/util/mapData/geoJson/guang_dong_geo', 29 | 'echarts/util/mapData/geoJson/guang_xi_geo', 30 | 'echarts/util/mapData/geoJson/gui_zhou_geo', 31 | 'echarts/util/mapData/geoJson/hai_nan_geo', 32 | 'echarts/util/mapData/geoJson/hei_long_jiang_geo', 33 | 'echarts/util/mapData/geoJson/he_bei_geo', 34 | 'echarts/util/mapData/geoJson/he_nan_geo', 35 | 'echarts/util/mapData/geoJson/hu_bei_geo', 36 | 'echarts/util/mapData/geoJson/hu_nan_geo', 37 | 'echarts/util/mapData/geoJson/jiang_su_geo', 38 | 'echarts/util/mapData/geoJson/jiang_xi_geo', 39 | 'echarts/util/mapData/geoJson/ji_lin_geo', 40 | 'echarts/util/mapData/geoJson/liao_ning_geo', 41 | 'echarts/util/mapData/geoJson/nei_meng_gu_geo', 42 | 'echarts/util/mapData/geoJson/ning_xia_geo', 43 | 'echarts/util/mapData/geoJson/qing_hai_geo', 44 | 'echarts/util/mapData/geoJson/shang_hai_geo', 45 | 'echarts/util/mapData/geoJson/shan_dong_geo', 46 | 'echarts/util/mapData/geoJson/shan_xi_1_geo', 47 | 'echarts/util/mapData/geoJson/shan_xi_2_geo', 48 | 'echarts/util/mapData/geoJson/si_chuan_geo', 49 | 'echarts/util/mapData/geoJson/tai_wan_geo', 50 | 'echarts/util/mapData/geoJson/tian_jin_geo', 51 | 'echarts/util/mapData/geoJson/world_geo', 52 | 'echarts/util/mapData/geoJson/xiang_gang_geo', 53 | 'echarts/util/mapData/geoJson/xin_jiang_geo', 54 | 'echarts/util/mapData/geoJson/xi_zang_geo', 55 | 'echarts/util/mapData/geoJson/yun_nan_geo', 56 | 'echarts/util/mapData/geoJson/zhe_jiang_geo' 57 | ] 58 | }, 59 | {name: 'echarts/chart/gauge', weight: 30}, 60 | {name: 'echarts/chart/funnel', weight: 30}, 61 | {name: 'echarts/chart/eventRiver', weight: 10}, 62 | {name: 'echarts/chart/venn', weight: 10}, 63 | {name: 'echarts/chart/treemap', weight: 10}, 64 | {name: 'echarts/chart/tree', weight: 10}, 65 | {name: 'echarts/chart/wordCloud', weight: 10}, 66 | {name: 'echarts/chart/heatmap', weight: 10, includeShallow: [ 67 | 'echarts/layer/heatmap' 68 | ]} 69 | ] 70 | }; 71 | 72 | exports.amd = { 73 | baseUrl: process.cwd(), 74 | packages: [ 75 | { 76 | name: 'echarts', 77 | location: '../src', 78 | main: 'echarts' 79 | }, 80 | { 81 | name: 'zrender', 82 | location: '../../zrender/src', 83 | main: 'zrender' 84 | } 85 | ] 86 | }; -------------------------------------------------------------------------------- /build/source/chart/eventRiver.js: -------------------------------------------------------------------------------- 1 | define('echarts/chart/eventRiver', [ 2 | 'require', 3 | './base', 4 | '../layout/eventRiver', 5 | 'zrender/shape/Polygon', 6 | '../component/axis', 7 | '../component/grid', 8 | '../component/dataZoom', 9 | '../config', 10 | '../util/ecData', 11 | '../util/date', 12 | 'zrender/tool/util', 13 | 'zrender/tool/color', 14 | '../chart' 15 | ], function (require) { 16 | var ChartBase = require('./base'); 17 | var eventRiverLayout = require('../layout/eventRiver'); 18 | var PolygonShape = require('zrender/shape/Polygon'); 19 | require('../component/axis'); 20 | require('../component/grid'); 21 | require('../component/dataZoom'); 22 | var ecConfig = require('../config'); 23 | ecConfig.eventRiver = { 24 | zlevel: 0, 25 | z: 2, 26 | clickable: true, 27 | legendHoverLink: true, 28 | itemStyle: { 29 | normal: { 30 | borderColor: 'rgba(0,0,0,0)', 31 | borderWidth: 1, 32 | label: { 33 | show: true, 34 | position: 'inside', 35 | formatter: '{b}' 36 | } 37 | }, 38 | emphasis: { 39 | borderColor: 'rgba(0,0,0,0)', 40 | borderWidth: 1, 41 | label: { show: true } 42 | } 43 | } 44 | }; 45 | var ecData = require('../util/ecData'); 46 | var ecDate = require('../util/date'); 47 | var zrUtil = require('zrender/tool/util'); 48 | var zrColor = require('zrender/tool/color'); 49 | function EventRiver(ecTheme, messageCenter, zr, option, myChart) { 50 | ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart); 51 | var self = this; 52 | self._ondragend = function () { 53 | self.isDragend = true; 54 | }; 55 | this.refresh(option); 56 | } 57 | EventRiver.prototype = { 58 | type: ecConfig.CHART_TYPE_EVENTRIVER, 59 | _buildShape: function () { 60 | var series = this.series; 61 | this.selectedMap = {}; 62 | this._dataPreprocessing(); 63 | var legend = this.component.legend; 64 | var eventRiverSeries = []; 65 | for (var i = 0; i < series.length; i++) { 66 | if (series[i].type === this.type) { 67 | series[i] = this.reformOption(series[i]); 68 | this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink; 69 | var serieName = series[i].name || ''; 70 | this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true; 71 | if (!this.selectedMap[serieName]) { 72 | continue; 73 | } 74 | this.buildMark(i); 75 | eventRiverSeries.push(this.series[i]); 76 | } 77 | } 78 | eventRiverLayout(eventRiverSeries, this._intervalX, this.component.grid.getArea()); 79 | this._drawEventRiver(); 80 | this.addShapeList(); 81 | }, 82 | _dataPreprocessing: function () { 83 | var series = this.series; 84 | var xAxis; 85 | var evolutionList; 86 | for (var i = 0, iLen = series.length; i < iLen; i++) { 87 | if (series[i].type === this.type) { 88 | xAxis = this.component.xAxis.getAxis(series[i].xAxisIndex || 0); 89 | for (var j = 0, jLen = series[i].data.length; j < jLen; j++) { 90 | evolutionList = series[i].data[j].evolution; 91 | for (var k = 0, kLen = evolutionList.length; k < kLen; k++) { 92 | evolutionList[k].timeScale = xAxis.getCoord(ecDate.getNewDate(evolutionList[k].time) - 0); 93 | evolutionList[k].valueScale = Math.pow(evolutionList[k].value, 0.8); 94 | } 95 | } 96 | } 97 | } 98 | this._intervalX = Math.round(this.component.grid.getWidth() / 40); 99 | }, 100 | _drawEventRiver: function () { 101 | var series = this.series; 102 | for (var i = 0; i < series.length; i++) { 103 | var serieName = series[i].name || ''; 104 | if (series[i].type === this.type && this.selectedMap[serieName]) { 105 | for (var j = 0; j < series[i].data.length; j++) { 106 | this._drawEventBubble(series[i].data[j], i, j); 107 | } 108 | } 109 | } 110 | }, 111 | _drawEventBubble: function (oneEvent, seriesIndex, dataIndex) { 112 | var series = this.series; 113 | var serie = series[seriesIndex]; 114 | var serieName = serie.name || ''; 115 | var data = serie.data[dataIndex]; 116 | var queryTarget = [ 117 | data, 118 | serie 119 | ]; 120 | var legend = this.component.legend; 121 | var defaultColor = legend ? legend.getColor(serieName) : this.zr.getColor(seriesIndex); 122 | var normal = this.deepMerge(queryTarget, 'itemStyle.normal') || {}; 123 | var emphasis = this.deepMerge(queryTarget, 'itemStyle.emphasis') || {}; 124 | var normalColor = this.getItemStyleColor(normal.color, seriesIndex, dataIndex, data) || defaultColor; 125 | var emphasisColor = this.getItemStyleColor(emphasis.color, seriesIndex, dataIndex, data) || (typeof normalColor === 'string' ? zrColor.lift(normalColor, -0.2) : normalColor); 126 | var pts = this._calculateControlPoints(oneEvent); 127 | var eventBubbleShape = { 128 | zlevel: serie.zlevel, 129 | z: serie.z, 130 | clickable: this.deepQuery(queryTarget, 'clickable'), 131 | style: { 132 | pointList: pts, 133 | smooth: 'spline', 134 | brushType: 'both', 135 | lineJoin: 'round', 136 | color: normalColor, 137 | lineWidth: normal.borderWidth, 138 | strokeColor: normal.borderColor 139 | }, 140 | highlightStyle: { 141 | color: emphasisColor, 142 | lineWidth: emphasis.borderWidth, 143 | strokeColor: emphasis.borderColor 144 | }, 145 | draggable: 'vertical', 146 | ondragend: this._ondragend 147 | }; 148 | eventBubbleShape = new PolygonShape(eventBubbleShape); 149 | this.addLabel(eventBubbleShape, serie, data, oneEvent.name); 150 | ecData.pack(eventBubbleShape, series[seriesIndex], seriesIndex, series[seriesIndex].data[dataIndex], dataIndex, series[seriesIndex].data[dataIndex].name); 151 | this.shapeList.push(eventBubbleShape); 152 | }, 153 | _calculateControlPoints: function (oneEvent) { 154 | var intervalX = this._intervalX; 155 | var posY = oneEvent.y; 156 | var evolution = oneEvent.evolution; 157 | var n = evolution.length; 158 | if (n < 1) { 159 | return; 160 | } 161 | var time = []; 162 | var value = []; 163 | for (var i = 0; i < n; i++) { 164 | time.push(evolution[i].timeScale); 165 | value.push(evolution[i].valueScale); 166 | } 167 | var pts = []; 168 | pts.push([ 169 | time[0], 170 | posY 171 | ]); 172 | var i = 0; 173 | for (i = 0; i < n - 1; i++) { 174 | pts.push([ 175 | (time[i] + time[i + 1]) / 2, 176 | value[i] / -2 + posY 177 | ]); 178 | } 179 | pts.push([ 180 | (time[i] + (time[i] + intervalX)) / 2, 181 | value[i] / -2 + posY 182 | ]); 183 | pts.push([ 184 | time[i] + intervalX, 185 | posY 186 | ]); 187 | pts.push([ 188 | (time[i] + (time[i] + intervalX)) / 2, 189 | value[i] / 2 + posY 190 | ]); 191 | for (i = n - 1; i > 0; i--) { 192 | pts.push([ 193 | (time[i] + time[i - 1]) / 2, 194 | value[i - 1] / 2 + posY 195 | ]); 196 | } 197 | return pts; 198 | }, 199 | ondragend: function (param, status) { 200 | if (!this.isDragend || !param.target) { 201 | return; 202 | } 203 | status.dragOut = true; 204 | status.dragIn = true; 205 | status.needRefresh = false; 206 | this.isDragend = false; 207 | }, 208 | refresh: function (newOption) { 209 | if (newOption) { 210 | this.option = newOption; 211 | this.series = newOption.series; 212 | } 213 | this.backupShapeList(); 214 | this._buildShape(); 215 | } 216 | }; 217 | zrUtil.inherits(EventRiver, ChartBase); 218 | require('../chart').define('eventRiver', EventRiver); 219 | return EventRiver; 220 | });define('echarts/layout/eventRiver', ['require'], function (require) { 221 | function eventRiverLayout(series, intervalX, area) { 222 | var space = 4; 223 | var scale = intervalX; 224 | function importanceSort(a, b) { 225 | var x = a.importance; 226 | var y = b.importance; 227 | return x > y ? -1 : x < y ? 1 : 0; 228 | } 229 | function indexOf(array, value) { 230 | if (array.indexOf) { 231 | return array.indexOf(value); 232 | } 233 | for (var i = 0, len = array.length; i < len; i++) { 234 | if (array[i] === value) { 235 | return i; 236 | } 237 | } 238 | return -1; 239 | } 240 | for (var i = 0; i < series.length; i++) { 241 | for (var j = 0; j < series[i].data.length; j++) { 242 | if (series[i].data[j].weight == null) { 243 | series[i].data[j].weight = 1; 244 | } 245 | var importance = 0; 246 | for (var k = 0; k < series[i].data[j].evolution.length; k++) { 247 | importance += series[i].data[j].evolution[k].valueScale; 248 | } 249 | series[i].data[j].importance = importance * series[i].data[j].weight; 250 | } 251 | series[i].data.sort(importanceSort); 252 | } 253 | for (var i = 0; i < series.length; i++) { 254 | if (series[i].weight == null) { 255 | series[i].weight = 1; 256 | } 257 | var importance = 0; 258 | for (var j = 0; j < series[i].data.length; j++) { 259 | importance += series[i].data[j].weight; 260 | } 261 | series[i].importance = importance * series[i].weight; 262 | } 263 | series.sort(importanceSort); 264 | var minTime = Number.MAX_VALUE; 265 | var maxTime = 0; 266 | for (var i = 0; i < series.length; i++) { 267 | for (var j = 0; j < series[i].data.length; j++) { 268 | for (var k = 0; k < series[i].data[j].evolution.length; k++) { 269 | var time = series[i].data[j].evolution[k].timeScale; 270 | minTime = Math.min(minTime, time); 271 | maxTime = Math.max(maxTime, time); 272 | } 273 | } 274 | } 275 | minTime = ~~minTime; 276 | maxTime = ~~maxTime; 277 | var flagForOffset = function () { 278 | var length = maxTime - minTime + 1 + ~~intervalX; 279 | if (length <= 0) { 280 | return [0]; 281 | } 282 | var result = []; 283 | while (length--) { 284 | result.push(0); 285 | } 286 | return result; 287 | }(); 288 | var flagForPos = flagForOffset.slice(0); 289 | var bubbleData = []; 290 | var totalMaxy = 0; 291 | var totalOffset = 0; 292 | for (var i = 0; i < series.length; i++) { 293 | for (var j = 0; j < series[i].data.length; j++) { 294 | var e = series[i].data[j]; 295 | e.time = []; 296 | e.value = []; 297 | var tmp; 298 | var maxy = 0; 299 | for (var k = 0; k < series[i].data[j].evolution.length; k++) { 300 | tmp = series[i].data[j].evolution[k]; 301 | e.time.push(tmp.timeScale); 302 | e.value.push(tmp.valueScale); 303 | maxy = Math.max(maxy, tmp.valueScale); 304 | } 305 | bubbleBound(e, intervalX, minTime); 306 | e.y = findLocation(flagForPos, e, function (e, index) { 307 | return e.ypx[index]; 308 | }); 309 | e._offset = findLocation(flagForOffset, e, function () { 310 | return space; 311 | }); 312 | totalMaxy = Math.max(totalMaxy, e.y + maxy); 313 | totalOffset = Math.max(totalOffset, e._offset); 314 | bubbleData.push(e); 315 | } 316 | } 317 | scaleY(bubbleData, area, totalMaxy, totalOffset); 318 | } 319 | function scaleY(bubbleData, area, maxY, offset) { 320 | var height = area.height; 321 | var offsetScale = offset / height > 0.5 ? 0.5 : 1; 322 | var yBase = area.y; 323 | var yScale = (area.height - offset) / maxY; 324 | for (var i = 0, length = bubbleData.length; i < length; i++) { 325 | var e = bubbleData[i]; 326 | e.y = yBase + yScale * e.y + e._offset * offsetScale; 327 | delete e.time; 328 | delete e.value; 329 | delete e.xpx; 330 | delete e.ypx; 331 | delete e._offset; 332 | var evolutionList = e.evolution; 333 | for (var k = 0, klen = evolutionList.length; k < klen; k++) { 334 | evolutionList[k].valueScale *= yScale; 335 | } 336 | } 337 | } 338 | function line(x0, y0, x1, y1) { 339 | if (x0 === x1) { 340 | throw new Error('x0 is equal with x1!!!'); 341 | } 342 | if (y0 === y1) { 343 | return function () { 344 | return y0; 345 | }; 346 | } 347 | var k = (y0 - y1) / (x0 - x1); 348 | var b = (y1 * x0 - y0 * x1) / (x0 - x1); 349 | return function (x) { 350 | return k * x + b; 351 | }; 352 | } 353 | function bubbleBound(e, intervalX, minX) { 354 | var space = ~~intervalX; 355 | var length = e.time.length; 356 | e.xpx = []; 357 | e.ypx = []; 358 | var i = 0; 359 | var x0 = 0; 360 | var x1 = 0; 361 | var y0 = 0; 362 | var y1 = 0; 363 | var newline; 364 | for (; i < length; i++) { 365 | x0 = ~~e.time[i]; 366 | y0 = e.value[i] / 2; 367 | if (i === length - 1) { 368 | x1 = x0 + space; 369 | y1 = 0; 370 | } else { 371 | x1 = ~~e.time[i + 1]; 372 | y1 = e.value[i + 1] / 2; 373 | } 374 | newline = line(x0, y0, x1, y1); 375 | for (var x = x0; x < x1; x++) { 376 | e.xpx.push(x - minX); 377 | e.ypx.push(newline(x)); 378 | } 379 | } 380 | e.xpx.push(x1 - minX); 381 | e.ypx.push(y1); 382 | } 383 | function findLocation(flags, e, yvalue) { 384 | var pos = 0; 385 | var length = e.xpx.length; 386 | var i = 0; 387 | var y; 388 | for (; i < length; i++) { 389 | y = yvalue(e, i); 390 | pos = Math.max(pos, y + flags[e.xpx[i]]); 391 | } 392 | for (i = 0; i < length; i++) { 393 | y = yvalue(e, i); 394 | flags[e.xpx[i]] = pos + y; 395 | } 396 | return pos; 397 | } 398 | return eventRiverLayout; 399 | }); -------------------------------------------------------------------------------- /build/source/chart/heatmap.js: -------------------------------------------------------------------------------- 1 | define('echarts/chart/heatmap', [ 2 | 'require', 3 | './base', 4 | '../layer/heatmap', 5 | '../config', 6 | '../util/ecData', 7 | 'zrender/tool/util', 8 | 'zrender/tool/color', 9 | 'zrender/shape/Image', 10 | '../chart' 11 | ], function (require) { 12 | var ChartBase = require('./base'); 13 | var HeatmapLayer = require('../layer/heatmap'); 14 | var ecConfig = require('../config'); 15 | var ecData = require('../util/ecData'); 16 | var zrUtil = require('zrender/tool/util'); 17 | var zrColor = require('zrender/tool/color'); 18 | var zrImage = require('zrender/shape/Image'); 19 | ecConfig.heatmap = { 20 | zlevel: 0, 21 | z: 2, 22 | clickable: true 23 | }; 24 | function Heatmap(ecTheme, messageCenter, zr, option, myChart) { 25 | ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart); 26 | this.refresh(option); 27 | } 28 | Heatmap.prototype = { 29 | type: ecConfig.CHART_TYPE_HEATMAP, 30 | refresh: function (newOption) { 31 | this.clear(); 32 | if (newOption) { 33 | this.option = newOption; 34 | this.series = newOption.series; 35 | } 36 | this._init(); 37 | }, 38 | _init: function () { 39 | var series = this.series; 40 | this.backupShapeList(); 41 | var len = series.length; 42 | for (var i = 0; i < len; ++i) { 43 | if (series[i].type === ecConfig.CHART_TYPE_HEATMAP) { 44 | series[i] = this.reformOption(series[i]); 45 | var layer = new HeatmapLayer(series[i]); 46 | var canvas = layer.getCanvas(series[i].data, this.zr.getWidth(), this.zr.getHeight()); 47 | var image = new zrImage({ 48 | position: [ 49 | 0, 50 | 0 51 | ], 52 | scale: [ 53 | 1, 54 | 1 55 | ], 56 | hoverable: this.option.hoverable, 57 | style: { 58 | x: 0, 59 | y: 0, 60 | image: canvas, 61 | width: canvas.width, 62 | height: canvas.height 63 | } 64 | }); 65 | this.shapeList.push(image); 66 | } 67 | } 68 | this.addShapeList(); 69 | } 70 | }; 71 | zrUtil.inherits(Heatmap, ChartBase); 72 | require('../chart').define('heatmap', Heatmap); 73 | return Heatmap; 74 | });define('echarts/layer/heatmap', ['require'], function (require) { 75 | var defaultOptions = { 76 | blurSize: 30, 77 | gradientColors: [ 78 | 'blue', 79 | 'cyan', 80 | 'lime', 81 | 'yellow', 82 | 'red' 83 | ], 84 | minAlpha: 0.05, 85 | valueScale: 1, 86 | opacity: 1 87 | }; 88 | var BRUSH_SIZE = 20; 89 | var GRADIENT_LEVELS = 256; 90 | function Heatmap(opt) { 91 | this.option = opt; 92 | if (opt) { 93 | for (var i in defaultOptions) { 94 | if (opt[i] !== undefined) { 95 | this.option[i] = opt[i]; 96 | } else { 97 | this.option[i] = defaultOptions[i]; 98 | } 99 | } 100 | } else { 101 | this.option = defaultOptions; 102 | } 103 | } 104 | Heatmap.prototype = { 105 | getCanvas: function (data, width, height) { 106 | var brush = this._getBrush(); 107 | var gradient = this._getGradient(); 108 | var r = BRUSH_SIZE + this.option.blurSize; 109 | var canvas = document.createElement('canvas'); 110 | canvas.width = width; 111 | canvas.height = height; 112 | var ctx = canvas.getContext('2d'); 113 | var len = data.length; 114 | for (var i = 0; i < len; ++i) { 115 | var p = data[i]; 116 | var x = p[0]; 117 | var y = p[1]; 118 | var value = p[2]; 119 | var alpha = Math.min(1, Math.max(value * this.option.valueScale || this.option.minAlpha, this.option.minAlpha)); 120 | ctx.globalAlpha = alpha; 121 | ctx.drawImage(brush, x - r, y - r); 122 | } 123 | var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 124 | var pixels = imageData.data; 125 | var len = pixels.length / 4; 126 | while (len--) { 127 | var id = len * 4 + 3; 128 | var alpha = pixels[id] / 256; 129 | var colorOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)); 130 | pixels[id - 3] = gradient[colorOffset * 4]; 131 | pixels[id - 2] = gradient[colorOffset * 4 + 1]; 132 | pixels[id - 1] = gradient[colorOffset * 4 + 2]; 133 | pixels[id] *= this.option.opacity; 134 | } 135 | ctx.putImageData(imageData, 0, 0); 136 | return canvas; 137 | }, 138 | _getBrush: function () { 139 | if (!this._brushCanvas) { 140 | this._brushCanvas = document.createElement('canvas'); 141 | var r = BRUSH_SIZE + this.option.blurSize; 142 | var d = r * 2; 143 | this._brushCanvas.width = d; 144 | this._brushCanvas.height = d; 145 | var ctx = this._brushCanvas.getContext('2d'); 146 | ctx.shadowOffsetX = d; 147 | ctx.shadowBlur = this.option.blurSize; 148 | ctx.shadowColor = 'black'; 149 | ctx.beginPath(); 150 | ctx.arc(-r, r, BRUSH_SIZE, 0, Math.PI * 2, true); 151 | ctx.closePath(); 152 | ctx.fill(); 153 | } 154 | return this._brushCanvas; 155 | }, 156 | _getGradient: function () { 157 | if (!this._gradientPixels) { 158 | var levels = GRADIENT_LEVELS; 159 | var canvas = document.createElement('canvas'); 160 | canvas.width = 1; 161 | canvas.height = levels; 162 | var ctx = canvas.getContext('2d'); 163 | var gradient = ctx.createLinearGradient(0, 0, 0, levels); 164 | var len = this.option.gradientColors.length; 165 | for (var i = 0; i < len; ++i) { 166 | if (typeof this.option.gradientColors[i] === 'string') { 167 | gradient.addColorStop((i + 1) / len, this.option.gradientColors[i]); 168 | } else { 169 | gradient.addColorStop(this.option.gradientColors[i].offset, this.option.gradientColors[i].color); 170 | } 171 | } 172 | ctx.fillStyle = gradient; 173 | ctx.fillRect(0, 0, 1, levels); 174 | this._gradientPixels = ctx.getImageData(0, 0, 1, levels).data; 175 | } 176 | return this._gradientPixels; 177 | } 178 | }; 179 | return Heatmap; 180 | });define('echarts/layer/heatmap', ['require'], function (require) { 181 | var defaultOptions = { 182 | blurSize: 30, 183 | gradientColors: [ 184 | 'blue', 185 | 'cyan', 186 | 'lime', 187 | 'yellow', 188 | 'red' 189 | ], 190 | minAlpha: 0.05, 191 | valueScale: 1, 192 | opacity: 1 193 | }; 194 | var BRUSH_SIZE = 20; 195 | var GRADIENT_LEVELS = 256; 196 | function Heatmap(opt) { 197 | this.option = opt; 198 | if (opt) { 199 | for (var i in defaultOptions) { 200 | if (opt[i] !== undefined) { 201 | this.option[i] = opt[i]; 202 | } else { 203 | this.option[i] = defaultOptions[i]; 204 | } 205 | } 206 | } else { 207 | this.option = defaultOptions; 208 | } 209 | } 210 | Heatmap.prototype = { 211 | getCanvas: function (data, width, height) { 212 | var brush = this._getBrush(); 213 | var gradient = this._getGradient(); 214 | var r = BRUSH_SIZE + this.option.blurSize; 215 | var canvas = document.createElement('canvas'); 216 | canvas.width = width; 217 | canvas.height = height; 218 | var ctx = canvas.getContext('2d'); 219 | var len = data.length; 220 | for (var i = 0; i < len; ++i) { 221 | var p = data[i]; 222 | var x = p[0]; 223 | var y = p[1]; 224 | var value = p[2]; 225 | var alpha = Math.min(1, Math.max(value * this.option.valueScale || this.option.minAlpha, this.option.minAlpha)); 226 | ctx.globalAlpha = alpha; 227 | ctx.drawImage(brush, x - r, y - r); 228 | } 229 | var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 230 | var pixels = imageData.data; 231 | var len = pixels.length / 4; 232 | while (len--) { 233 | var id = len * 4 + 3; 234 | var alpha = pixels[id] / 256; 235 | var colorOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)); 236 | pixels[id - 3] = gradient[colorOffset * 4]; 237 | pixels[id - 2] = gradient[colorOffset * 4 + 1]; 238 | pixels[id - 1] = gradient[colorOffset * 4 + 2]; 239 | pixels[id] *= this.option.opacity; 240 | } 241 | ctx.putImageData(imageData, 0, 0); 242 | return canvas; 243 | }, 244 | _getBrush: function () { 245 | if (!this._brushCanvas) { 246 | this._brushCanvas = document.createElement('canvas'); 247 | var r = BRUSH_SIZE + this.option.blurSize; 248 | var d = r * 2; 249 | this._brushCanvas.width = d; 250 | this._brushCanvas.height = d; 251 | var ctx = this._brushCanvas.getContext('2d'); 252 | ctx.shadowOffsetX = d; 253 | ctx.shadowBlur = this.option.blurSize; 254 | ctx.shadowColor = 'black'; 255 | ctx.beginPath(); 256 | ctx.arc(-r, r, BRUSH_SIZE, 0, Math.PI * 2, true); 257 | ctx.closePath(); 258 | ctx.fill(); 259 | } 260 | return this._brushCanvas; 261 | }, 262 | _getGradient: function () { 263 | if (!this._gradientPixels) { 264 | var levels = GRADIENT_LEVELS; 265 | var canvas = document.createElement('canvas'); 266 | canvas.width = 1; 267 | canvas.height = levels; 268 | var ctx = canvas.getContext('2d'); 269 | var gradient = ctx.createLinearGradient(0, 0, 0, levels); 270 | var len = this.option.gradientColors.length; 271 | for (var i = 0; i < len; ++i) { 272 | if (typeof this.option.gradientColors[i] === 'string') { 273 | gradient.addColorStop((i + 1) / len, this.option.gradientColors[i]); 274 | } else { 275 | gradient.addColorStop(this.option.gradientColors[i].offset, this.option.gradientColors[i].color); 276 | } 277 | } 278 | ctx.fillStyle = gradient; 279 | ctx.fillRect(0, 0, 1, levels); 280 | this._gradientPixels = ctx.getImageData(0, 0, 1, levels).data; 281 | } 282 | return this._gradientPixels; 283 | } 284 | }; 285 | return Heatmap; 286 | }); -------------------------------------------------------------------------------- /build/source/chart/k.js: -------------------------------------------------------------------------------- 1 | define('echarts/chart/k', [ 2 | 'require', 3 | './base', 4 | '../util/shape/Candle', 5 | '../component/axis', 6 | '../component/grid', 7 | '../component/dataZoom', 8 | '../config', 9 | '../util/ecData', 10 | 'zrender/tool/util', 11 | '../chart' 12 | ], function (require) { 13 | var ChartBase = require('./base'); 14 | var CandleShape = require('../util/shape/Candle'); 15 | require('../component/axis'); 16 | require('../component/grid'); 17 | require('../component/dataZoom'); 18 | var ecConfig = require('../config'); 19 | ecConfig.k = { 20 | zlevel: 0, 21 | z: 2, 22 | clickable: true, 23 | hoverable: true, 24 | legendHoverLink: false, 25 | xAxisIndex: 0, 26 | yAxisIndex: 0, 27 | itemStyle: { 28 | normal: { 29 | color: '#fff', 30 | color0: '#00aa11', 31 | lineStyle: { 32 | width: 1, 33 | color: '#ff3200', 34 | color0: '#00aa11' 35 | }, 36 | label: { show: false } 37 | }, 38 | emphasis: { label: { show: false } } 39 | } 40 | }; 41 | var ecData = require('../util/ecData'); 42 | var zrUtil = require('zrender/tool/util'); 43 | function K(ecTheme, messageCenter, zr, option, myChart) { 44 | ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart); 45 | this.refresh(option); 46 | } 47 | K.prototype = { 48 | type: ecConfig.CHART_TYPE_K, 49 | _buildShape: function () { 50 | var series = this.series; 51 | this.selectedMap = {}; 52 | var _position2sIndexMap = { 53 | top: [], 54 | bottom: [] 55 | }; 56 | var xAxis; 57 | for (var i = 0, l = series.length; i < l; i++) { 58 | if (series[i].type === ecConfig.CHART_TYPE_K) { 59 | series[i] = this.reformOption(series[i]); 60 | this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink; 61 | xAxis = this.component.xAxis.getAxis(series[i].xAxisIndex); 62 | if (xAxis.type === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY) { 63 | _position2sIndexMap[xAxis.getPosition()].push(i); 64 | } 65 | } 66 | } 67 | for (var position in _position2sIndexMap) { 68 | if (_position2sIndexMap[position].length > 0) { 69 | this._buildSinglePosition(position, _position2sIndexMap[position]); 70 | } 71 | } 72 | this.addShapeList(); 73 | }, 74 | _buildSinglePosition: function (position, seriesArray) { 75 | var mapData = this._mapData(seriesArray); 76 | var locationMap = mapData.locationMap; 77 | var maxDataLength = mapData.maxDataLength; 78 | if (maxDataLength === 0 || locationMap.length === 0) { 79 | return; 80 | } 81 | this._buildHorizontal(seriesArray, maxDataLength, locationMap); 82 | for (var i = 0, l = seriesArray.length; i < l; i++) { 83 | this.buildMark(seriesArray[i]); 84 | } 85 | }, 86 | _mapData: function (seriesArray) { 87 | var series = this.series; 88 | var serie; 89 | var serieName; 90 | var legend = this.component.legend; 91 | var locationMap = []; 92 | var maxDataLength = 0; 93 | for (var i = 0, l = seriesArray.length; i < l; i++) { 94 | serie = series[seriesArray[i]]; 95 | serieName = serie.name; 96 | this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true; 97 | if (this.selectedMap[serieName]) { 98 | locationMap.push(seriesArray[i]); 99 | } 100 | maxDataLength = Math.max(maxDataLength, serie.data.length); 101 | } 102 | return { 103 | locationMap: locationMap, 104 | maxDataLength: maxDataLength 105 | }; 106 | }, 107 | _buildHorizontal: function (seriesArray, maxDataLength, locationMap) { 108 | var series = this.series; 109 | var seriesIndex; 110 | var serie; 111 | var xAxisIndex; 112 | var categoryAxis; 113 | var yAxisIndex; 114 | var valueAxis; 115 | var pointList = {}; 116 | var candleWidth; 117 | var data; 118 | var value; 119 | var barMaxWidth; 120 | for (var j = 0, k = locationMap.length; j < k; j++) { 121 | seriesIndex = locationMap[j]; 122 | serie = series[seriesIndex]; 123 | xAxisIndex = serie.xAxisIndex || 0; 124 | categoryAxis = this.component.xAxis.getAxis(xAxisIndex); 125 | candleWidth = serie.barWidth || Math.floor(categoryAxis.getGap() / 2); 126 | barMaxWidth = serie.barMaxWidth; 127 | if (barMaxWidth && barMaxWidth < candleWidth) { 128 | candleWidth = barMaxWidth; 129 | } 130 | yAxisIndex = serie.yAxisIndex || 0; 131 | valueAxis = this.component.yAxis.getAxis(yAxisIndex); 132 | pointList[seriesIndex] = []; 133 | for (var i = 0, l = maxDataLength; i < l; i++) { 134 | if (categoryAxis.getNameByIndex(i) == null) { 135 | break; 136 | } 137 | data = serie.data[i]; 138 | value = this.getDataFromOption(data, '-'); 139 | if (value === '-' || value.length != 4) { 140 | continue; 141 | } 142 | pointList[seriesIndex].push([ 143 | categoryAxis.getCoordByIndex(i), 144 | candleWidth, 145 | valueAxis.getCoord(value[0]), 146 | valueAxis.getCoord(value[1]), 147 | valueAxis.getCoord(value[2]), 148 | valueAxis.getCoord(value[3]), 149 | i, 150 | categoryAxis.getNameByIndex(i) 151 | ]); 152 | } 153 | } 154 | this._buildKLine(seriesArray, pointList); 155 | }, 156 | _buildKLine: function (seriesArray, pointList) { 157 | var series = this.series; 158 | var nLineWidth; 159 | var nLineColor; 160 | var nLineColor0; 161 | var nColor; 162 | var nColor0; 163 | var eLineWidth; 164 | var eLineColor; 165 | var eLineColor0; 166 | var eColor; 167 | var eColor0; 168 | var serie; 169 | var queryTarget; 170 | var data; 171 | var seriesPL; 172 | var singlePoint; 173 | var candleType; 174 | var seriesIndex; 175 | for (var sIdx = 0, len = seriesArray.length; sIdx < len; sIdx++) { 176 | seriesIndex = seriesArray[sIdx]; 177 | serie = series[seriesIndex]; 178 | seriesPL = pointList[seriesIndex]; 179 | if (this._isLarge(seriesPL)) { 180 | seriesPL = this._getLargePointList(seriesPL); 181 | } 182 | if (serie.type === ecConfig.CHART_TYPE_K && seriesPL != null) { 183 | queryTarget = serie; 184 | nLineWidth = this.query(queryTarget, 'itemStyle.normal.lineStyle.width'); 185 | nLineColor = this.query(queryTarget, 'itemStyle.normal.lineStyle.color'); 186 | nLineColor0 = this.query(queryTarget, 'itemStyle.normal.lineStyle.color0'); 187 | nColor = this.query(queryTarget, 'itemStyle.normal.color'); 188 | nColor0 = this.query(queryTarget, 'itemStyle.normal.color0'); 189 | eLineWidth = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.width'); 190 | eLineColor = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color'); 191 | eLineColor0 = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color0'); 192 | eColor = this.query(queryTarget, 'itemStyle.emphasis.color'); 193 | eColor0 = this.query(queryTarget, 'itemStyle.emphasis.color0'); 194 | for (var i = 0, l = seriesPL.length; i < l; i++) { 195 | singlePoint = seriesPL[i]; 196 | data = serie.data[singlePoint[6]]; 197 | queryTarget = data; 198 | candleType = singlePoint[3] < singlePoint[2]; 199 | this.shapeList.push(this._getCandle(seriesIndex, singlePoint[6], singlePoint[7], singlePoint[0], singlePoint[1], singlePoint[2], singlePoint[3], singlePoint[4], singlePoint[5], candleType ? this.query(queryTarget, 'itemStyle.normal.color') || nColor : this.query(queryTarget, 'itemStyle.normal.color0') || nColor0, this.query(queryTarget, 'itemStyle.normal.lineStyle.width') || nLineWidth, candleType ? this.query(queryTarget, 'itemStyle.normal.lineStyle.color') || nLineColor : this.query(queryTarget, 'itemStyle.normal.lineStyle.color0') || nLineColor0, candleType ? this.query(queryTarget, 'itemStyle.emphasis.color') || eColor || nColor : this.query(queryTarget, 'itemStyle.emphasis.color0') || eColor0 || nColor0, this.query(queryTarget, 'itemStyle.emphasis.lineStyle.width') || eLineWidth || nLineWidth, candleType ? this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color') || eLineColor || nLineColor : this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color0') || eLineColor0 || nLineColor0)); 200 | } 201 | } 202 | } 203 | }, 204 | _isLarge: function (singlePL) { 205 | return singlePL[0][1] < 0.5; 206 | }, 207 | _getLargePointList: function (singlePL) { 208 | var total = this.component.grid.getWidth(); 209 | var len = singlePL.length; 210 | var newList = []; 211 | for (var i = 0; i < total; i++) { 212 | newList[i] = singlePL[Math.floor(len / total * i)]; 213 | } 214 | return newList; 215 | }, 216 | _getCandle: function (seriesIndex, dataIndex, name, x, width, y0, y1, y2, y3, nColor, nLinewidth, nLineColor, eColor, eLinewidth, eLineColor) { 217 | var series = this.series; 218 | var serie = series[seriesIndex]; 219 | var data = serie.data[dataIndex]; 220 | var queryTarget = [ 221 | data, 222 | serie 223 | ]; 224 | var itemShape = { 225 | zlevel: serie.zlevel, 226 | z: serie.z, 227 | clickable: this.deepQuery(queryTarget, 'clickable'), 228 | hoverable: this.deepQuery(queryTarget, 'hoverable'), 229 | style: { 230 | x: x, 231 | y: [ 232 | y0, 233 | y1, 234 | y2, 235 | y3 236 | ], 237 | width: width, 238 | color: nColor, 239 | strokeColor: nLineColor, 240 | lineWidth: nLinewidth, 241 | brushType: 'both' 242 | }, 243 | highlightStyle: { 244 | color: eColor, 245 | strokeColor: eLineColor, 246 | lineWidth: eLinewidth 247 | }, 248 | _seriesIndex: seriesIndex 249 | }; 250 | itemShape = this.addLabel(itemShape, serie, data, name); 251 | ecData.pack(itemShape, serie, seriesIndex, data, dataIndex, name); 252 | itemShape = new CandleShape(itemShape); 253 | return itemShape; 254 | }, 255 | getMarkCoord: function (seriesIndex, mpData) { 256 | var serie = this.series[seriesIndex]; 257 | var xAxis = this.component.xAxis.getAxis(serie.xAxisIndex); 258 | var yAxis = this.component.yAxis.getAxis(serie.yAxisIndex); 259 | return [ 260 | typeof mpData.xAxis != 'string' && xAxis.getCoordByIndex ? xAxis.getCoordByIndex(mpData.xAxis || 0) : xAxis.getCoord(mpData.xAxis || 0), 261 | typeof mpData.yAxis != 'string' && yAxis.getCoordByIndex ? yAxis.getCoordByIndex(mpData.yAxis || 0) : yAxis.getCoord(mpData.yAxis || 0) 262 | ]; 263 | }, 264 | refresh: function (newOption) { 265 | if (newOption) { 266 | this.option = newOption; 267 | this.series = newOption.series; 268 | } 269 | this.backupShapeList(); 270 | this._buildShape(); 271 | }, 272 | addDataAnimation: function (params, done) { 273 | var series = this.series; 274 | var aniMap = {}; 275 | for (var i = 0, l = params.length; i < l; i++) { 276 | aniMap[params[i][0]] = params[i]; 277 | } 278 | var x; 279 | var dx; 280 | var y; 281 | var serie; 282 | var seriesIndex; 283 | var dataIndex; 284 | var aniCount = 0; 285 | function animationDone() { 286 | aniCount--; 287 | if (aniCount === 0) { 288 | done && done(); 289 | } 290 | } 291 | for (var i = 0, l = this.shapeList.length; i < l; i++) { 292 | seriesIndex = this.shapeList[i]._seriesIndex; 293 | if (aniMap[seriesIndex] && !aniMap[seriesIndex][3]) { 294 | if (this.shapeList[i].type === 'candle') { 295 | dataIndex = ecData.get(this.shapeList[i], 'dataIndex'); 296 | serie = series[seriesIndex]; 297 | if (aniMap[seriesIndex][2] && dataIndex === serie.data.length - 1) { 298 | this.zr.delShape(this.shapeList[i].id); 299 | continue; 300 | } else if (!aniMap[seriesIndex][2] && dataIndex === 0) { 301 | this.zr.delShape(this.shapeList[i].id); 302 | continue; 303 | } 304 | dx = this.component.xAxis.getAxis(serie.xAxisIndex || 0).getGap(); 305 | x = aniMap[seriesIndex][2] ? dx : -dx; 306 | y = 0; 307 | aniCount++; 308 | this.zr.animate(this.shapeList[i].id, '').when(this.query(this.option, 'animationDurationUpdate'), { 309 | position: [ 310 | x, 311 | y 312 | ] 313 | }).done(animationDone).start(); 314 | } 315 | } 316 | } 317 | if (!aniCount) { 318 | done && done(); 319 | } 320 | } 321 | }; 322 | zrUtil.inherits(K, ChartBase); 323 | require('../chart').define('k', K); 324 | return K; 325 | }); -------------------------------------------------------------------------------- /graph_show.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /image/中兴事件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/TextGrapher/654613cc2fea1f7acd12ed48987d83d4d94551df/image/中兴事件.png -------------------------------------------------------------------------------- /image/同学杀人事件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/TextGrapher/654613cc2fea1f7acd12ed48987d83d4d94551df/image/同学杀人事件.png -------------------------------------------------------------------------------- /image/雷洋嫖娼事件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/TextGrapher/654613cc2fea1f7acd12ed48987d83d4d94551df/image/雷洋嫖娼事件.png -------------------------------------------------------------------------------- /image/魏则西事件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/TextGrapher/654613cc2fea1f7acd12ed48987d83d4d94551df/image/魏则西事件.png -------------------------------------------------------------------------------- /keywords_textrank.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | # File: textrank.py 4 | # Author: lhy 5 | # Date: 18-4-17 6 | 7 | import jieba.posseg as pseg 8 | from collections import defaultdict 9 | import sys 10 | 11 | '''textrank图算法''' 12 | class textrank_graph: 13 | def __init__(self): 14 | self.graph = defaultdict(list) 15 | self.d = 0.85 #d是阻尼系数,一般设置为0.85 16 | self.min_diff = 1e-5 #设定收敛阈值 17 | 18 | #添加节点之间的边 19 | def addEdge(self, start, end, weight): 20 | self.graph[start].append((start, end, weight)) 21 | self.graph[end].append((end, start, weight)) 22 | 23 | #节点排序 24 | def rank(self): 25 | #默认初始化权重 26 | weight_deafault = 1.0 / (len(self.graph) or 1.0) 27 | #nodeweight_dict, 存储节点的权重 28 | nodeweight_dict = defaultdict(float) 29 | #outsum,存储节点的出度权重 30 | outsum_node_dict = defaultdict(float) 31 | #根据图中的边,更新节点权重 32 | for node, out_edge in self.graph.items(): 33 | #是 [('是', '全国', 1), ('是', '调查', 1), ('是', '失业率', 1), ('是', '城镇', 1)] 34 | nodeweight_dict[node] = weight_deafault 35 | outsum_node_dict[node] = sum((edge[2] for edge in out_edge), 0.0) 36 | #初始状态下的textrank重要性权重 37 | sorted_keys = sorted(self.graph.keys()) 38 | #设定迭代次数, 39 | step_dict = [0] 40 | for step in range(1, 1000): 41 | for node in sorted_keys: 42 | s = 0 43 | #计算公式:(edge_weight/outsum_node_dict[edge_node])*node_weight[edge_node] 44 | for e in self.graph[node]: 45 | s += e[2] / outsum_node_dict[e[1]] * nodeweight_dict[e[1]] 46 | #计算公式:(1-d) + d*s 47 | nodeweight_dict[node] = (1 - self.d) + self.d * s 48 | step_dict.append(sum(nodeweight_dict.values())) 49 | 50 | if abs(step_dict[step] - step_dict[step - 1]) <= self.min_diff: 51 | break 52 | 53 | #利用Z-score进行权重归一化,也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。 54 | #先设定最大值与最小值均为系统存储的最大值和最小值 55 | (min_rank, max_rank) = (sys.float_info[0], sys.float_info[3]) 56 | for w in nodeweight_dict.values(): 57 | if w < min_rank: 58 | min_rank = w 59 | if w > max_rank: 60 | max_rank = w 61 | 62 | for n, w in nodeweight_dict.items(): 63 | nodeweight_dict[n] = (w - min_rank/10.0) / (max_rank - min_rank/10.0) 64 | 65 | return nodeweight_dict 66 | 67 | '''基于textrank图算法的关键词提取''' 68 | class TextRank: 69 | def __init__(self): 70 | self.candi_pos = ['n', 'v'] 71 | self.stop_pos = ['nt'] 72 | self.span = 5 73 | 74 | def extract_keywords(self, word_list, num_keywords): 75 | g = textrank_graph() 76 | cm = defaultdict(int) 77 | for i, word in enumerate(word_list): 78 | if word[1][0] in self.candi_pos and len(word[0]) > 1: 79 | for j in range(i + 1, i + self.span): 80 | if j >= len(word_list): 81 | break 82 | if word_list[j][1][0] not in self.candi_pos or word_list[j][1] in self.stop_pos or len(word_list[j][0]) < 2: 83 | continue 84 | pair = tuple((word[0], word_list[j][0])) 85 | cm[(pair)] += 1 86 | 87 | for terms, w in cm.items(): 88 | g.addEdge(terms[0], terms[1], w) 89 | nodes_rank = g.rank() 90 | nodes_rank = sorted(nodes_rank.items(), key=lambda asd:asd[1], reverse=True) 91 | 92 | return nodes_rank[:num_keywords] -------------------------------------------------------------------------------- /sentence_parser.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | # File: sentence_parser.py 4 | # Author: lhy 5 | # Date: 18-3-10 6 | import os 7 | from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer 8 | 9 | class LtpParser(): 10 | def __init__(self): 11 | LTP_DIR = "./ltp_data" 12 | self.segmentor = Segmentor() 13 | self.segmentor.load(os.path.join(LTP_DIR, "cws.model")) 14 | 15 | self.postagger = Postagger() 16 | self.postagger.load(os.path.join(LTP_DIR, "pos.model")) 17 | 18 | self.parser = Parser() 19 | self.parser.load(os.path.join(LTP_DIR, "parser.model")) 20 | 21 | self.recognizer = NamedEntityRecognizer() 22 | self.recognizer.load(os.path.join(LTP_DIR, "ner.model")) 23 | 24 | '''ltp基本操作''' 25 | def basic_parser(self, words): 26 | postags = list(self.postagger.postag(words)) 27 | netags = self.recognizer.recognize(words, postags) 28 | return postags, netags 29 | 30 | '''ltp获取词性''' 31 | def get_postag(self, words): 32 | return list(self.postagger.postag(words)) 33 | 34 | '''基于实体识别结果,整理输出实体列表''' 35 | def format_entity(self, words, netags, postags): 36 | name_entity_dist = {} 37 | name_entity_list = [] 38 | place_entity_list = [] 39 | organization_entity_list = [] 40 | ntag_E_Nh = "" 41 | ntag_E_Ni = "" 42 | ntag_E_Ns = "" 43 | index = 0 44 | for item in zip(words, netags): 45 | word = item[0] 46 | ntag = item[1] 47 | if ntag[0] != "O": 48 | if ntag[0] == "S": 49 | if ntag[-2:] == "Nh": 50 | name_entity_list.append(word+'_%s ' % index) 51 | elif ntag[-2:] == "Ni": 52 | organization_entity_list.append(word+'_%s ' % index) 53 | else: 54 | place_entity_list.append(word + '_%s ' % index) 55 | elif ntag[0] == "B": 56 | if ntag[-2:] == "Nh": 57 | ntag_E_Nh = ntag_E_Nh + word + '_%s ' % index 58 | elif ntag[-2:] == "Ni": 59 | ntag_E_Ni = ntag_E_Ni + word + '_%s ' % index 60 | else: 61 | ntag_E_Ns = ntag_E_Ns + word + '_%s ' % index 62 | elif ntag[0] == "I": 63 | if ntag[-2:] == "Nh": 64 | ntag_E_Nh = ntag_E_Nh + word + '_%s ' % index 65 | elif ntag[-2:] == "Ni": 66 | ntag_E_Ni = ntag_E_Ni + word + '_%s ' % index 67 | else: 68 | ntag_E_Ns = ntag_E_Ns + word + '_%s ' % index 69 | else: 70 | if ntag[-2:] == "Nh": 71 | ntag_E_Nh = ntag_E_Nh + word + '_%s ' % index 72 | name_entity_list.append(ntag_E_Nh) 73 | ntag_E_Nh = "" 74 | elif ntag[-2:] == "Ni": 75 | ntag_E_Ni = ntag_E_Ni + word + '_%s ' % index 76 | organization_entity_list.append(ntag_E_Ni) 77 | ntag_E_Ni = "" 78 | else: 79 | ntag_E_Ns = ntag_E_Ns + word + '_%s ' % index 80 | place_entity_list.append(ntag_E_Ns) 81 | ntag_E_Ns = "" 82 | index += 1 83 | name_entity_dist['nhs'] = self.modify_entity(name_entity_list, words, postags, 'nh') 84 | name_entity_dist['nis'] = self.modify_entity(organization_entity_list, words, postags, 'ni') 85 | name_entity_dist['nss'] = self.modify_entity(place_entity_list,words, postags, 'ns') 86 | return name_entity_dist 87 | 88 | '''entity修正,为rebuild_wordspostags做准备''' 89 | def modify_entity(self, entity_list, words, postags, tag): 90 | entity_modify = [] 91 | if entity_list: 92 | for entity in entity_list: 93 | entity_dict = {} 94 | subs = entity.split(' ')[:-1] 95 | start_index = subs[0].split('_')[1] 96 | end_index = subs[-1].split('_')[1] 97 | entity_dict['stat_index'] = start_index 98 | entity_dict['end_index'] = end_index 99 | if start_index == entity_dict['end_index']: 100 | consist = [words[int(start_index)] + '/' + postags[int(start_index)]] 101 | else: 102 | consist = [words[index] + '/' + postags[index] for index in range(int(start_index), int(end_index)+1)] 103 | entity_dict['consist'] = consist 104 | entity_dict['name'] = ''.join(tmp.split('_')[0] for tmp in subs) + '/' + tag 105 | entity_modify.append(entity_dict) 106 | return entity_modify 107 | 108 | '''基于命名实体识别,修正words,postags''' 109 | def rebuild_wordspostags(self, name_entity_dist, words, postags): 110 | pre = ' '.join([item[0] + '/' + item[1] for item in zip(words, postags)]) 111 | post = pre 112 | for et, infos in name_entity_dist.items(): 113 | if infos: 114 | for info in infos: 115 | post = post.replace(' '.join(info['consist']), info['name']) 116 | post = [word for word in post.split(' ') if len(word.split('/')) == 2 and word.split('/')[0]] 117 | words = [tmp.split('/')[0] for tmp in post] 118 | postags = [tmp.split('/')[1] for tmp in post] 119 | 120 | return words, postags 121 | 122 | '''依存关系格式化''' 123 | def syntax_parser(self, words, postags): 124 | arcs = self.parser.parse(words, postags) 125 | words = ['Root'] + words 126 | postags = ['w'] + postags 127 | tuples = list() 128 | for index in range(len(words)-1): 129 | arc_index = arcs[index].head 130 | arc_relation = arcs[index].relation 131 | tuples.append([index+1, words[index+1], postags[index+1], words[arc_index], postags[arc_index], arc_index, arc_relation]) 132 | 133 | return tuples 134 | 135 | '''为句子中的每个词语维护一个保存句法依存儿子节点的字典''' 136 | def build_parse_child_dict(self, words, postags, tuples): 137 | child_dict_list = list() 138 | for index, word in enumerate(words): 139 | child_dict = dict() 140 | for arc in tuples: 141 | if arc[3] == word: 142 | if arc[-1] in child_dict: 143 | child_dict[arc[-1]].append(arc) 144 | else: 145 | child_dict[arc[-1]] = [] 146 | child_dict[arc[-1]].append(arc) 147 | child_dict_list.append([word, postags[index], index, child_dict]) 148 | 149 | return child_dict_list 150 | 151 | '''parser主函数''' 152 | def parser_main(self, words, postags): 153 | tuples = self.syntax_parser(words, postags) 154 | child_dict_list = self.build_parse_child_dict(words, postags, tuples) 155 | return tuples, child_dict_list 156 | 157 | '''基础语言分析''' 158 | def basic_process(self, sentence): 159 | words = list(self.segmentor.segment(sentence)) 160 | postags, netags = self.basic_parser(words) 161 | name_entity_dist = self.format_entity(words, netags, postags) 162 | words, postags = self.rebuild_wordspostags(name_entity_dist, words, postags) 163 | return words, postags 164 | 165 | 166 | -------------------------------------------------------------------------------- /text_grapher.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | # File: crime_mining.py 4 | # Author: lhy 5 | # Date: 18-7-24 6 | 7 | from sentence_parser import * 8 | import re 9 | from collections import Counter 10 | from GraphShow import * 11 | from keywords_textrank import * 12 | 13 | '''事件挖掘''' 14 | class CrimeMining: 15 | def __init__(self): 16 | self.textranker = TextRank() 17 | self.parser = LtpParser() 18 | self.ners = ['nh', 'ni', 'ns'] 19 | self.ner_dict = { 20 | 'nh':'人物', 21 | 'ni':'机构', 22 | 'ns':'地名' 23 | } 24 | self.graph_shower = GraphShow() 25 | 26 | '''移除括号内的信息,去除噪声''' 27 | def remove_noisy(self, content): 28 | p1 = re.compile(r'([^)]*)') 29 | p2 = re.compile(r'\([^\)]*\)') 30 | return p2.sub('', p1.sub('', content)) 31 | 32 | '''收集命名实体''' 33 | def collect_ners(self, words, postags): 34 | ners = [] 35 | for index, pos in enumerate(postags): 36 | if pos in self.ners: 37 | ners.append(words[index] + '/' + pos) 38 | return ners 39 | 40 | '''对文章进行分句处理''' 41 | def seg_content(self, content): 42 | return [sentence for sentence in re.split(r'[??!!。;;::\n\r]', content) if sentence] 43 | 44 | '''对句子进行分词,词性标注处理''' 45 | def process_sent(self, sent): 46 | words, postags = self.parser.basic_process(sent) 47 | return words, postags 48 | 49 | '''构建实体之间的共现关系''' 50 | def collect_coexist(self, ner_sents, ners): 51 | co_list = [] 52 | for sent in ner_sents: 53 | words = [i[0] + '/' + i[1] for i in zip(sent[0], sent[1])] 54 | co_ners = set(ners).intersection(set(words)) 55 | co_info = self.combination(list(co_ners)) 56 | co_list += co_info 57 | if not co_list: 58 | return [] 59 | return {i[0]:i[1] for i in Counter(co_list).most_common()} 60 | 61 | '''列表全排列''' 62 | def combination(self, a): 63 | combines = [] 64 | if len(a) == 0: 65 | return [] 66 | for i in a: 67 | for j in a: 68 | if i == j: 69 | continue 70 | combines.append('@'.join([i, j])) 71 | return combines 72 | 73 | '''抽取出事件三元组''' 74 | def extract_triples(self, words, postags): 75 | svo = [] 76 | tuples, child_dict_list = self.parser.parser_main(words, postags) 77 | for tuple in tuples: 78 | rel = tuple[-1] 79 | if rel in ['SBV']: 80 | sub_wd = tuple[1] 81 | verb_wd = tuple[3] 82 | obj = self.complete_VOB(verb_wd, child_dict_list) 83 | subj = sub_wd 84 | verb = verb_wd 85 | if not obj: 86 | svo.append([subj, verb]) 87 | else: 88 | svo.append([subj, verb+obj]) 89 | return svo 90 | 91 | '''过滤出与命名实体相关的事件三元组''' 92 | def filter_triples(self, triples, ners): 93 | ner_triples = [] 94 | for ner in ners: 95 | for triple in triples: 96 | if ner in triple: 97 | ner_triples.append(triple) 98 | return ner_triples 99 | 100 | '''根据SBV找VOB''' 101 | def complete_VOB(self, verb, child_dict_list): 102 | for child in child_dict_list: 103 | wd = child[0] 104 | attr = child[3] 105 | if wd == verb: 106 | if 'VOB' not in attr: 107 | continue 108 | vob = attr['VOB'][0] 109 | obj = vob[1] 110 | return obj 111 | return '' 112 | 113 | '''对文章进行关键词挖掘''' 114 | def extract_keywords(self, words_list): 115 | return self.textranker.extract_keywords(words_list, 10) 116 | 117 | '''基于文章关键词,建立起实体与关键词之间的关系''' 118 | def rel_entity_keyword(self, ners, keyword, subsent): 119 | events = [] 120 | rels = [] 121 | sents = [] 122 | ners = [i.split('/')[0] for i in set(ners)] 123 | keyword = [i[0] for i in keyword] 124 | for sent in subsent: 125 | tmp = [] 126 | for wd in sent: 127 | if wd in ners + keyword: 128 | tmp.append(wd) 129 | if len(tmp) > 1: 130 | sents.append(tmp) 131 | for ner in ners: 132 | for sent in sents: 133 | if ner in sent: 134 | tmp = ['->'.join([ner, wd]) for wd in sent if wd in keyword and wd != ner and len(wd) > 1] 135 | if tmp: 136 | rels += tmp 137 | for e in set(rels): 138 | events.append([e.split('->')[0], e.split('->')[1]]) 139 | return events 140 | 141 | 142 | '''利用标点符号,将文章进行短句切分处理''' 143 | def seg_short_content(self, content): 144 | return [sentence for sentence in re.split(r'[,,??!!。;;::\n\r\t ]', content) if sentence] 145 | 146 | '''挖掘主控函数''' 147 | def main(self, content): 148 | if not content: 149 | return [] 150 | # 对文章进行去噪处理 151 | content = self.remove_noisy(content) 152 | # 对文章进行长句切分处理 153 | sents = self.seg_content(content) 154 | # 对文章进行短句切分处理 155 | subsents = self.seg_short_content(content) 156 | subsents_seg = [] 157 | # words_list存储整篇文章的词频信息 158 | words_list = [] 159 | # ner_sents保存具有命名实体的句子 160 | ner_sents = [] 161 | # ners保存命名实体 162 | ners = [] 163 | # triples保存主谓宾短语 164 | triples = [] 165 | # 存储文章事件 166 | events = [] 167 | for sent in subsents: 168 | words, postags = self.process_sent(sent) 169 | words_list += [[i[0], i[1]] for i in zip(words, postags)] 170 | subsents_seg.append([i[0] for i in zip(words, postags)]) 171 | ner = self.collect_ners(words, postags) 172 | if ner: 173 | triple = self.extract_triples(words, postags) 174 | if not triple: 175 | continue 176 | triples += triple 177 | ners += ner 178 | ner_sents.append([words, postags]) 179 | 180 | # 获取文章关键词, 并图谱组织, 这个可以做 181 | keywords = [i[0] for i in self.extract_keywords(words_list)] 182 | for keyword in keywords: 183 | name = keyword 184 | cate = '关键词' 185 | events.append([name, cate]) 186 | # 对三元组进行event构建,这个可以做 187 | for t in triples: 188 | if (t[0] in keywords or t[1] in keywords) and len(t[0]) > 1 and len(t[1]) > 1: 189 | events.append([t[0], t[1]]) 190 | 191 | # 获取文章词频信息话,并图谱组织,这个可以做 192 | word_dict = [i for i in Counter([i[0] for i in words_list if i[1][0] in ['n', 'v'] and len(i[0]) > 1]).most_common()][:10] 193 | for wd in word_dict: 194 | name = wd[0] 195 | cate = '高频词' 196 | events.append([name, cate]) 197 | 198 | # 获取全文命名实体,这个可以做 199 | ner_dict = {i[0]:i[1] for i in Counter(ners).most_common()} 200 | for ner in ner_dict: 201 | name = ner.split('/')[0] 202 | cate = self.ner_dict[ner.split('/')[1]] 203 | events.append([name, cate]) 204 | 205 | # 获取全文命名实体共现信息,构建事件共现网络 206 | co_dict = self.collect_coexist(ner_sents, list(ner_dict.keys())) 207 | co_events = [[i.split('@')[0].split('/')[0], i.split('@')[1].split('/')[0]] for i in co_dict] 208 | events += co_events 209 | #将关键词与实体进行关系抽取 210 | events_entity_keyword = self.rel_entity_keyword(ners, keywords, subsents_seg) 211 | events += events_entity_keyword 212 | #对事件网络进行图谱化展示 213 | self.graph_shower.create_page(events) 214 | 215 | 216 | content1 = ''' 217 | 新快报记者从广州警方获悉,2002年1月7日,广州番禺警方接到群众报警,称其朋友卢某(男)于1月6日凌晨失踪。民警随后在番禺区市桥街一出租屋内找到卢某,当时卢某已经死亡,身上财物丢失。案发后没多久,番禺警方就将涉嫌参与抢劫杀害卢某的其中三名嫌疑人耿某、胡某以及翁某(女)抓获归案,另有一名嫌疑人力天佑负案在逃。 218 | 据嫌疑人交代,2002年元旦过后,力天佑找到耿某和胡某,告知两人有一个“发财”的机会:力天佑发现卢某很有钱,密谋由翁某将卢某带回翁某租住的出租屋,力天佑等三人伺机进入出租屋抢劫。 219 | 案发当天,力天佑带着耿某和胡某先行进入翁某租住的出租屋内等待。晚上22时许,翁某带着卢某回到出租屋,一进入屋内,力天佑等三人合力将卢某推倒在床上,用手捂住卢某嘴巴,用绳索绑住卢某手脚。一番拳打脚踢之后,力天佑从卢某身上搜出两台手机和一个钱包,将其中一台手机给了耿某,又给了胡某一千元钱。眼见卢某因窒息而死,四人逃离了出租屋。 220 | 卢某的家人和朋友因为一直无法联系上卢某,多方找寻未果,向番禺警方报警。警方很快将翁某、耿某和胡某三人抓获,但狡猾的力天佑一直潜逃在外。 221 | ''' 222 | content2 = ''' 223 | 正义网白银6月12日电(陈昕)利用农村寺庙疏于管理的漏洞,屡屡偷窃香客捐献的香火钱,结果不慎遗失在寺庙里的身份证“出卖”了他。近日,经甘肃省平川区检察院提起公诉,法院以盗窃罪判处被告人张海永有期徒刑六个月,并处罚金2000元。 224 |   张海永曾因手头缺钱而去撬自动取款机,结果被行政拘留10日。2015年4月的一天,他来到平川区某村的一座寺庙,趁无人之际撬开殿内放置的功德箱,偷走了100元香火钱。之后,张海永一发不可收拾,2015年4月至2017年1月,先后7次在平川、中卫两地多座庙宇中实施盗窃,共盗走人民币1096元。 225 |   张海永自认为做得神不知鬼不觉,谁知天网恢恢疏而不漏,他不慎遗失在寺庙里的身份证将嫌疑指向了他。今年1月,张海永被抓获归案。 226 | ''' 227 | 228 | content3 = ''' 229 | 女子以开金店为由,将丈夫骗进传销窝点后,拿走手机不知去向。被民警解救后,男子觉得不可思议。近日,咸阳市公安局彩虹分局捣毁一传销窝点,解救被骗群众9人。 230 |   传销团伙人员构成多为亲戚和朋友 231 |   9月13日,咸阳市公安局彩虹分局西区派出所民警在日常走访调查中发现,辖区某小区121号楼经常有外地人频繁出入,疑似为一传销窝点。民警经过连日守候,发现涉及人员较多,根据掌握的情况,9月15日上午10时许,彩虹分局西区派出所民警全员出动,立即查处。 232 |   民警以查电表为名叫开门后,发现这户88平方米的房间里竟然住着7男2女,正在组织学习。他们均为外地口音,分别来自山东、湖南、湖北、广西等地。通过现场检查,证实确为一传销团伙。民警将现场所有人员带回派出所,现场查获收缴笔记本10余本,查获身份证16个。 233 |   经调查询问,该传销团伙以销售化妆品为名,采取拉人头入伙的方法,骗取亲友加入该团伙。凡拉人入伙购买一份价值2900元的化妆品,上线业务员即得525元,从主管、主任、经理、老总各级都按不同比例和份额“分红”,级别越高分红越多。该组织共骗2名女子和7名男子先后入伙,人员构成多为亲戚和朋友,且不在一处,一个地方人员互不认识,成员不停地处于流动状态,且组成人员具有很强的反侦查意识。 234 |   学习笔记记录要“敢突破、不要脸” 235 |   其中有一名湖南籍男子张某,是其妻子以开金店为名将其骗到咸阳,14日晚吃过饭后,妻子将他带至该处后便不知去向,还拿走了他的手机。在民警告知后,该男子感觉到十分震惊和不可思议。 236 |   民警介绍,在现场查获的学习笔记本上,记录着要以“旅游、找工作、干工程、谈朋友”等为借口,以“电话、书信、面对面和上门邀约”的方式,将“亲人、邻居、同学、同事等有责任心、事业心”的发展对象骗至传销窝点,通过“铺底、摸底、吸引、聊色”等交谈话题,“谈人生、谈理想、谈未来”,做到“敢突破、不要脸”,充满“孤独感、恐惧感、使命感、神秘感”,学会“接受、承受、享受”……“在说不出、解决不了的时候要转移话题…”“行业中正确的方式方法就是骗,骗等于技巧,技巧绝不等于骗…”等字眼,手段卑劣,触目惊心。 237 | ''' 238 | content4 = ''' 239 | 见公益组织设立的捐衣箱挡了自己的“财路”,便多次盗窃旧衣服卖钱。日前,经江西省贵溪市检察院提起公诉,法院以犯盗窃罪判处刘建清拘役五个月,并处罚金1000元。 240 | 241 |   刘建清曾因犯掩饰、隐瞒犯罪所得罪被判处有期徒刑六个月。出狱后,他以收购破烂及旧衣服为生。2016年6月,鹰潭市义工联合会、鹰潭市慈善总会联合发起了“衣旧有爱”公益项目,并联合鹰潭市某再生资源公司在贵溪市四冶生活小区等据点放置了爱心公益捐衣箱。由于设置了公益捐衣箱,刘建清收购衣物的生意受到影响,他便想到偷捐衣箱内衣服卖钱的伎俩。2016年8月至9月期间,刘建清先后三次至贵溪市四冶生活小区,采取破坏公益捐衣箱挂锁的方式,多次将4只捐衣箱内他人捐献的旧衣物全部盗走,后以每斤6角的价格卖给他人,非法获利180元。今年1月20日,刘建清被公安民警抓获。 242 | ''' 243 | 244 | content5 = ''' 245 | 正义网镇江9月5日电(通讯员喻瑶 杜希)通过网络二手平台发布虚假信息,利用低廉的价格吸引购买者,诱骗买家先付定金、再付全款,先后诈骗作案11起,涉案金额28200元。2017年7月27日,江苏省句容市人民检察院依法对王明、王晓明两人以涉嫌诈骗罪批准逮捕。 246 |   妻子患病缺钱治,心思一动起歪念 247 |   王明和王晓明系父子关系。 2016年2月,王明的妻子胡晓梅患上重病,前期到医院治疗已经花费了十几万元医疗费用,后期治疗更是个“无底洞”,因为家庭生活困难,夫妻二人就动起了诈骗赚钱的歪念。 248 |   2016年底,王明在湖南娄底路边买了11张外地的手机卡用于联络,又购买了9张通过别人名字的办理的银行卡用于收款,准备好作案工具后,妻子胡晓梅就开始在58同城这些二手交易平台上注册账号,发布各种便宜的虚假二手信息,一切准备就绪,他们静待“猎物”上钩。 249 |   先后作案11起 先骗定金再骗全款 250 |   因为胡晓梅在平台上发布的二手信息价格很低,货品质量看起来也不错,所以很快就有“顾客”上门,2017年1月11日,王明接到一个句容宝华人的电话,有意购买他在网络平台上发布的一辆价值3200元的二手车,为了迅速达成交易,王明伪装成卖车老板和买家开始谈价格,价格谈拢后,王明提出要先付定金,再送货上门的要求。当日,王明顺利骗到了100元定金。 251 |   第二天,王明按照初次双方谈好的送货地址,让自己的儿子王晓明假装成送货人,向被害人打电话,谎称把交易的货物运到了句容市某地,声称自己开的车是“黑车”,直接进行现金交易不太安全,让被害人张某把剩下的购车款打过来,先付钱再拿车,被害人张某立即通过某银行ATM机向王晓明支付了剩余的3100元。王晓明又开始索要其他费用,这时被害人张某已经觉察到了不对劲,不肯再付钱,王晓明就把号码拉黑,不再联系。 252 |   轻松到手的钱财,进一步引发了父子两人的贪欲。很快,王明的儿子王晓明就不再打工,而是加入父母,全家一起做专职诈骗的“买卖”。随着诈骗次数的增加,他们的诈骗手法也从单纯的收取定金和购车款发展出索要上牌费、安全保证金等多种形式。 253 |   一家人分工协作,王明负责伪装老板和取钱,王晓明假装送货,胡晓梅发布信息。2017年初至今,王明一家人共诈骗作案11起,涉案金额28200元。 254 |   受害人报警,父子两人终落法网 255 |   2017年4月3日,句容市公安局接到了被害人梁某某等人的报警电话,经过公安机关介入侦查,犯罪嫌疑人王明、王晓明于2017年6月6日被抓获归案。2017年7月21日,在句容市检察院检察官在依法对犯罪嫌疑人王明等人讯问过程中,王明在得知自己和儿子因触犯法律而将面临牢狱之灾时,后悔不已。 256 |   “近年来,检察机关在依法查办的多起诈骗案中发现,不法分子利用可乘之机,以多种方式实施不同的诈骗,作案手段多样化,让广大市民深受其害。检察机关将依法履行职能,对此类诈骗犯罪坚决打击,实现从快从速逮捕和审查起诉,同时检察官提醒广大市民,遇到不法侵害要及时报警。”承办检察官说。 257 | ''' 258 | content6 = ''' 259 |   5月7日20时许,昌平警方针对霍营街道某小区一足疗店存在卖淫嫖娼问题的线索,组织便衣警力前往开展侦查。 260 |   21时14分,民警发现雷某(男,29岁,家住附近)从该足疗店离开,立即跟进,亮明身份对其盘查。雷某试图逃跑,在激烈反抗中咬伤民警,并将民警所持视频拍摄设备打落摔坏,后被控制带上车。行驶中,雷某突然挣脱看管,从车后座窜至前排副驾驶位置,踢踹驾驶员迫使停车,打开车门逃跑,被再次控制。因雷某激烈反抗,为防止其再次脱逃,民警依法给其戴上手铐,并于21时45分带上车。在将雷某带回审查途中,发现其身体不适,情况异常,民警立即将其就近送往昌平区中西医结合医院,22时5分进入急诊救治。雷某经抢救无效于22时55分死亡。 261 |   当晚,民警在足疗店内将朱某(男,33岁,黑龙江省人)、俞某(女,38岁,安徽省人)、才某(女,26岁,青海省人)、刘某(女,36岁,四川省人)和张某(女,25岁,云南省人)等5名涉嫌违法犯罪人员抓获。经审查并依法提取、检验现场相关物证,证实雷某在足疗店内进行了嫖娼活动并支付200元嫖资。目前,上述人员已被昌平警方依法采取强制措施。 262 |   为进一步查明雷某死亡原因,征得家属同意后,将依法委托第三方在检察机关监督下进行尸检。 263 |   男子“涉嫌嫖娼死亡”,家属提多个疑点 要求公开执法记录视频 264 |   5月7日晚,中国人民大学环境学院2009级硕士研究生雷洋离家后身亡,昌平警方通报称,警方查处足疗店过程中,将“涉嫌嫖娼”的雷某控制并带回审查,此间雷某突然身体不适经抢救无效身亡。 265 |   面对雷洋的突然死亡,他的家人表示现在只看到了警方的一条官方微博,对于死因其中只有一句“该人突然身体不适”的简单描述,他们希望能够公布执法纪录仪视频,尽快还原真相。 266 |   由雷洋的同学发布的一份情况说明称,5月7日,由于雷洋夫妇刚得一女,其亲属欲来京探望,航班预计当晚23点30分到达。当晚21时左右,雷洋从家里出门去首都机场迎接亲属,之后雷洋失联。(来源:央视、新京报) 267 | 268 | ''' 269 | 270 | content7 = ''' 271 | 正文:荣荣出示的一本由涉事医院肿瘤科编制的书,列举滑膜肉瘤在内的42种癌症病人治疗好转的病例。新京报记者李相蓉摄 272 | 荣荣出示的一本由涉事医院肿瘤科编制的书,列举滑膜肉瘤在内的42种癌症病人治疗好转的病例。新京报记者李相蓉摄 273 | 昨日,武警北京总队第二医院仍然营业。新京报记者王嘉宁摄 274 | 原标题:联合调查组进驻百度查“魏则西事件” 275 | 新京报讯(记者李丹丹刘夏)昨日,国家互联网信息办公室发言人姜军发表谈话指出,近日“魏则西事件”受到网民广泛关注。根据网民举报,国家网信办会同国家工商总局、国家卫生计生委成立联合调查组进驻百度公司,对此事件及互联网企业依法经营事项进行调查并依法处理。百度对此回应称,欢迎调查组进驻并将全力配合。 276 | 国信办、工商总局等联合调查 277 | 据悉,联合调查组由国家网信办网络综合协调管理和执法督查局局长范力任组长,国家工商总局广告监管司、国家卫生计生委医政医管局及北京市网信办、工商局、卫生计生委等相关部门共同参加。联合调查组将适时公布调查和处理结果。 278 | 习近平总书记4月19日在网络安全与信息化工作座谈会上的讲话强调要增强互联网企业使命感、责任感。习近平强调,办网站的不能一味追求点击率,做搜索的不能仅以给钱的多少作为排位的标准。希望广大互联网企业坚持经济效益和社会效益统一,饮水思源,回报社会,造福人民。 279 | 百度三次回应“魏则西”事件 280 | 对于国家网信办成立联合调查组,百度公司昨日发布声明,表示欢迎并将全力配合主管部门调查,接受监督。 281 | 4月12日,西安电子科技大学21岁学生魏则西因滑膜肉瘤病逝。他去世前在知乎网站撰写治疗经过时称,在百度上搜索出武警某医院的生物免疫疗法,随后在该医院治疗后致病情耽误。此后了解到,该技术在美国已被淘汰。 282 | 百度4月28日对此回应称,(魏)则西生前通过电视媒体报道和百度搜索选择的武警北京总队第二医院(下称武警北京二院),百度第一时间进行了搜索结果审查,该医院是一家公立三甲医院,资质齐全。 283 | 百度5月1日再次回应网友魏则西病逝事件,称正积极向发证单位及武警总部相关部门递交审查申请函,希望相关部门能高度重视,立即展开调查。 284 | 涉事中心停诊有患者要求退钱 285 | 昨日,新京报记者从武警北京二院挂号处获悉,该院生物诊疗中心已经停诊,该中心工作人员证实此事,不回应记者任何问题。同时,有此前在该中心进行生物免疫疗法的肿瘤患者来到医院申请退款。医院有便衣安保人员提醒非患者及家属不要靠近门诊及住院楼。 286 | 生物诊疗中心昨日停诊 287 | 昨日中午,记者来到武警北京二院。院内西侧为6层高的门诊楼,内有外科、内科、肿瘤科、泌尿科等科室。而此次“魏则西”事件涉及的生物诊疗中心,则位于该院东侧的住院楼一层。 288 | 记者从该院挂号处了解到,每天上午11点为挂号截止时间,但医院已通知生物诊疗中心于昨日停止挂号,对于为何停诊何时复诊,该人员表示不清楚。 289 | 住院部一层北侧的生物诊疗中心分诊台不见护士身影。分诊台左侧即为生物诊疗中心一专家诊室,记者敲门后有护士开门,但表达已停诊后便立刻关门。诊室一旁还有包括细胞室在内的几扇房门,透过细胞室的房门玻璃可看到内有人影,但记者敲门后无人开门。 290 | 记者咨询该院急诊科医生及住院楼护士,均表示对生物诊疗中心停诊一事不清楚,并称未听说“魏则西”一事。 291 | 有患者获医院退款承诺 292 | 今年33岁的荣荣(化名)是一名恶性黑色素瘤患者。今年3月,在深圳打工的她觉得身体不适,去做妇科检查后,被告知患有囊肿。随后荣荣回到湖南常德老家,在当地医院做活检后,被确诊恶性黑色素瘤。 293 | “当时很紧张,就在网上查哪里看这个病好些。”荣荣介绍,4月20日,她通过百度搜索治疗恶性黑色素瘤的办法,发现前几条有推荐医院,并有网络客服人员可以咨询。 294 | “当时不止武警北京二院,有好几家,但我觉得部队上的医院靠谱,检索了一下,还发现它是三甲医院。”荣荣称,她向客服人员咨询后,对方建议她留下姓名及手机号,以方便沟通,并且可以帮忙预约专家。 295 | 不久之后,一名自称姚医生的人员打来电话,荣荣向对方表达了自己不想继续化疗的痛苦。“姚医生说,他们医院的生物诊疗中心的技术,是专门针对恶性黑色素瘤的。机器都是从美国进口的。”荣荣表示,热情的姚医生询问何时可以到京,在确定她的火车票时间后,姚医生称,已帮荣荣预约好了4月23日的专家李医生。 296 | “我询问了价格,姚医生在电话里说,先做一个疗程,不住院的话,价格在3.3万左右,住院价格在3.7万元,这与李医生所说的价格一致。”荣荣称,按照预约时间,她在23日上午九点到达医院,没有挂号,直接到达住院楼一层。“到后前面还有五六个人排队,有人是来治疗,也有人来咨询,我等了一个多小时才排到。”见到李医生后,荣荣被安排做了血常规等检查,当天下午2点,医生说她符合生物免疫疗法的治疗方案,付费3万元后,安排她到一个机器前,左右手都扎了一根针头,抽走60ml血液。 297 | 荣荣介绍,李医生所采用的方法,是先抽取一部分血液后,进行细胞分离,一周后再将新细胞输回体内。抽完血后,医生并未开其他口服药,“仅叮嘱心态放好。” 298 | 荣荣与母亲在附近的出租屋内等待一周后,昨日,母女俩回到医院,准备回输血时,医生却不在,专家诊室房门紧闭。一同等在门外的,还有一位从山东赶来的恶性黑色素瘤患者,该患者从网上看到“魏则西”的报道后,称自己经过两个疗程的治疗并无反应,要求医院返还最后一次检查的一万元费用。最终,医院答应返还该患者7千元,同时返还荣荣2.7万元,由于此前是刷卡付费,医院称15天后会将金额返还至荣荣卡内。 299 | 多名患者百度检索经推荐来就诊 300 | 同样进行细胞分离治疗的,还有来自北京的宋女士。宋女士介绍,今年3月,在体检中心体检后,发现自己为hpv83阳性(人乳头瘤病毒呈阳性)。在百度检索“hpv”关键词后,点击进入了排在前几位的一个网站。一个客服询问她有什么需要咨询,并称武警北京二院为治疗此方面最专业的医院。 301 | 宋女士到医院泌尿科检查后,科室大夫建议她做细胞移植,并称不移植就会得宫颈癌。“我当时都懵了,大夫都建议做细胞移植。” 302 | 当天,宋女士进行了包括艾滋、梅毒在内的多项检查,随后医生拿着化验单,建议宋女士做细胞分离。输了3天液,并做了3次光动力治疗后,医院为宋女士做了细胞分离,“两个手上各插一根针,机器嗡嗡响。”宋女士称,细胞分离结束后,医生建议她交20万做细胞移植手术,宋女士不同意,“医生称已经做分离,不继续的话会将已分离的细胞扔掉。” 303 | 昨日,记者在该医院8楼住院部见到了患了颜面播散性粟粒狼疮的张女士。张女士脸部起红色疹子已有三年,此前在301、协和等医院治疗过,均未痊愈。前几日,她通过百度检索后,留下姓名电话,随后有客服人员打电话,说建议来武警北京二院检查,不然会越来越严重。 304 | 客服人员替张女士预约专家号后,5月1日,张女士来到医院检查。“我刚来,他们让我做了血液和彩超等检查后,就说我这个病严重,要立马住院。”张女士称,交了三千押金后,医生建议她去医院外的药店买一种治疗此病的软膏,此后截至昨日下午,再没有进行其他治疗。住院后在网络上看到“魏则西”事件后,很担心自己也遇到医托,心里很慌。新京报记者李相蓉 305 | 病例集称治疗后大多好转 306 | 荣荣介绍,除了检查外,医院还给了她一本名为“肿瘤生物技术病例集”的书,有一百多页厚,封面显示主编为李志亮、温洪泽、郭跃生三名医生。 307 | 媒体报道称,魏则西父亲受访时表示主治医师为李志亮,护士称李志亮已于去年退休。但院方未向新京报记者证实此消息。 308 | 记者注意到,该病例集封面的宣传语为“治疗肿瘤,我们倡导绿色疗法。”内容除了生物治疗的概念、作用流程等内容的介绍外,还列有白血病、唇癌、胆囊癌、肺癌等42种癌症病人的治疗案例,其中包括魏则西所患的滑膜肉瘤。案例内容包括患者的性别、名字,诊断、患病主因、遗传史、病情介绍,并用表格列出患者治疗前后情况比较。记者发现,病例多为积极案例,患者在治疗后病情得到改善,但没有姓名及其他信息,内容真实与否难以考证。新京报记者李相蓉 309 | 涉事医院资质如何 310 | 百度出具相关许可仍在有效期内 311 | 北京市预约挂号统一平台显示,中国人民武装警察部队北京市总队第二医院成立于2000年,是一所三级甲等综合性医院,是北京市首批基本医疗保险定点医院、北京大学人民医院医疗集团成员,国际紧急救援中心网络医院。 312 | 根据百度推广官微提供的武警北京二院的许可证显示,其文件全称为“武警部队单位对外有偿服务许可证”。说明显示,此许可证为武警部队单位开具对外有偿服务的合格凭证,并盖有“中国人民武装警察部队后勤部”的章,有效期从2014年1月1日到2017年12月31日。其中,有偿服务范围为“门诊、住院、体检、出(会)诊及专业技术培训。” 313 | 此前有媒体报道,涉事诊疗中心系外包给一民营机构。昨日,记者询问该医院多科室医生护士生物诊疗中心是否外包给“莆田系”医院,对方均表示不清楚此事。 314 | 媒体报道称,“中国人民武装警察部队北京市总队第二医院”在百度信誉档案中的网址为www.wjmnwk.com。新京报记者通过域名查询,发现联系人为“jijing”,注册时间为2008年。通过邮箱反查发现,该邮箱共注册67个网站域名,最近一次为今年3月份,但网站已无法打开。随后,记者输入其他域名,发现网站已大多无法打开,打开的网站则显示为“贵州368医院妇科诊疗中心”。新京报记者李相蓉信娜 315 | 免疫治疗中心有多少 316 | 全国多家医院均有涉及,资质难核查 317 | 新京报记者查询百度发现,国内多家医院均开展肿瘤生物免疫治疗,如解放军301医院、解放军307医院等。 318 | 以解放军301医院为例,其肿瘤生物免疫治疗主要由医院生物治疗科承担。根据官网介绍,科室成立于2012年,年收治肿瘤患者量近1500人。其官网表示,“对肿瘤患者而言,单纯细胞输注治疗多数情况下很难客观评价其疗效,需要多学科为基础联合治疗”。此外,其还标明,生物治疗科针对不同类型肿瘤患者设计制定,并系统性实施包括化疗在内的肿瘤综合治疗。 319 | 另一家全名为“解放军307医院CTC肿瘤生物治疗中心”,截至昨日下午18点,其官网已显示无法打开。 320 | 根据注册邮箱,记者共反查到37个相同注册邮箱的网站域名,最近一次的注册时间为2014年3月。此外,通过域名查询几家网站后,显示为“黑龙江维多利亚妇产医院”、“阳光妇产医院”、“欧非医疗美容”等。 321 | 新京报记者注意到,多家民营医院也打着公立的旗号成立细胞诊疗中心。部分诊疗中心也是用细胞免疫方法治疗肿瘤。 322 | 陕西生物细胞诊疗中心正是其中之一。网站介绍,该中心是公立三甲医院。 323 | 记者在卫计委医院查询系统(收录各地有二级三级资质的公立医院)输入“陕西生物细胞诊疗中心”,页面显示“没有符合信息”。另一家名为“安徽合肥济民肿瘤医院”也包含生物治疗中心,官网介绍,该肿瘤医院为经安徽省卫生厅批准执业的非营利性三级肿瘤专科医院,该医院同样查询无果。新京报记者信娜 324 | 医院和百度担何责 325 | 律师称医院主责;百度是否涉虚假广告待查 326 | 对于此次事件中的三方责任问题,北京大悦律师事务所合伙人、律师郎克宇认为,武警北京二院应负有主要责任,百度推广负次要责任。如果涉事诊疗中心系外包给了民营机构,那么院方可以对该民营机构追责。 327 | 郎克宇表示,即使该科室是承包出去的,武警北京二院也是有审核责任,患者出现问题第一责任还是在医院。“因为病人对承包事宜并不知情。如果是民营机构欺骗了武警医院,医院发现其中有虚假行为,医院可以追责。” 328 | 对百度推广的界定,全国政协委员、著名律师施杰和郎克宇均表示,根据新广告法的相关规定,百度推广也属于广告发布的主体,其性质属于有偿服务。 329 | “不像是在一些论坛上发布产品或信息,百度推广本身是一种经营行为,它接受广告主的委托,通过特定平台发布广告信息,且一般是根据费用多少来决定推广信息的排名,因此百度推广属于新广告法的监管范围,工商部门有相应的监管职责。但在整个事件中应负有次要责任。” 330 | 关于百度推广发布的此条医疗信息是否涉嫌虚假广告,施杰表示,是否属于虚假广告,要看发布主体发布的内容是否属实,这需要公安部门调查核实,调查其是否有夸大疗效、虚假事实、诱导等情形。同时,工商、卫生部门也要进行认定,看是否符合广告法规定的虚假广告的范畴。 331 | 如果认定后确实存在违反法律规定的情形,按照新广告法的规定,需要承担相应责任。如果构成虚假行为,广告经营者、发布者、代言人,都要承担民事、行政,甚至刑事责任。新京报记者李婷婷 332 | 魏则西事件始末 333 | ●2014年4月 334 | 魏则西检查出滑膜肉瘤。一种恶性软组织肿瘤,五年生存率是20%-50%。当时他在西安电子科技大学读大二。 335 | ●2015年8月 336 | 魏则西在知乎上发帖提问:“二十一岁癌症晚期,自杀是否是更好的选择?”那时候,他做完4次在武警北京二院的生物免疫疗法,没有达到预期效果。这个疗法曾被他和父母视为救命稻草。 337 | ●2016年2月 338 | 知乎上有人提问:“你认为人性最大的‘恶’是什么?”魏则西将+这根“救命稻草”的故事作为回答。医院,是在百度上搜的,排名领先。疗法“说得特别好”。他在文中还提到,当时武警北京二院的医生曾经对他说该院与国外大学合作,“有效率达到百分之八九十,看着我的报告单,给我爸妈说保我20年没问题”。结果却被网友告知生物免疫疗法是被国外临床淘汰的技术。 339 | ●2016年4月12日 340 | 魏则西去世。当天,在一则“魏则西怎么样了?”的知乎帖下,魏则西父亲用魏则西的知乎账号回复称:“我是魏则西的父亲魏海全,则西今天早上八点十七分去世,我和他妈妈谢谢广大知友对则西的关爱,希望大家关爱生命,热爱生活。” 341 | ●4月28日 342 | 针对自媒体曝出“魏则西”之死事件存在的涉事医院外包诊所给民营机构,百度竞价排名等问题,百度回应称,(魏)则西生前通过电视媒体报道和百度搜索选择的武警北京二院,百度第一时间进行了搜索结果审查,该医院是一家公立三甲医院,资质齐全。 343 | ●5月1日 344 | 百度再次回应称,针对网友对魏则西所选择的武警北京二院的治疗效果及其内部管理问题的质疑,百度正积极向发证单位及武警总部主管该院的相关部门递交审查申请函,希望相关部门能高度重视,立即展开调查。 345 | ''' 346 | content8 = ''' 347 | (原标题:中科院研究生遇害案:凶手系同乡学霸,老师同学已为死者发起捐款) 348 | 349 | 6月14日下午6点多,中科院信息工程研究所硕士研究生谢雕在饭馆招待自重庆远道而来的高中同学周凯旋时,被周凯旋用匕首杀害。随后,周凯旋被北京警方抓获。 350 | 351 | 周凯旋被抓后,他的家人向被警方递交了精神鉴定材料,称周凯旋患有精神性疾病。 352 | 353 | 谢雕的家人罗发明告诉南都记者,谢雕被害后,他的研究生老师和同学发起了捐款。并说,谢雕的遗体已经进行尸检,等尸检结果出来后,家人将会把火化后的骨灰带回老家安葬,之后,他们将等待北京检察机关的公诉。 354 | 355 | 高中同学千里赴京去杀人 356 | 357 | 今年25岁的谢雕生长于重庆垫江县的一个小山村,谢雕和周凯旋同在垫江中学读高中,两人学习成绩名列前茅,周凯旋经常考年级第一,两人都是垫江中学的优秀毕业生,谢雕考上了西安电子科技大学,周凯旋考取了四川大学。 358 | 359 | 微信图片_20180627174901_副本.jpg案发现场的行凶者周凯旋(受访者提供)。 360 | 361 | 学习优秀的周凯旋认为自己应该能考上北大清华等名校,于是在入读四川大学两三个月后,选择了退学复读。经过半年多的苦读,周凯旋以优异成绩考取了西安交通大学,来到了谢雕所在的城市,且是硕博连读。 362 | 363 | 但周凯旋因大学本科期间因沉迷游戏,考试不及格,最终失掉了硕博连读的机会,本科毕业后就回到重庆寻找就业机会。谢雕自西安电子科技大学毕业后,在2016年考取了中国科学院大学的硕士研究生,所读专业隶属于中科院信息工程研究所。 364 | 365 | 谢雕的家人告诉南都记者,6月14日下午6点,谢雕在西五环外的中科院信息工程研究所门口见到了久未见面的高中同学周凯旋。把他带到旁边的饭馆吃饭,两人还合影发到了高中同学微信群。这时,谢雕还没意识到周凯旋即将对他带来致命伤害。 366 | 367 | 南都记者在谢雕遇害现场视频中看到,在谢雕点菜时,周凯旋用匕首刺向他胸部,谢雕中刀站起后退时,周凯旋用匕首又刺向他颈部,谢雕倒地后,周凯旋又从背部向他连刺几刀。之后,又持刀割断了谢雕的颈部动脉。这时,有食客拿起椅子砸向正在行凶的周凯旋。刺死谢雕后,周凯旋举起双手挥舞,随后扬长而去。后来,周凯旋被北京警方抓获。 368 | 369 | 同学聚会时自己觉得受伤害起杀心 370 | 371 | 罗发明告诉南都记者,作为被害人家属,他们向北京警方了解到,凶案原因来自两年前的一场同学聚会,谢雕的一些话对周凯旋带来很大心理压力,让他不能释怀。 372 | 373 | 两年前的一次高中同学聚会中,大家聊的话题很多,也聊到了周凯旋喜欢打游戏的事情,谢雕说了一些激励周凯旋的话,让他不要再打游戏,要振作起来。在参与聚会的同学们看来,这些话是常理之中的,但在周凯旋看来,对他带来很大伤害,两年来给他带来很大心理压力。 374 | 375 | 参与那次聚会的同学后来回忆,在一起玩“狼人杀”游戏时,谢雕、周凯旋发生了争执,但不愉快的瞬间很快就过去了,大家也都没当回事。 376 | 377 | 那次聚会之后的春节,不少同学发现被周凯旋拉黑,中断了联系。直至一年之后,周凯旋才加入了高中同学微信群。 378 | 379 | 谢雕的家人说,周凯旋在网上购买了杀人凶器匕首,收货地址填写了北京,他在北京拿到网购的匕首后,才暗藏在身前来面见谢雕。 380 | 381 | 师生捐款助他家人渡难关 382 | 383 | 周凯旋被北京警方抓获后,他的家人向警方称周凯旋患有精神病,并提供了一些证明材料,希望得到从轻处置。 384 | 385 | 386 | 谢雕遇害后,他的学校为失去这么优秀的学生感到惋惜。谢雕的老师说,“谢雕家境并不富裕,本科尚有2.5万助学贷款未偿还,前不久还向同学借款1万,父亲也患有鼻咽癌。” 387 | 388 | 谢雕的老师和同学发起了捐款,希望能帮助谢雕的家人暂时渡过难关。 389 | 390 | 谢雕的家人告诉南都记者,他们向谢雕的学校提出要求,希望案件能尽快解决。 391 | 392 | 罗发明对南都记者说,谢雕的遗体已经进行尸检,尸检后十天至十五天出来结果,等拿到尸检报告后,他们会尽快火化谢雕的遗体,把他的骨灰带回重庆老家安葬。 393 | 394 | 对于这一案件,谢雕的家人告诉南都记者,他们将等待北京的检察机关提起公诉。 395 | 396 | 397 | ''' 398 | handler = CrimeMining() 399 | handler.main(content8) --------------------------------------------------------------------------------