initGraph () {
		this.arc = d3.svg.arc()
		    .outerRadius(this.radius - 10)
		    .innerRadius(0)
		    .bind(this)

		this.pie = d3.layout.pie()
		    .sort(null)
		    .value(function(d) { 
		    	return d.population 
		    })

		this.svg = d3.select(this.container).append('svg')
		    .attr('width', '100%')
		    .attr('height', '100%')
		    .attr('viewBox','0 0 '+Math.min(this.width, this.height)+' '+Math.min(this.width, this.height))
		    .attr('perserveAspectRatio', 'xMinYMid')

		this.group = this.svg.append('g')
			.attr('transform', 'translate(' + this.width / 2 + ',' + this.height / 2 + ')');

		this.pieces = this.group.selectAll('.arc')
			.data( this.pie(dataset) )
			.enter().append('g')
				.attr('class', 'arc')

		this.pieces.append('path')
			.attr('d', this.arc)

		this.pieces.style('fill', function(d) { 
				return this.colors(d.data.age)
			}.bind(this))
	}
Пример #2
0
  render:function() {

    var props = this.props;

    var pie = d3.layout
      .pie()
      .sort(null);

    var arcData = pie(props.data);

    var arcs = arcData.map(function(arc, i)  {
      return (
        React.createElement(Arc, {
          startAngle: arc.startAngle, 
          endAngle: arc.endAngle, 
          outerRadius: props.radius, 
          innerRadius: props.innerRadius, 
          labelTextFill: props.labelTextFill, 
          valueTextFill: props.valueTextFill, 
          fill: props.colors(i), 
          label: props.labels[i], 
          value: props.data[i], 
          key: i, 
          width: props.width}
        )
      );
    });
    return (
      React.createElement("g", {className: "rd3-piechart-pie", transform: props.transform}, arcs)
    );
  }
Пример #3
0
 NBASummary.prototype._getLayout = function() {
     var pie = d3.layout.pie().sort(null)
         .value(function(d) {
             return d.population;
         });
     return pie;
 };
Пример #4
0
    render: function() {
        this.$el.html(this.template({}));
        var width = 300,
            height = 300,
            radius = Math.min(width, height) / 2,
            valAttr = this.valAttribute;
        
        this.legend = this.createLegend();
        
        this.arc = d3.svg.arc()
            .outerRadius(radius - 10)
            .innerRadius(0);

        this.pie = d3.layout.pie()
            .sort(function(a,b) {
                return b[valAttr] - a[valAttr]
            })
            .value(function(d) { return d[valAttr]; });

        this.svg = d3.select(this.$('.pie-chart')[0]).append("svg")
            .attr("width", width)
            .attr("height", height)
            .append("g")
            .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
        
        return this;
    },
Пример #5
0
    constructor($element) {
        'ngInject';

        const width = $element.parent().width();
        const height = $element.parent().height();
        const totalSize = (this.strokeWidth + this.marginBetweenCircles) * _.size(this.dataset);
        const pie = d3.layout.pie().sort(null);
        const arc = d3.svg.arc();
        let currentElement = 0;
        let radius = Math.min(width / 2 - totalSize, height / 2 - totalSize);

        this._svg = d3.select($element[0]).append('svg')
            .attr('width', width)
            .attr('height', height)
            .append('g')
            .attr('transform', `translate(${width / 2}, ${height / 2})`);

        const pathGroups = this._svg.selectAll('g')
            .data(this.dataset)
            .enter()
            .append('g')
            .attr('class', (d) => `${COMPONENT_NAME}__${this.chartId}__${_.keys(d)[0]}`);

        pathGroups.selectAll('path')
            .data((d) => pie(getPercent(_.values(d))))
            .enter().append('path')
            .attr('class', (d, i) => `${COMPONENT_NAME}__${i === 1 ? 'rest' : 'current'}`)
            .attr('d', (d, i, j) => {
                if (j > 0 && currentElement !== j) {
                    radius += this.marginBetweenCircles + this.strokeWidth;
                    currentElement = j;
                }
                return arc.innerRadius(radius).outerRadius(radius + this.strokeWidth)(d);
            });
    }
Пример #6
0
    displayRadialGraph: function(target_elem, data_sub, data_total) {
        var targetElemBox = $("#" + target_elem).get(0);
        var targetElemP = $("#" + target_elem + "_p").get(0);

        if(!data_sub || !data_total) {
            targetElemP.innerHTML = "N/A";
        } else {
            var parseData = [
                //parsing data to 2 decimal positions
                { label: gettext("Hours spent on content"), count: Math.round((data_sub * 100)/data_total) },
                { label: gettext("Other activites (exercises, etc.)"), count: Math.round(((data_total - data_sub) * 100)/data_total) }
            ];

            //adjusting the graph's size based on target_elem's sizing
            var width = targetElemBox.clientWidth;
            var height = targetElemBox.clientHeight;
            var radius = (Math.min(width, height) / 2);

            var color = d3.scale.category20();

            var svg = d3.select("#" + target_elem)
                .append("svg")
                .attr("width", width)
                .attr("height", height)
                .append("g")
                .attr("transform", "translate(" + (width/2) + "," + (height/2) + ")");

            var arc = d3.svg.arc()
                .innerRadius(radius - radius/6)
                .outerRadius(radius);

            var pie = d3.layout.pie()
                .value(function(d) { return d.count; })
                .sort(null);

            var path = svg.selectAll("path")
                .data(pie(parseData))
                .enter()
                .append("path")
                .attr("d", arc)
                .attr("fill", function(d, i) {
                    return color(d.data.label);
                });

            //parsing to 2 decimals
            var content_percentage = Math.round((data_sub * 100)/data_total);
            targetElemP.innerHTML = content_percentage + "%";

            //this will display relevant data when you hover over that data's arc on the radial graph
            path.on('mouseover', function(d) {
                targetElemP.innerHTML = (d.data.label + ": " + d.data.count + "%");
            });

            //when not hovering, you'll see the content percentage
            path.on('mouseout', function() {
                targetElemP.innerHTML = content_percentage + "%";
            });
        }
    },
