var KCScatterDiagram = kity.createClass("scatterDiagram", (function() { var p = new kity.Palette(); p.add('alix-text', new kity.Color('black').inc('l', '50')); return { constructor: function(data, target) { this.graphMargin = { top: 9.5, right: 19.5, left: 49.5, bottom: 39.5 }; this._paper = new kity.Paper(target); this._paper.on("click", changeview); this.renderData(data); }, renderData: function(d) { var me = this; var _paper = this._paper; var container = this._paper.getContainer(); var margin = this.graphMargin; this.paperWidth = container.clientWidth; this.paperHeight = container.clientHeight; _paper.setViewBox(0, 0, container.clientWidth, container.clientHeight).setWidth(container.clientWidth).setHeight(container.clientHeight); var drawArea = { top: margin.top, right: me.paperWidth - margin.right, bottom: me.paperHeight - margin.bottom, left: margin.left } var map = function(x, y, drawArea) { return [ drawArea.left + (drawArea.right - drawArea.left - 10) * x / 2 + (drawArea.right - drawArea.left - 10) / 5, drawArea.bottom - ((drawArea.bottom - drawArea.top - 10) * y / 2 + (drawArea.bottom - drawArea.top - 10) / 5)]; } var createLine = function(x1, y1, x2, y2, color, dasharray) { var Line = new kity.Line(x1, y1, x2, y2); //if (dasharray) Line.setDashArray(dasharray); Line.stroke(new kity.Pen().setColor(color).setDashArray(dasharray)); return Line; }; var renderAxis = function() { if (_paper.items) { for (var _d = 0; _d < _paper.items.length; _d++) { if (_paper.items[_d].name === "Axis") { _paper.items[_d].remove() } } } var group = new kity.Group(); group.name = "Axis"; group.addShape(new kity.Path().pipe(function() { var dr = this.getDrawer(); dr.moveTo(drawArea.left, drawArea.bottom).lineTo(drawArea.right, drawArea.bottom); dr.moveTo(drawArea.left, drawArea.bottom).lineTo(drawArea.left, drawArea.top); for (var i = 0; i < 10; i++) { var curX = drawArea.left + i * ((drawArea.right - drawArea.left - 10) / 9); dr.moveTo(curX, drawArea.bottom).lineTo(curX, drawArea.bottom + 3); if (i % 2 !== 0) { continue; } var txtX = (new kity.Text(d.axis.cateX[i / 2])).fill(p.get('alix-text')); txtX.setStyle('font-family', 'Arial'); txtX.setSize(12); group.addShape(txtX, "labelX" + i); txtX.setY(drawArea.bottom + 20); txtX.setX(curX - 10); } for (var j = 0; j < 5; j++) { var curY = drawArea.bottom - j * ((drawArea.bottom - drawArea.top - 10) / 5); dr.moveTo(drawArea.left, curY).lineTo(drawArea.left - 3, curY); var txtY = (new kity.Text(d.axis.cateY[j])).fill(p.get('alix-text')); txtY.setStyle('font-family', 'Arial'); txtY.setSize(12); group.addShape(txtY, "labelY" + j); var _txtWidthY = txtY.shapeNode.clientWidth; txtY.setY(curY + 5); txtY.setX(10); } this.stroke("#C0D0E0", 1); })); group.addShape(createLine(drawArea.left, drawArea.bottom, drawArea.right, drawArea.top, "#666")); //var linePos = (drawArea.bottom - drawArea.top) * (0.54 + 0.4) / 2; var linePos = drawArea.bottom - (2.42 + 0.4) * ((drawArea.bottom - drawArea.top - 10) / 5); group.addShape(createLine(drawArea.left, linePos, drawArea.right, linePos, "#666", [5, 2])); var linePos2 = drawArea.left + (2.14 + 0.4) * ((drawArea.right - drawArea.left - 10) / 9) / 0.5; group.addShape(createLine(linePos2, drawArea.top, linePos2, drawArea.bottom, "#666", [5, 2])); _paper.addShape(group); }; var createDot = function(dot) { var Round = new kity.Group(); var mapXY = map(dot.x, dot.y, drawArea); var vX = mapXY[0]; var vY = mapXY[1]; //draw circle var circle = new kity.Circle(dot.r, 0, 0); circle.stroke(dot.color, 2).fill("white"); //draw percent var pie = new kityPie(0, dot.r, 0, dot.percent * 360, 0, 0); pie.fill(dot.color); //var label_val = new kity.Text((dot.percent * 100).toFixed(2) + "%"); //label_val.fill("#333").setX(0).setY(0).setSize((dot.r / 3 > 12 ? dot.r / 3 : 12)).setStyle('font-family', 'Arial'); var label = new kity.Text(dot.label + (dot.percent * 100).toFixed(2) + "%"); label.fill(dot.color).setSize(12).setX(dot.r).setY(0 - 12); Round.addShape(circle); Round.addShape(pie); //Round.addShape(label_val); Round.addShape(label); Round.setOpacity(0.9); Round.dot = dot; Round.vX = vX; Round.vY = vY; Round.translate(vX, vY); return Round; }; var transDot = function(Dot) { console.log(drawArea); var dot = Dot.dot; var mapXY = map(dot.x, dot.y, drawArea); var vX = mapXY[0]; var vY = mapXY[1]; Dot.node.setAttribute("transform", null); Dot.translate(Dot.vX, Dot.vY); Dot.fxTranslate(vX - Dot.vX, vY - Dot.vY, 1000, 'easeOutExpo'); Dot.vX = vX; Dot.vY = vY; } renderAxis(); var dots = d.data.series; var exist = false, dotgroup; for (var _d = 0; _d < _paper.items.length; _d++) { if (_paper.items[_d].name === "dots") { exist = true; dotgroup = _paper.items[_d]; break; } } if (!exist) { var dotGroup = new kity.Group(); for (var i = 0; i < dots.length; i++) { dotGroup.addShape(createDot(dots[i])); } dotGroup.name = "dots"; _paper.addShape(dotGroup); } else { dotgroup.remove(); _paper.addShape(dotgroup); //调整散点的位置 for (var _i = 0; _i < dotgroup.items.length; _i++) { transDot(dotgroup.items[_i]); } } } }; })()); console.log(KCScatterDiagram);