我是D3的新手并在几张图表上进行实验。在使用D3 V4构建折线图时,我遇到了以下错误。
d3.line(...)。x(...)。y(...)。interpolate不是函数
我认为这个错误是由于D3 v4中的函数插值不可用。如果有人可以帮助我使用插值函数的替换函数,那将会很棒。
我的代码位于以下链接
答案 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"
}
}
})
}