Пример #7
0
exports.drawPie = function (parentElem, data) {
	var width = 120,
	height = 120;
	var radius = Math.min(width, height) / 2;

	var colors = data.map(function (item) {
			return item.color;
		});

	var color = d3.scale.ordinal()
		.range(colors);

	var arc = d3.svg.arc()
		.outerRadius(radius - 10)
		.innerRadius(0);

	var pie = d3.layout.pie()
		.sort(null)
		.value(function (d) {
			return d.val;
		});

	var svg = d3.select(parentElem).append("svg")
		//.attr("width", "100%")
		// .attr("height", height)
		.attr("viewBox", "0, 0, " + width + ", " + height)
		.append("g")
		.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

	data.forEach(function (d) {
		d.val = +d.val;
	});

	var g = svg.selectAll(".arc")
		.data(pie(data))
		.enter().append("g")
		.attr("class", "arc");

	g.append("path")
	.attr("d", arc)
	.style("fill", function (d) {
		return color(d.data.lbl);
	});

	g.append("text")
	.attr("transform", function (d) {
		return "translate(" + arc.centroid(d) + ")";
	})
	.attr("dy", ".35em")
	.style("text-anchor", "middle")
	.attr('class', 'pie-text')
	.text(function (d) {
		return d.data.lbl;
	});
};
Пример #8
0
  stats.createPie = function(puddle, puddleGroup, data) {
    var xOffset = (pool.width()/3) * (1/6);
    var yOffset = pool.height() / 2;
    puddleGroup.selectAll('.d3-stats-pie').remove();
    var pieGroup = puddleGroup.append('g')
      .attr({
        transform: 'translate(' + xOffset + ',' + yOffset + ')',
        class: 'd3-stats-pie'
      });
    if (stats.hasNaN(data)) {
      puddleGroup.classed('d3-insufficient-data', true);
      pieGroup.append('circle')
        .attr({
          cx: 0,
          cy: 0,
          r: opts.pieRadius
        });

      var annotationOpts = {
        x: xOffset + puddle.xPosition(),
        y: yOffset,
        hoverTarget: puddleGroup
      };
      _.defaults(annotationOpts, opts.defaultAnnotationOpts);
      pool.parent().select('#tidelineAnnotations_stats').call(annotation, annotationOpts);

      return null;
    }
    else {
      puddleGroup.on('mouseover', null);
      puddleGroup.on('mouseout', null);
      puddleGroup.classed('d3-insufficient-data', false);
      pie = d3.layout.pie().value(function(d) {
          return d.value;
        })
        .sort(null);

      arc = d3.svg.arc()
        .innerRadius(0)
        .outerRadius(opts.pieRadius);

      var slices = pieGroup.selectAll('g.d3-stats-slice')
        .data(pie(data))
        .enter()
        .append('path')
        .attr({
          d: arc,
          class: function(d) {
            return 'd3-stats-slice d3-' + d.data.type;
          }
        });

      return slices;
    }
  };
    return function(junctions, newJunctions) {
	var arc = d3.svg.arc()
		.innerRadius(junctionRadius)
		.outerRadius(dependencyArcRadius),
	    pie = d3.layout.pie()
		.sort(null)
		.value(function(d, i) {
		    return d.value;
		});

	var dependenceArc = junctions.selectAll("path")
		.data(
		    function(d, i) {
			var dependence = d.collapsed ? 0 : d.dependence,
			    independence = 1 - dependence;

			return pie([
			    {type: "dependence", color: "black", node: d, value: dependence},
			    {type: "independence", color: "white", node: d, value: independence}
			]);
		    },
		    function(d, i) {
			return d.data.type;
		    }
		);
	
	dependenceArc.exit().remove();
	dependenceArc.enter()
	    .append("path")
	    .attr("fill", function(d, i){
		return d.data.color;
	    })
	    .attr("stroke-width", 0.4)
	    .call(dragDependency);

	dependenceArc
	    .attr("d", arc)
	    .style("visibility", function(d, i) {
		/*
		 If detail is off, make sure we're always hidden.
		 Otherwise, we'll just inherit this value.
		 */
		return d.data.node.detail ? null : "hidden";
	    });

	junctions.call(onScroll, function(d, i, change) {
	    var node = getNodeCollection()
		    .get(d.id);

	    node.dependence(d.dependence + change);

	    update();
	});
    };
Пример #10
0
    plugin.render = function(id, data, config) {
        $(id).empty();

        var count = data.reduce(function(prev, curr) {
            return prev + curr[config.value];
        }, 0);
        if (count === 0 || isNaN(count)) {
            $(id).append('<p class="error">Sorry, there is not enough data to display the chart. Add at least one scene to your script.</p>');
            return;
        }

        var vis = d3.select(id)
            .append('svg:svg')
            .data([data])
            .attr('width', 200)
            .attr('height', 200)
            .style('margin-left', 'auto')
            .style('margin-right', 'auto')
            .append('svg:g')
            .attr('transform', 'translate(100,100)');

        var arc = d3.svg.arc().outerRadius(100);
        var pie = d3.layout.pie().value(function(d) {
            return d[config.value];
        });

        var arcs = vis.selectAll('g')
            .data(pie)
            .enter()
            .append('svg:g');

        arcs.append('svg:path')
            .attr('fill', function(d) {
                return config.color(d);
            }).attr('d', arc)
            .on("mouseover", function(d) {
                config.show_tooltip(config.tooltip(d));
            })
            .on("mousemove", function() {
                config.move_tooltip(d3.event.pageX, d3.event.pageY);
            })
            .on("mouseout", function() {
                config.hide_tooltip();
            });

        vis.append('svg:circle')
            .attr('fill', 'none')
            .attr('stroke', '#000000')
            .attr('stroke-width', '1')
            .attr('cx', '0')
            .attr('cy', '0')
            .attr('r', '100');
    };
Пример #11
0
    create(data) {
        this.legendRectSize = 18;
        this.legendSpacing = 4;
        this.data = data;

        const numberOfItems = Object.keys(data).length;

        const width = this.props.width;
        const height = this.props.height;
        const svgHeight = this.getHeight(numberOfItems);
        const radius = Math.min(width, height) / 2;
        const halfWidth = width / 2;
        const halfHeight = height / 2;

        this.arc = d3.svg.arc()
            .outerRadius(radius - 10)
            .innerRadius(this.props.innerRadius);

        this.pie = d3.layout.pie()
            .sort(null)
            .value(d => { return d.value; });

        this.svg = d3.select(this.el).append("svg")
            .attr("width", width)
            .attr("height", svgHeight)
            .append("g")
                .attr("transform", `translate(${halfWidth}, ${halfHeight})`);

        this.path = this.svg.selectAll("path")
            .data(this.pie(d3.entries(data)))
            .enter().append("path");

        this.path
            .attr("fill", (d, i) => { return this.color(i); })
            .attr("d", this.arc)
            .each(d => {
                // Let's keep a reference to the
                // original angles to make use of
                // in our arcTween helper.
                this.originalAngles = d;
            })
            .on("mouseover", this.onMouseOver.bind(this))
            .on("mousemove", this.onMouseMove.bind(this))
            .on("mouseout", this.onMouseOut.bind(this));

        if (this.showTooltips) {
            this.addTooltips();
        }

        if (this.showLegend) {
            this.addLegend();
        }
    }
