Peterson Peterson - 8 months ago 38
Javascript Question

D3 line graph getting error and not getting plotted

I am making a line graph for a set of data regarding letter vs frequency. I have made proper code for x and y axis, but while plotting line I am getting error and not able to plot the line-graph. Can someone help fix the issue?




<script src=""></script>
<script src=""></script>
<script src=""></script>


<body ng-app="myApp" ng-controller="myCtrl">



//module declaration
var app = angular.module('myApp',[]);

//Controller declaration

$scope.svgWidth = 800;//svg Width
$scope.svgHeight = 500;//svg Height

//Data in proper format
var data = [
{"letter": "A","frequency": "5.01"},
{"letter": "B","frequency": "7.80"},
{"letter": "C","frequency": "15.35"},
{"letter": "D","frequency": "22.70"},
{"letter": "E","frequency": "34.25"},
{"letter": "F","frequency": "10.21"},
{"letter": "G","frequency": "7.68"},

//removing prior svg elements ie clean up svg'svg').selectAll("*").remove();

//resetting svg height and width in current svg"svg").attr("width", $scope.svgWidth).attr("height", $scope.svgHeight);

//Setting up of our svg with proper calculations
var svg ="svg");
var margin = {top: 20, right: 20, bottom: 30, left: 40};
var width = svg.attr("width") - margin.left - margin.right;
var height = svg.attr("height") - - margin.bottom;

//Plotting our base area in svg in which chart will be shown
var g = svg.append("g");

//shifting the canvas area from left and top
g.attr("transform", "translate(" + margin.left + "," + + ")");

//X and Y scaling
var x = d3.scaleLinear().rangeRound([0, width]);
var y = d3.scaleBand().rangeRound([height, 0]).padding(0.4);

//Feeding data points on x and y axis
x.domain([0, d3.max(data, function(d) { return +d.frequency; })]);
y.domain( { return d.letter; }));

//Final Plotting

//for x axis
.attr("transform", "translate(0," + height + ")")

//for y axis
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", "0.71em")
.attr("text-anchor", "end");

//the line function for path
var lineFunction = d3.line()
.x(function(d) {return xScale(d.x); })
.y(function(d) { return yScale(d.y); })

//defining the lines
var path = g.append("path");

//plotting lines
.attr("d", lineFunction(data))
.attr("stroke", "blue")
.attr("stroke-width", 2)
.attr("fill", "none");






enter image description here


enter image description here

Answer Source

Look at the console: you don't have a xScale or a yScale.

So, the line generator should be:

var lineFunction = d3.line()
    .x(function(d) {return x(d.frequency); })
    .y(function(d) { return y(d.letter); })

Besides that, frequency is a string, not a number. So, it's a good idea turning it into a number. Write this right after your data variable:

    d.frequency = +d.frequency;

Note: it's a good practice defining your variable names properly, with descriptive names, like xScale, yAxis, chartLegend or formatNumber... Look at your line generator: you have two different x in a single line. If you don't take care, you'll mix them.