anchor.diff:              }
           };
   
  -        var textX = function(d, i, maxrad) {
  -            if (onRight(i)) {
  -                return Math.min(50, 2 * maxrad);
  +        var textXOffset = function(d, i) {
  +            //controls the positioning in regards to the edge of the circle
  +            return 40 * Math.cos(2 * Math.PI * i / pacticipants.length);
  +        };
  +
  +        var isFinite = function(num) {
  +            return !(num == Number.POSITIVE_INFINITY || num == Number.NEGATIVE_INFINITY)
  +        };
  +
  +
  +        var textYOffset = function(d, i) {
  +            var thing = 4 * Math.PI * i / pacticipants.length;
  +            var counterOffset = 0;
  +
  +            counterOffset = (0.2 / (20 * Math.tan(thing/2))) * 1000;
  +
  +            if(!isFinite(counterOffset)) { //Right, middle node
  +                counterOffset = 0;
               } else {
  -                return Math.max(-50, -2 * maxrad);
  -            }
  -        };
  -
  -        var textContent = function(d, i) { return this.parentNode.className.animVal; };
  +                //Near the asymptotes, it gets bigger really quickly, if it's a big number,
  +                //it's likely it should actually be on the asymptote, and therefore, have no counterOffset
  +                if(Math.abs(counterOffset) > 30) {
  +                    //Left, middle node
  +                    counterOffset = 0;
  +                }
  +            }
  +
  +            return (40 * Math.sin(2 * Math.PI * i / pacticipants.length)) - counterOffset;
  +        };
  +
  +        var textYOffset2 = function(d, i) {
  +            console.debug(d.pacticipantName, i, (40 * Math.sin(2 * Math.PI * i / pacticipants.length)))
  +            return (40 * Math.sin(2 * Math.PI * i / pacticipants.length));
  +        };
   
           var text = g.append("text").text(textContent)
  -        .attr("x", function(d, i) { return textX(d, i, maxrad); })
  +        .attr("x", function(d, i) { return textXOffset(d, i, maxrad); })
  +        .attr("y", function(d, i) { return textYOffset(d, i, maxrad); })
           .attr("text-anchor", textAnchor)
  -        .attr("transform", textRotation)
           .attr("fill", textFill);
   
           circles.on("mouseover", pacticipantMouseover).on("mouseout", pacticipantMouseout);
  
positive.code:     svg.selectAll("path").transition().duration(500).attr("stroke-width", ".35").attr("opacity", ".5");
  };
  
  window.onload = function() {
      var legendHeight = 200;
      windowWidth = window.innerWidth;
  
negative.code:     var pacticipants = [];
      var maxrad = 0;
      var pacticipantNameArray = [];
      var circleMinRadius = 150;
  
      d3.text("<%= csv_path %>", "text/csv", function(unparsedData) {
          var data=d3.csv.parseRows(unparsedData);
  