Пример #12
0
  drawChart () {
    const div = document.getElementById('chart' + this.props.elem.id);
    while (div.firstChild) {
      div.removeChild(div.firstChild);
    }
    let data = Object.keys(this.props.elem.categories).map(key => {
      return {
        label: key,
        value: this.props.elem.categories[key]
      };
    })
            .filter(elem => elem.value !== 0);
    if (!data.length) {
      data = [{label: 'no votes', value: 1}];
    }

    const w = 128;
    const h = 128;
    const r = h / 2;
    const color = d3.scale.category20c();
    const vis = d3.select('#chart' + this.props.elem.id)
            .append('svg:svg')
            .data([data])
            .attr('width', w)
            .attr('height', h)
            .append('svg:g')
            .attr('transform', 'translate(' + r + ',' + r + ')');
    const pie = d3.layout.pie().value(d => d.value);

    const arc = d3.svg.arc().outerRadius(r);

    const arcs = vis.selectAll('g.slice')
            .data(pie)
            .enter()
            .append('svg:g')
            .attr('class', 'slice');
    arcs.append('svg:path')
      .attr('fill', (d, i) => color(i))
      .attr('d', (d) => arc(d));

    // add the text
    arcs.append('svg:text').attr('transform', d => {
      d.innerRadius = 0;
      d.outerRadius = r;
      return 'translate(' + arc.centroid(d) + ')';
    })
    .attr('text-anchor', 'middle').text((d, i) => data[i].label);
  }
Пример #13
0
      selection.each(function (data, index) {
        var pie = d3.layout.pie()
          .sort(sort)
          .value(value);

        data = pie(data).map(function (d) {
          return [d];
        });

        var radius = Math.min(width, height) / 2;

        var svgEvents = events().listeners(listeners);

        var svg = d3.select(this).append("svg")
          .attr("width", width)
          .attr("height", height)
          .call(svgEvents);

        var g = svg.append("g")
          .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

        var arc = d3.svg.arc()
          .outerRadius(outerRadius || radius)
          .innerRadius(innerRadius);

        var piePath = path()
          .pathGenerator(arc)
          .class(pieClass)
          .fill(fill)
          .stroke(stroke);

        var pieText = textElement()
          .transform(text.transform || function (d) {
            return "translate(" + arc.centroid(d) + ")";
          })
          .dy(text.dy)
          .anchor(text.anchor)
          .fill(text.fill)
          .text(function (d, i) {
            return label.call(this, d.data, i);
          });

        g.selectAll("groups")
          .data(data)
          .enter().append("g")
          .call(piePath)
          .call(pieText);
      });
function createPieChart (data) {

  var div = document.createElement('div');

  var radius = Math.min(data.width, data.height) / 2;

  var color = d3.scale.ordinal()
      .range(data.colors);

  var arc = d3.svg.arc()
      .outerRadius(radius - 10)
      .innerRadius(0);

  var labelArc = d3.svg.arc()
      .outerRadius(radius - 40)
      .innerRadius(radius - 40);

  var pie = d3.layout.pie()
      .sort(null)
      .value(function(d) { return d.quantity; });

  var svg = d3.select(div).append("svg")
      .attr("width", data.width)
      .attr("height", data.height)
      .append("g")
      .attr("transform", "translate(" + data.width / 2 + "," + data.height / 2 + ")");

  var g = svg.selectAll(".arc")
    .data(pie(data.dataSet))
    .enter().append("g")
    .attr("class", data.arcClass);

  g.append("path")
    .attr("d", arc)
    .style("fill", function(d) { return color(d.data.label); });

  g.append("text")
    .attr("transform", function(d) { return "translate(" + labelArc.centroid(d) + ")"; })
    .attr("dy", ".35em")
    .text(function(d) { return d.data.label; });

  function type(d) {
    d.quantity = +d.quantity;
    return d;
  }

  return div
}
Пример #15
0
    constructor(element, options) {
        this.svg              = d3.select(element);
        this.arcsContainer    = this.svg.append('g').attr('class', 'arcs');
        this.paths            = this.arcsContainer.selectAll('.pie_slice');
        this.arcsOutline      = this.arcsContainer.append('path').attr('class', 'pie_outline');
        this.legendsContainer = this.svg.append('g').attr('class', 'pie_svg_legends');
        this.legends          = this.legendsContainer.selectAll('.pie_svg_legend');

        this.options = _.merge({
            sort:            null,
            gauge:           false,
            handAnchorRatio: 0.03,
            handLengthRatio: 0.7,
            startAngle:      0,
            endAngle:        360,
            spacing:         _.merge({
                top:    10,
                right:  10,
                bottom: 10,
                left:   10
            }, options.spacing || {})
        }, options);

        const { sort, gauge, padAngle, startAngle, endAngle } = this.options;

        if (gauge === true) {
            this.hand       = this.svg.append('g').attr('class', 'pie_gauge_needle');
            this.handAnchor = this.hand.append('circle').attr('class', 'pie_gauge_anchor');
            this.handBase   = this.hand.append('circle').attr('class', 'pie_gauge_needle_base');
            this.handLine   = this.hand.append('path').attr('class', 'pie_gauge_needle_arrow');
            this.angleScale = d3.scale.linear().range([startAngle, endAngle]);
        }

        this.pie = d3.layout.pie()
            .value(d => d.count)
            .sort(sort)
            .startAngle(Pie.degreesToRadians(startAngle))
            .endAngle(Pie.degreesToRadians(endAngle))
        ;

        if (padAngle !== undefined) {
            this.pie.padAngle = Pie.degreesToRadians(padAngle);
        }

        this.width  = 100;
        this.height = 100;
    }
Пример #16
0
    /**
     * Draws the donut chart
     */
    createTheDonutChart()
    {
        const { totalTablet, totalSmartphone, dataEntries } = this.props;
        const dataset = [ totalTablet, totalSmartphone ];

        const pie = d3.layout.pie()
            .sort(null);

        const arc = d3.svg.arc()
            .innerRadius(this.radius)
            .outerRadius(this.radius - this.donutWidth);

        const path = this.svg.selectAll('path')
            .data(pie(dataset))
            .enter().append('path')
            .attr('fill', (d, i) => this.colors[i])
            .attr('d', arc);


         const lineHeight = 5;

         // Draws the tick in the donut
         for(let t in [1,2,3,4])
         {
            let sign = Math.pow( -1, t%2 );
            let inversesign = -sign;
            var pos = ( sign * this.radius ) + ( inversesign * this.donutWidth );
            let x1 = 0, x2 = 0, y1 = pos, y2 = pos - sign * lineHeight;

            if( t > 1 )
            {
              y1 = 0;
              y2 = 0;
              x1 = pos;
              x2 = pos - sign*lineHeight;
            }

            this.svg.append('line')
                    .attr('x1', x1)
                    .attr('y1', y1)
                    .attr('x2', x2)
                    .attr('y2', y2)
                    .attr('stroke-width', 2)
                    .attr('stroke', `${this.colors[1]}`);
         }
    }
