Beginner
Beginner

Reputation: 1030

d3.js Uncaught TypeError: o is not a function

Here is my JavaScript code for drawing a line chart using d3.jes:

var h = 100;
var w = 200;

var monthlySales = [
    {"month":10, "sales":20},
    {"month":20, "sales":14},
    {"month":30, "sales":20},
    {"month":40, "sales":21},
    {"month":50, "sales":15},
    {"month":60, "sales":22},
    {"month":70, "sales":9},
    {"month":80, "sales":6},
    {"month":90, "sales":23},
    {"month":100, "sales":7}
];

var lineFunc = d3.line()
        .x(function(d){ return d.month * 2;})
        .y(function(d){return d.sales;})
        .curve("linear");
var svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);
var viz = svg.append("path")
        .attr("d", lineFunc(monthlySales))
        .attr("stroke", "purple")
        .attr("stroke-width", 2)
        .attr("fill", "none");

It shows this error:

Uncaught TypeError: o is not a function

at t (d3.min.js:2)

at d3.html:38

And this is the d3.js code that triggers error:

for(null==i&&(u=o(s=ve())),a=0;a<=f;++a)!(a<f&&r(c=t[a],a,t))===l.... 

Upvotes: 1

Views: 6491

Answers (2)

Gerardo Furtado
Gerardo Furtado

Reputation: 102194

The problem here is just this method in the line generator:

.curve("linear");

In D3 v4.x, there is no curve named "linear". Have a look at the API.

You can simply remove it or choose a correct curve. For instance,

.curve(d3.curveBasis);

Here is your code with that change:

var h = 100;
var w = 200;

var monthlySales = [{
  "month": 10,
  "sales": 20
}, {
  "month": 20,
  "sales": 14
}, {
  "month": 30,
  "sales": 20
}, {
  "month": 40,
  "sales": 21
}, {
  "month": 50,
  "sales": 15
}, {
  "month": 60,
  "sales": 22
}, {
  "month": 70,
  "sales": 9
}, {
  "month": 80,
  "sales": 6
}, {
  "month": 90,
  "sales": 23
}, {
  "month": 100,
  "sales": 7
}];

var lineFunc = d3.line()
  .x(function(d) {
    return d.month * 2;
  })
  .y(function(d) {
    return d.sales;
  })
  .curve(d3.curveBasis);
var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);
var viz = svg.append("path")
  .attr("d", lineFunc(monthlySales))
  .attr("stroke", "purple")
  .attr("stroke-width", 2)
  .attr("fill", "none");
<script src="https://d3js.org/d3.v4.min.js"></script>

Upvotes: 4

StudioTime
StudioTime

Reputation: 23989

You're not passing into the function properly, try this:

function lineFunc(d) {
    d3.line()
        .x(function(d) {
            return d.month * 2;
        })
        .y(function(d) {
            return d.sales;
        })
        .curve("linear");
}

Here's working fiddle, it creates the svg in the body, see source

Upvotes: -1

Related Questions