"内插"不是一个功能

时间:2016-10-23 00:21:55

标签: javascript d3.js data-visualization

我是D3的新手并在几张图表上进行实验。在使用D3 V4构建折线图时,我遇到了以下错误。

  

d3.line(...)。x(...)。y(...)。interpolate不是函数

我认为这个错误是由于D3 v4中的函数插值不可用。如果有人可以帮助我使用插值函数的替换函数,那将会很棒。

我的代码位于以下链接

https://ghostbin.com/paste/ztans

1 个答案:

答案 0 :(得分:37)

在D3 v4.x中,线生成器使用curve来定义插值:

  

虽然线被定义为二维[x,y]点的序列,并且区域由顶线和基线类似地定义,但仍然存在将该离散表示转换为连续形状的任务:即,如何在点之间插值。为此目的提供了各种曲线[...]曲线通常不是直接构造或使用的,而是传递给 line .curve 区域 .curve 即可。 (强调我的)

所以,这个:

/* Character.h */

#define NUMBER_ATTRIBUTES 4

#define HP 0    
#define STR 1
#define INT 2
#define WIS 3
/* etc... */

int c[NUMBER_ATTRIBUTES];

应该是:

var lineFun = d3.line()
    .x(function(d){return d.month*50})
    .y(function(d){return height - (10* d.Sales)})
    .interpolate("basis")

以下是您更改的代码:



var lineFun = d3.line()
    .x(function(d){return d.month*50})
    .y(function(d){return height - (10* d.Sales)})
    .curve(d3.curveBasis);

var w = 700;
var height = 300;
var padding = 2;
var border = 2

var dataset=[5,7,2,6,1,10,8,9,11,13,16,40,15,20,25,35,36,25,28,18,17,4,22,5,3,35,46,57];

var monthlySales =[
    {
        "month":1,
        "Sales":10
    },
    {
        "month":2,
        "Sales":25
    },
    {
        "month":3,
        "Sales":12
    },
    {
        "month":4,
        "Sales":16
    },
    {
        "month":5,
        "Sales":17
    }
    ];

onload();

function onload(){

    var svg = d3.select("body")
                .append("svg")
                .attr("width",w)
                .attr("height",height)

    svg.selectAll("rect")
        .data(dataset)
        .enter()
        .append("rect")
        .attrs({
            x : function(d,i){
                return (i * (w/dataset.length)); },
            y : function(d){ return (height- (d*4))},
            width: (w/dataset.length)-padding,
            height:function(d){ return(d*4); },
            fill : function(d){return "rgb(0,"+(d*10)+",0)" ;}
        });

    svg.selectAll("text")
        .data(dataset)
        .enter()
        .append("text")
        .text(function(d){ return d})
        .attrs({

            x: function(d,i){ return (i * (w/dataset.length)) + ((((w/dataset.length) - padding)/2))},
            y: function(d) {return (height-(d*4))},
            "text-anchor" : "middle"
        })


    var lineFun = d3.line()
        .x(function(d){return d.month*50})
        .y(function(d){return height - (10* d.Sales)})
        .curve(d3.curveBasis);


    var svgLine = d3.select("body").append("svg")
        .attr("width",w)
        .attr("height",height);

    var svgPath = svgLine.append("path")
        .attrs({
            d: lineFun(monthlySales),
            "stroke": "purple",
            "stroke-width":2,
            "fill" :"none"
        })

    svgLine.selectAll("text")
        .data(monthlySales)
        .enter()
        .append("text")
        .text(function(d){return d.Sales})
        .attrs({
            x : function(d){return d.month*50 - 10},
            y : function(d){return height-(10*d.Sales) + 10},
            "font-size":"12px",
            "fill" : "#666666",
            "font-family":"sans-serif",
            "dx":".35em",
            "text-anchor":"start",
            "font-weight": function(d,i){
                if(i==0 || i == monthlySales.length-1){
                    return "bold"
                }
                else{
                    return "normal"
                }
            }
        })



}