Пример #17
0
  createG(svg) {
  	let {dataSet, g: {title}, dispatch} = this.props;
  	let colors = [],
  	    arc = this.createArc(),
  	    color = d3.scale.category20(),
  	    pie = d3.layout.pie();
    dataSet = [10, 50, 25, 20, 80];

  	let arcs = svg.selectAll('g')
        .data(pie(dataSet))
        .enter()
        .append('g')
        .attr('class', 'svg-circle-g')
        .style('stroke', 'white')
        .style('stroke-width', 1)
        .style('display', 'none');
    arcs.append('path')
        .transition()
        .duration(2000)
        .ease('circle')
        .delay(function(d, i) {
          return 200 * i;
        })
        .attr("fill", function(d, i) {
          colors.push(color(i));
          return color(i);
        })
        .attr("d", function(d) {
          return arc(d);
        });
    if (title) {
      arcs.append('text')
          .attr('class', 'g-text')
          .attr("transform", function(d) {
            return "translate(" + arc.centroid(d) + ")";
          })
         .attr("text-anchor", "middle")
         .text(function(d) {
            return d.value;
         });
      }
      
      this.gAnimation();
      console.log('dis', disDataSetColors(colors));
      dispatch(disDataSetColors(colors));
  }
Пример #18
0
     PieChart: function (jsonData, explanation) {
          var width = 960,
                height = 500,
                radius = Math.min(width, height) / 2;

            //The number of colors to display with the pie chart
            var color = d3.scale.ordinal()
                .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00",
                  "#96abc5", "#8589a6", "#756888", "#63486b", "#a75d56", "#d8743c", "#f58c00"]);


            var arc = d3.svg.arc()
                .outerRadius(radius - 10)
                .innerRadius(0);

            var labelArc = d3.svg.arc()
                .outerRadius(radius - 40)
                .innerRadius(radius - 40);


            var pie = d3.layout.pie()
                .sort(null)
                .value(function(d) { return d.count; });

            var svg = d3.select(".chart").append("svg")
                .attr("width", width)
                .attr("height", height)
                .append("g")
                .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

              var g = svg.selectAll(".arc")
                  .data(pie(jsonData))
                .enter().append("g")
                  .attr("class", "arc");

              g.append("path")
                  .attr("d", arc)
                  .style("fill", function(d) { return color(d.data.outcome); });

              g.append("text")
                  .attr("transform", function(d) { return "translate(" + labelArc.centroid(d) + ")"; })
                  .attr("dy", ".35em")
                  .text(function(d) { return d.data.outcome; });
    }
Пример #19
0
  render () {
    var {width, height, data, colorRange} = this.props

    var radius = Math.min(width, height) / 2;
    colorRange = colorRange != null ? colorRange : ["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"];
    var color = d3.scale.ordinal().range(colorRange);

    var arc = d3.svg.arc()
        .outerRadius(radius - 10)
        .innerRadius(0);

    var labelArc = d3.svg.arc()
        .outerRadius(radius - 40)
        .innerRadius(radius - 40);

    var pie = d3.layout.pie()
        .sort(null)
        .value(function(d) { return d.value; });

    var node = ReactFauxDOM.createElement('svg')

    var svg = d3.select(node)
        .attr("width", width)
        .attr("height", height)
        .append("g")
        .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

    var g = svg.selectAll(".arc")
      .data(pie(data))
      .enter().append("g")
      .attr("class", "arc");

    g.append("path")
        .attr("d", arc)
        .style("fill", function(d) { return color(d.data.label); });

      g.append("text")
        .attr("transform", function(d) { return "translate(" + labelArc.centroid(d) + ")"; })
        .attr("dy", ".35em")
        .text(function(d) { return d.data.label; });

     return node.toReact()
  }
Пример #20
0
    constructor(element, options) {
        this.svg             = d3.select(element);
        this.arcsContainer   = this.svg.append('g').attr('class', 'arcs');
        this.paths           = this.arcsContainer.selectAll('path');
        this.shadowContainer = this.svg.append('g').attr('class', 'pie_shadow');
        this.shadowPath      = this.shadowContainer.append('path');
        this.lightContainer = this.svg.append('g').attr('class', 'pie_light');
        this.lightPath      = this.lightContainer.append('path');

        this.options = _.merge({
            sort:            null,
            gauge:           false,
            handAnchorRatio: 0.03,
            handLengthRatio: 0.7,
            startAngle:      0,
            endAngle:        360
        }, options);

        let { sort, gauge, padAngle, startAngle, endAngle } = this.options;

        if (gauge === true) {
            this.hand       = this.svg.append('g').attr('class', 'pie_hand');
            this.handAnchor = this.hand.append('circle').attr('class', 'pie_hand_anchor');
            this.handLine   = this.hand.append('path').attr('class', 'pie_hand_line');
            this.angleScale = d3.scale.linear().range([startAngle, endAngle]);
        }

        this.pie = d3.layout.pie()
            .value(d => d.count)
            .sort(sort)
            .startAngle(Pie.degreesToRadians(startAngle))
            .endAngle(Pie.degreesToRadians(endAngle))
        ;

        if (padAngle !== undefined) {
            this.pie.padAngle = Pie.degreesToRadians(padAngle);
        }

        this.width  = 100;
        this.height = 100;
    }
Пример #21
0
Donut3D.transition = function(id, data, rx, ry, h, ir){
  function arcTweenInner(a) {
    var i = d3.interpolate(this._current, a);
    this._current = i(0);
    return function(t) { return pieInner(i(t), rx+0.5, ry+0.5, h, ir);  };
  }
  function arcTweenTop(a) {
    var i = d3.interpolate(this._current, a);
    this._current = i(0);
    return function(t) { return pieTop(i(t), rx, ry, ir);  };
  }
  function arcTweenOuter(a) {
    var i = d3.interpolate(this._current, a);
    this._current = i(0);
    return function(t) { return pieOuter(i(t), rx-.5, ry-.5, h);  };
  }
  function textTweenX(a) {
    var i = d3.interpolate(this._current, a);
    this._current = i(0);
    return function(t) { return 0.6*rx*Math.cos(0.5*(i(t).startAngle+i(t).endAngle));  };
  }
  function textTweenY(a) {
    var i = d3.interpolate(this._current, a);
    this._current = i(0);
    return function(t) { return 0.6*rx*Math.sin(0.5*(i(t).startAngle+i(t).endAngle));  };
  }

  var _data = d3.layout.pie().sort(null).value(function(d) {return d.value;})(data);

  d3.select("#"+id).selectAll(".innerSlice").data(_data)
    .transition().duration(750).attrTween("d", arcTweenInner);

  d3.select("#"+id).selectAll(".topSlice").data(_data)
    .transition().duration(750).attrTween("d", arcTweenTop);

  d3.select("#"+id).selectAll(".outerSlice").data(_data)
    .transition().duration(750).attrTween("d", arcTweenOuter);

  d3.select("#"+id).selectAll(".percent").data(_data).transition().duration(750)
    .attrTween("x",textTweenX).attrTween("y",textTweenY).text(getPercent);
}
Пример #22
0
  render:function() {

    var props = this.props;

    var pie = d3.layout
      .pie()
      .sort(null);

    var arcData = pie(props.values);

    var arcs = arcData.map(function(arc, idx)  {
      return (
        React.createElement(ArcContainer, {
          key: idx, 
          startAngle: arc.startAngle, 
          endAngle: arc.endAngle, 
          outerRadius: props.radius, 
          innerRadius: props.innerRadius, 
          labelTextFill: props.labelTextFill, 
          valueTextFill: props.valueTextFill, 
          valueTextFormatter: props.valueTextFormatter, 
          fill: props.colors(props.colorAccessor(props.data[idx], idx)), 
          value: props.values[idx], 
          label: props.labels[idx], 
          width: props.width, 
          showInnerLabels: props.showInnerLabels, 
          showOuterLabels: props.showOuterLabels, 
          sectorBorderColor: props.sectorBorderColor, 
          hoverAnimation: props.hoverAnimation}
        )
      );
    });
    return (
      React.createElement("g", {className: "rd3-piechart-pie", transform: props.transform}, 
        arcs
      )
    );
  }
Пример #23
0
  constructor (opts) {
    this.root = opts.root;
    this.selection = d3.select(this.root);
    this.data = opts.data;
    this.duration = opts.duration || 2000;

    this.width = opts.width || 300;
    this.height = opts.height || 300;

    this.radius = Math.min(this.width, this.height) / 2;

    let pie = d3.layout.pie().value(d => d.value);

    this.container = this.selection
      .append('svg')
      .attr('width', this.width)
      .attr('height', this.height)
      .append('g')
      .attr('transform', `translate(${this.width / 2}, ${this.height / 2})`)
      .selectAll('.arc')
      .data(pie(this.data))
      .enter();
  }
Пример #24
0
  _setupD3Functions = (props) => {
    const dataSets = props.data.map(item => {
      return item.value;
    });
    const startAngle = (-135 * this.state.radiansMultiplier);
    const endAngle = (135 * this.state.radiansMultiplier);
    const pie = d3.layout.pie().padAngle(props.padAngle).endAngle(endAngle);
    const values = pie(dataSets);
    const radius = Math.min(props.width, props.height) / 2;
    const standardArc = d3.svg.arc().outerRadius(radius - props.activeOffset).innerRadius(radius - props.arcWidth);
    const hoveredArc = d3.svg.arc().outerRadius(radius).innerRadius(radius - props.arcWidth);
    const baseArc = d3.svg.arc().outerRadius(radius - props.activeOffset).innerRadius(radius - props.arcWidth).startAngle(startAngle).endAngle(endAngle);

    this.setState({
      baseArc,
      endAngle,
      hoveredArc,
      pie,
      radius,
      standardArc,
      values
    });
  };
Пример #25
0
    draw: function () {
        var self = this;
        var computed = self.computed;
        var layout = self.options.layout;
        var behavior = self.options.behavior;
        var chart = this._createChart();
        var data = self.data;
        var color = d3.scale.category20b();

        var arc = d3.svg.arc().outerRadius(computed.radius);
        var pie = d3.layout.pie();

        pie.value(self.fn.value)
            .sort(null);

        var path = chart.selectAll('path');

        var pieTip = d3.tip()
            .attr('class', 'bar-tooltip')
            .offset([-10, 0])
            .html(function(d) {
                return '<span class="label">' + self.fn.label(d.data) + '</span>:&nbsp;<span class="value">' + self.fn.value(d.data) + '</span>';
            });

        chart.call(pieTip);

        path.data(pie(data))
            .enter()
            .append('path')
            .attr('class', 'pie-segment')
            .attr('d', arc)
            .attr('fill', function(d) {
                return color(d.data[self.options.segments.label]);
            })
            .on('mouseover', pieTip.show)
            .on('mouseout', pieTip.hide);
    }
Пример #26
0
ReactPieChartD3.update = function (el, props) {
  var radius = Math.min(width, height) / 2;
  var data = props.data;
  if (!data) return;

  var color = d3.scale.category20b();

  var arc = d3.svg.arc()
    .outerRadius(radius);

  var pie = d3.layout.pie()
    .value(function(d) { return d.votes; })
    .sort(null);

  var path = svg.selectAll('path')
    .data(pie(data.choices));

  path.exit().remove();

  path.enter()
    .append('path');

  path.attr('d', arc)
    .attr('fill', function(d) {
      return color(d.data.title);
    });

  var keys = html.selectAll('li.key')
    .data(color.domain());

  keys.enter().append('li')
    .attr('class', 'key')
    .style('background', color)
    .text(function (d) {
      return d;
    });
};
Пример #27
0
if(typeof this.onRender=="function"){this.onRender(args)}},_addListeners:function(){this.graph.element.addEventListener("mousemove",function(e){this.visible=true;this.update(e)}.bind(this),false);this.graph.onUpdate(function(){this.update()}.bind(this));this.graph.element.addEventListener("mouseout",function(e){if(e.relatedTarget&&!(e.relatedTarget.compareDocumentPosition(this.graph.element)&Node.DOCUMENT_POSITION_CONTAINS)){this.hide()}}.bind(this),false)}});Rickshaw.namespace("Rickshaw.Graph.JSONP");Rickshaw.Graph.JSONP=Rickshaw.Class.create(Rickshaw.Graph.Ajax,{request:function(){$.ajax({url:this.dataURL,dataType:"jsonp",success:this.success.bind(this),error:this.error.bind(this)})}});Rickshaw.namespace("Rickshaw.Graph.Legend");Rickshaw.Graph.Legend=function(args){var element=this.element=args.element;var graph=this.graph=args.graph;var self=this;element.classList.add("rickshaw_legend");var list=this.list=document.createElement("ul");element.appendChild(list);var series=graph.series.map(function(s){return s}).reverse();this.lines=[];this.addLine=function(series){var line=document.createElement("li");line.className="line";var swatch=document.createElement("div");swatch.className="swatch";swatch.style.backgroundColor=series.color;line.appendChild(swatch);var label=document.createElement("span");label.className="label";label.innerHTML=series.name;line.appendChild(label);list.appendChild(line);line.series=series;if(series.noLegend){line.style.display="none"}var _line={element:line,series:series};if(self.shelving){self.shelving.addAnchor(_line);self.shelving.updateBehaviour()}if(self.highlighter){self.highlighter.addHighlightEvents(_line)}self.lines.push(_line)};series.forEach(function(s){self.addLine(s)});graph.onUpdate(function(){})};Rickshaw.namespace("Rickshaw.Graph.RangeSlider");Rickshaw.Graph.RangeSlider=function(args){var element=this.element=args.element;var graph=this.graph=args.graph;$(function(){$(element).slider({range:true,min:graph.dataDomain()[0],max:graph.dataDomain()[1],values:[graph.dataDomain()[0],graph.dataDomain()[1]],slide:function(event,ui){graph.window.xMin=ui.values[0];graph.window.xMax=ui.values[1];graph.update();if(graph.dataDomain()[0]==ui.values[0]){graph.window.xMin=undefined}if(graph.dataDomain()[1]==ui.values[1]){graph.window.xMax=undefined}}})});element[0].style.width=graph.width+"px";graph.onUpdate(function(){var values=$(element).slider("option","values");$(element).slider("option","min",graph.dataDomain()[0]);$(element).slider("option","max",graph.dataDomain()[1]);if(graph.window.xMin==undefined){values[0]=graph.dataDomain()[0]}if(graph.window.xMax==undefined){values[1]=graph.dataDomain()[1]}$(element).slider("option","values",values)})};Rickshaw.namespace("Rickshaw.Graph.Renderer");Rickshaw.Graph.Renderer=Rickshaw.Class.create({initialize:function(args){this.graph=args.graph;this.tension=args.tension||this.tension;this.graph.unstacker=this.graph.unstacker||new Rickshaw.Graph.Unstacker({graph:this.graph});this.configure(args)},seriesPathFactory:function(){},seriesStrokeFactory:function(){},defaults:function(){return{tension:.8,strokeWidth:2,unstack:true,padding:{top:.01,right:0,bottom:.01,left:0},stroke:false,fill:false}},domain:function(){var values={xMin:[],xMax:[],y:[]};var stackedData=this.graph.stackedData||this.graph.stackData();var firstPoint=stackedData[0][0];var xMin=firstPoint.x;var xMax=firstPoint.x;var yMin=firstPoint.y+firstPoint.y0;var yMax=firstPoint.y+firstPoint.y0;stackedData.forEach(function(series){series.forEach(function(d){var y=d.y+d.y0;if(y<yMin)yMin=y;if(y>yMax)yMax=y});if(series[0].x<xMin)xMin=series[0].x;if(series[series.length-1].x>xMax)xMax=series[series.length-1].x});xMin-=(xMax-xMin)*this.padding.left;xMax+=(xMax-xMin)*this.padding.right;yMin=this.graph.min==="auto"?yMin:this.graph.min||0;yMax=this.graph.max||yMax;if(this.graph.min==="auto"||yMin<0){yMin-=(yMax-yMin)*this.padding.bottom}if(this.graph.max===undefined){yMax+=(yMax-yMin)*this.padding.top}return{x:[xMin,xMax],y:[yMin,yMax]}},render:function(){var graph=this.graph;graph.vis.selectAll("*").remove();var nodes=graph.vis.selectAll("path").data(this.graph.stackedData).enter().append("svg:path").attr("d",this.seriesPathFactory());var i=0;graph.series.forEach(function(series){if(series.disabled)return;series.path=nodes[0][i++];this._styleSeries(series)},this)},_styleSeries:function(series){var fill=this.fill?series.color:"none";var stroke=this.stroke?series.color:"none";series.path.setAttribute("fill",fill);series.path.setAttribute("stroke",stroke);series.path.setAttribute("stroke-width",this.strokeWidth);series.path.setAttribute("class",series.className)},configure:function(args){args=args||{};Rickshaw.keys(this.defaults()).forEach(function(key){if(!args.hasOwnProperty(key)){this[key]=this[key]||this.graph[key]||this.defaults()[key];return}if(typeof this.defaults()[key]=="object"){Rickshaw.keys(this.defaults()[key]).forEach(function(k){this[key][k]=args[key][k]!==undefined?args[key][k]:this[key][k]!==undefined?this[key][k]:this.defaults()[key][k]},this)}else{this[key]=args[key]!==undefined?args[key]:this[key]!==undefined?this[key]:this.graph[key]!==undefined?this.graph[key]:this.defaults()[key]}},this)},setStrokeWidth:function(strokeWidth){if(strokeWidth!==undefined){this.strokeWidth=strokeWidth}},setTension:function(tension){if(tension!==undefined){this.tension=tension}}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Line");Rickshaw.Graph.Renderer.Line=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"line",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:false,stroke:true})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Stack");Rickshaw.Graph.Renderer.Stack=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"stack",defaults:function($super){return Rickshaw.extend($super(),{fill:true,stroke:false,unstack:false})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.area().x(function(d){return graph.x(d.x)}).y0(function(d){return graph.y(d.y0)}).y1(function(d){return graph.y(d.y+d.y0)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Bar");Rickshaw.Graph.Renderer.Bar=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"bar",defaults:function($super){var defaults=Rickshaw.extend($super(),{gapSize:.05,unstack:false});delete defaults.tension;return defaults},initialize:function($super,args){args=args||{};this.gapSize=args.gapSize||this.gapSize;$super(args)},domain:function($super){var domain=$super();var frequentInterval=this._frequentInterval();domain.x[1]+=parseInt(frequentInterval.magnitude);return domain},barWidth:function(){var stackedData=this.graph.stackedData||this.graph.stackData();var data=stackedData.slice(-1).shift();var frequentInterval=this._frequentInterval();var barWidth=this.graph.x(data[0].x+frequentInterval.magnitude*(1-this.gapSize));return barWidth},render:function(){var graph=this.graph;graph.vis.selectAll("*").remove();var barWidth=this.barWidth();var barXOffset=0;var activeSeriesCount=graph.series.filter(function(s){return!s.disabled}).length;var seriesBarWidth=this.unstack?barWidth/activeSeriesCount:barWidth;var transform=function(d){var matrix=[1,0,0,d.y<0?-1:1,0,d.y<0?graph.y.magnitude(Math.abs(d.y))*2:0];return"matrix("+matrix.join(",")+")"};graph.series.forEach(function(series){if(series.disabled)return;var nodes=graph.vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:rect").attr("x",function(d){return graph.x(d.x)+barXOffset}).attr("y",function(d){return graph.y(d.y0+Math.abs(d.y))*(d.y<0?-1:1)}).attr("width",seriesBarWidth).attr("height",function(d){return graph.y.magnitude(Math.abs(d.y))}).attr("transform",transform);Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)});if(this.unstack)barXOffset+=seriesBarWidth},this)},_frequentInterval:function(){var stackedData=this.graph.stackedData||this.graph.stackData();var data=stackedData.slice(-1).shift();var intervalCounts={};for(var i=0;i<data.length-1;i++){var interval=data[i+1].x-data[i].x;intervalCounts[interval]=intervalCounts[interval]||0;intervalCounts[interval]++}var frequentInterval={count:0};Rickshaw.keys(intervalCounts).forEach(function(i){if(frequentInterval.count<intervalCounts[i]){frequentInterval={count:intervalCounts[i],magnitude:i}}});this._frequentInterval=function(){return frequentInterval};return frequentInterval}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Area");Rickshaw.Graph.Renderer.Area=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"area",defaults:function($super){return Rickshaw.extend($super(),{unstack:false,fill:false,stroke:false})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.area().x(function(d){return graph.x(d.x)}).y0(function(d){return graph.y(d.y0)}).y1(function(d){return graph.y(d.y+d.y0)}).interpolate(graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory},seriesStrokeFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y+d.y0)}).interpolate(graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory},render:function(){var graph=this.graph;graph.vis.selectAll("*").remove();var method=this.unstack?"append":"insert";var nodes=graph.vis.selectAll("path").data(this.graph.stackedData).enter()[method]("svg:g","g");nodes.append("svg:path").attr("d",this.seriesPathFactory()).attr("class","area");if(this.stroke){nodes.append("svg:path").attr("d",this.seriesStrokeFactory()).attr("class","line")}var i=0;graph.series.forEach(function(series){if(series.disabled)return;series.path=nodes[0][i++];this._styleSeries(series)},this)},_styleSeries:function(series){if(!series.path)return;d3.select(series.path).select(".area").attr("fill",series.color);if(this.stroke){d3.select(series.path).select(".line").attr("fill","none").attr("stroke",series.stroke||d3.interpolateRgb(series.color,"black")(.125)).attr("stroke-width",this.strokeWidth)}if(series.className){series.path.setAttribute("class",series.className)}}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Pie");Rickshaw.Graph.Renderer.Pie=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"pie",defaults:function($super){var defaults=Rickshaw.extend($super(),{innerRadius:0,outerRadius:100,scheme:"classic9",unstack:false});delete defaults.tension;return defaults},initialize:function($super,args){args=args||{};this.innerRadius=args.innerRadius||this.innerRadius;this.scheme=args.scheme||this.scheme;$super(args)},render:function(){var graph=this.graph;graph.vis.selectAll("*").remove();var pie=d3.layout.pie().sort(null).value(function(d){return d.y});var palette=new Rickshaw.Color.Palette({scheme:graph.scheme});var arc=d3.svg.arc().outerRadius(this.outerRadius-10).innerRadius(this.innerRadius);var g=graph.vis.selectAll(".arc").data(pie(graph.series[0].data)).enter().append("g").attr("transform","translate("+graph.width/2+","+graph.height/2+")").attr("class","arc");g.append("path").attr("d",arc).style("fill",function(d){return palette.color()});g.append("text").attr("transform",function(d){return"translate("+arc.centroid(d)+")"}).attr("dy",".35em").style("text-anchor","middle").text(function(d){return d.label})}});Rickshaw.namespace("Rickshaw.Graph.Renderer.ScatterPlot");Rickshaw.Graph.Renderer.ScatterPlot=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"scatterplot",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:true,stroke:false,padding:{top:.01,right:.01,bottom:.01,left:.01},dotSize:4})},initialize:function($super,args){$super(args)},render:function(){var graph=this.graph;graph.vis.selectAll("*").remove();graph.series.forEach(function(series){if(series.disabled)return;var nodes=graph.vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:circle").attr("cx",function(d){return graph.x(d.x)}).attr("cy",function(d){return graph.y(d.y)}).attr("r",function(d){return"r"in d?d.r:graph.renderer.dotSize});Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)})},this)}});Rickshaw.namespace("Rickshaw.Graph.Smoother");Rickshaw.Graph.Smoother=function(args){this.graph=args.graph;this.element=args.element;var self=this;this.aggregationScale=1;if(this.element){$(function(){$(self.element).slider({min:1,max:100,slide:function(event,ui){self.setScale(ui.value);self.graph.update()}})})}self.graph.stackData.hooks.data.push({name:"smoother",orderPosition:50,f:function(data){if(self.aggregationScale==1)return data;var aggregatedData=[];data.forEach(function(seriesData){var aggregatedSeriesData=[];while(seriesData.length){var avgX=0,avgY=0;var slice=seriesData.splice(0,self.aggregationScale);slice.forEach(function(d){avgX+=d.x/slice.length;avgY+=d.y/slice.length});aggregatedSeriesData.push({x:avgX,y:avgY})}aggregatedData.push(aggregatedSeriesData)});return aggregatedData}});this.setScale=function(scale){if(scale<1){throw"scale out of range: "+scale}this.aggregationScale=scale;this.graph.update()}};Rickshaw.namespace("Rickshaw.Graph.Unstacker");Rickshaw.Graph.Unstacker=function(args){this.graph=args.graph;var self=this;this.graph.stackData.hooks.after.push({name:"unstacker",f:function(data){if(!self.graph.renderer.unstack)return data;data.forEach(function(seriesData){seriesData.forEach(function(d){d.y0=0})});return data}})};Rickshaw.namespace("Rickshaw.Series");Rickshaw.Series=Rickshaw.Class.create(Array,{initialize:function(data,palette,options){options=options||{};this.palette=new Rickshaw.Color.Palette(palette);this.timeBase=typeof options.timeBase==="undefined"?Math.floor((new Date).getTime()/1e3):options.timeBase;var timeInterval=typeof options.timeInterval=="undefined"?1e3:options.timeInterval;this.setTimeInterval(timeInterval);if(data&&typeof data=="object"&&data instanceof Array){data.forEach(function(item){this.addItem(item)},this)}},addItem:function(item){if(typeof item.name==="undefined"){throw"addItem() needs a name"}item.color=item.color||this.palette.color(item.name);item.data=item.data||[];if(item.data.length==0&&this.length&&this.getIndex()>0){this[0].data.forEach(function(plot){item.data.push({x:plot.x,y:0})})}else if(item.data.length==0){item.data.push({x:this.timeBase-(this.timeInterval||0),y:0})}this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},addData:function(data){var index=this.getIndex();Rickshaw.keys(data).forEach(function(name){if(!this.itemByName(name)){this.addItem({name:name})}},this);this.forEach(function(item){item.data.push({x:(index*this.timeInterval||1)+this.timeBase,y:data[item.name]||0})},this)},getIndex:function(){return this[0]&&this[0].data&&this[0].data.length?this[0].data.length:0},itemByName:function(name){for(var i=0;i<this.length;i++){if(this[i].name==name)return this[i]}},setTimeInterval:function(iv){this.timeInterval=iv/1e3},setTimeBase:function(t){this.timeBase=t},dump:function(){var data={timeBase:this.timeBase,timeInterval:this.timeInterval,items:[]};this.forEach(function(item){var newItem={color:item.color,name:item.name,data:[]};item.data.forEach(function(plot){newItem.data.push({x:plot.x,y:plot.y})});data.items.push(newItem)});return data},load:function(data){if(data.timeInterval){this.timeInterval=data.timeInterval}if(data.timeBase){this.timeBase=data.timeBase}if(data.items){data.items.forEach(function(item){this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},this)}}});Rickshaw.Series.zeroFill=function(series){Rickshaw.Series.fill(series,0)};Rickshaw.Series.fill=function(series,fill){var x;var i=0;var data=series.map(function(s){return s.data});while(i<Math.max.apply(null,data.map(function(d){return d.length}))){x=Math.min.apply(null,data.filter(function(d){return d[i]}).map(function(d){return d[i].x}));data.forEach(function(d){if(!d[i]||d[i].x!=x){d.splice(i,0,{x:x,y:fill})}});i++}};Rickshaw.namespace("Rickshaw.Series.FixedDuration");Rickshaw.Series.FixedDuration=Rickshaw.Class.create(Rickshaw.Series,{initialize:function(data,palette,options){var options=options||{};if(typeof options.timeInterval==="undefined"){throw new Error("FixedDuration series requires timeInterval")}if(typeof options.maxDataPoints==="undefined"){throw new Error("FixedDuration series requires maxDataPoints")}this.palette=new Rickshaw.Color.Palette(palette);this.timeBase=typeof options.timeBase==="undefined"?Math.floor((new Date).getTime()/1e3):options.timeBase;this.setTimeInterval(options.timeInterval);if(this[0]&&this[0].data&&this[0].data.length){this.currentSize=this[0].data.length;this.currentIndex=this[0].data.length}else{this.currentSize=0;this.currentIndex=0}this.maxDataPoints=options.maxDataPoints;if(data&&typeof data=="object"&&data instanceof Array){data.forEach(function(item){this.addItem(item)},this);this.currentSize+=1;this.currentIndex+=1}this.timeBase-=(this.maxDataPoints-this.currentSize)*this.timeInterval;if(typeof this.maxDataPoints!=="undefined"&&this.currentSize<this.maxDataPoints){for(var i=this.maxDataPoints-this.currentSize-1;i>0;i--){this.currentSize+=1;this.currentIndex+=1;this.forEach(function(item){item.data.unshift({x:((i-1)*this.timeInterval||1)+this.timeBase,y:0,i:i})},this)}}},addData:function($super,data){$super(data);this.currentSize+=1;this.currentIndex+=1;if(this.maxDataPoints!==undefined){while(this.currentSize>this.maxDataPoints){this.dropData()}}},dropData:function(){this.forEach(function(item){item.data.splice(0,1)});this.currentSize-=1},getIndex:function(){return this.currentIndex}});
Пример #28
0
    this.reactComp = reactComp;

    this.par = Object.assign({}, this.defaultParams, params);

    let size = 250;

    let width = size - 20,
      height = size - 20,
      radius = Math.min(width, height) / 2;
    let fullWidth = size;
    let fullHeight = size;

    this.arc = d3.svg.arc()
      .outerRadius(radius - 10);

    this.pie = d3.layout.pie()
      .sort(null)
      .value(function(d) {
        return d.value;
      });

    this.svg = loc.append('svg')
      .attr('id', 'd3graphSVG')
      .style('display', 'inline-block')
      .style('position', 'absolute')
      .attr('preserveAspectRatio', 'xMinYMin slice')
      .attr('viewBox', '0 0 ' + fullWidth + ' ' + fullHeight)
      .append('g')
      .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');

    this.tooltip = d3.select('body')
Пример #29
0
	render: function render() {
		var _props = this.props;
		var data = _props.data;
		var width = _props.width;
		var height = _props.height;
		var margin = _props.margin;
		var colorScale = _props.colorScale;
		var innerRadius = _props.innerRadius;
		var outerRadius = _props.outerRadius;
		var labelRadius = _props.labelRadius;
		var padRadius = _props.padRadius;
		var cornerRadius = _props.cornerRadius;
		var sort = _props.sort;
		var x = _props.x;
		var y = _props.y;
		var values = _props.values;
		var innerWidth = this._innerWidth;
		var innerHeight = this._innerHeight;

		var pie = d3.layout.pie().value(function (e) {
			return y(e);
		});

		if (typeof sort !== "undefined") {
			pie = pie.sort(sort);
		}

		var radius = Math.min(innerWidth, innerHeight) / 2;
		if (!innerRadius) {
			innerRadius = radius * 0.8;
		}

		if (!outerRadius) {
			//outerRadius = radius * 0.4;
		}

		if (!labelRadius) {
			// labelRadius = radius * 0.9;
		}

		var arc = d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius).padRadius(padRadius).cornerRadius(cornerRadius);

		var outerArc = d3.svg.arc().innerRadius(labelRadius).outerRadius(labelRadius);

		var pieData = pie(values(data));

		var translation = "translate(" + innerWidth / 2 + ", " + innerHeight / 2 + ")";
		return React.createElement(
			"div",
			null,
			React.createElement(
				Chart,
				{ height: height, width: width, margin: margin },
				React.createElement(
					"g",
					{ transform: translation },
					React.createElement(DataSet, {
						width: innerWidth,
						height: innerHeight,
						colorScale: colorScale,
						pie: pieData,
						arc: arc,
						outerArc: outerArc,
						radius: radius,
						x: x,
						y: y,
						onMouseEnter: this.onMouseEnter,
						onMouseLeave: this.onMouseLeave
					})
				),
				this.props.children
			),
			React.createElement(Tooltip, this.state.tooltip)
		);
	}
Пример #30
0
Donut3D.draw = function(id,
                        data,
                        x /*center x*/,
                        y/*center y*/,
                        rx/*radius x*/,
                        ry/*radius y*/,
                        h/*height*/,
                        ir/*inner radius*/){
  var _data = d3.layout.pie().sort(null).value(function(d) {
    return d.value;
  })(data);

  var slices = d3.select("#"+id).append("g").attr("transform", "translate(" + x + "," + y + ")")
    .attr("class", "slices");

  // Inner part slices of donut
  slices.selectAll(".innerSlice").data(_data).enter().append("path").attr("class", "innerSlice")
    .style("fill", function(d) {
      return d3.hsl(d.data.color).darker(0.7);
    })
    .attr("d",function(d) {
      return pieInner(d, rx+0.5,ry+0.5, h, ir);
    })
    .each(function(d) {
      this._current=d;
    });

  // Top visible part of donut (all slices)
  slices.selectAll(".topSlice").data(_data).enter().append("path").attr("class", "topSlice")
    .style("fill", function(d) {
      return d.data.color;
    })
    .style("stroke", function(d) {
      return d.data.color;
    })
    .attr("d", function(d) {
      return pieTop(d, rx, ry, ir);
    })
    .each(function(d){
      this._current=d;
    });

  // Front part of slice
  slices.selectAll(".outerSlice").data(_data).enter().append("path").attr("class", "outerSlice")
    .style('fill', function(d) {
      return d3.hsl(d.data.color).darker(0.7);
    })
    .attr("d",function(d) {
      return pieOuter(d, rx - .5,ry - .5, h);
    })
    .each(function(d) {
      this._current = d;
    });

  // Slices value (in percents)
  slices.selectAll(".percent").data(_data).enter().append("text").attr("class", "percent")
    .attr("x",function(d) {
      return 0.6 * rx * Math.cos(0.5 * (d.startAngle + d.endAngle));
    })
    .attr("y",function(d) {
      return 0.6 * ry * Math.sin(0.5 * (d.startAngle + d.endAngle));
    })
    .text(getPercent).each(function(d) {
      this._current=d;
    });
}