我在网页上创建了一些折线图。下面的代码很长但实际上很简单。它通过ajax从数据库中获取一些数据,然后格式化并过滤数据(因此有两个对象数组nodata i rawdata)并将数据传递给d3.js折线图。我将线图嵌入函数draw()中。此功能从单击适当的数据开始。当我开始第一个折线图时,我的工作非常完美,但是当我尝试为另一个产品加注时,它会向我抛出一个错误&t; t.slice不是函数'。工作很好,但不在一起。我错过了什么......如何重新制作折线图?
jQuery(document).ready(function($) {
function wykresy(iii) {
var fff;
//Zmienna wysyła id postu do ajaxa
var ids = iii;
var data = {
'action': 'press_release',
'ids' : ids,
'security': frontendajax.nncs
};
$.post(frontendajax.ajaxurl, data, function(response) {
var fff = response;
//String z bazą danych pochodzącą z inputu baza w adminie via custom post type 'baza'
return fff;
}).then(function(fff){
//Formatowanie stringa z bazą danych
var ttt = fff.split("; ");
var i;
//Array of objects z bazą danych
var rawdata = [];
for (i = 1 ; i < ttt.length ; i++ ) {
//Tworzenie objektów JSON z rekordami bazy danych
var obj = jQuery.parseJSON( ttt[i] );
//console.log(typeof obj);
rawdata.push(obj);
}
//console.log(data);
// Get the data
//Formatowanie daty
//Filtrowanie danych
var fel = $('#dodaty').val();
var tttt = moment(fel, "DD-MM-YYYY").toDate();
var smak = moment(rawdata[rawdata.length-1].label, "YYYY-MM-DD").subtract(8, 'month').toDate();
var nodata = [];
var w;
for(w = 0 ; w < rawdata.length ; w++) {
var y = rawdata[w];
if(moment(y.label, "YYYY-MM-DD").toDate() < smak) {
nodata.push(y);
}
}
//console.log(data);
console.log(nodata[0].label);
console.log(rawdata[0].label);
console.log(nodata[0].value1);
console.log(rawdata[0].value1);
console.log(typeof nodata[0].label);
console.log(typeof rawdata[0].label);
console.log(typeof nodata[0].value1);
console.log(typeof rawdata[0].value1);
function draw(data, iii) {
//Formatowanie wszystkich rekordów w bazie
var parselabel = d3.time.format("%Y-%m-%d").parse;
data.forEach(function(d){
return d.label = parselabel(d.label);
});
//Wartość pierwszego rekordu bazy
var first = data[0].value1;
//Wartość ostatniego rekordu bazy
var last = data[data.length - 1].value1;
//Obliczanie wartości procentowej wzrostu dla ostaniego rekordu w bazie
var lastPercent = Math.round(((data[data.length - 1].value1 - data[0].value1) / data[0].value1)*100);
//Wartość ostatniego rekordu w bazie - data
var lastDay = data[data.length - 1].label;
//Wartość pierwszego rekordu w bazie - data
var firstDay = data[0].label;
//InfoBox nad tabelą ():
$('.info-'+ iii + ' > .tthree > p > span').text(" " + lastDay.toLocaleDateString());
$('.info-'+ iii + ' > .tone > h5').html(last + "<span> PLN</span>");
//Inputy nad tabelą - zakres dat
$('.wykres-'+ iii + ' > .inputy > #oddaty').val(firstDay.toLocaleDateString());
$('.wykres-'+ iii + ' > .inputy > #dodaty').val(lastDay.toLocaleDateString());
//Marginesy dla obrazka SVG
//Na podstawie szerokości aktualnego okna przeglądarki
var szerokosci = $('.wykres').width();
//alert(szerokosci);
var margin = {top: 60, right: 40, bottom: 60, left: 60},
width = szerokosci - margin.left - margin.right,
height = 453 - margin.top - margin.bottom;
//Oblicza wartość x dla y przy funkcji mouseover
var bisectDate = d3.bisector(function(d) { return d.label; }).left;
//Format daty
var formatDate = d3.time.format("%d-%b");
//Formatowanie parametrów linii osi x i y
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);
//Rysuje oś x wykresu oraz przedziały na niej
var xAxis = d3.svg.axis().scale(x)
.orient("bottom").ticks(4).tickFormat(d3.time.format("%Y-%m-%d"));
//Rysuje oś y wykresu oraz przedziały na niej
var yAxis = d3.svg.axis().scale(y)
.orient("left").ticks(4).tickFormat(function(d) { return Math.round(((d - data[0].value1) / data[0].value1)*100) + "%"; });
//Deklaracja wykresu na osi y,x
var valueline = d3.svg.line()
.x(function(d) { return x(d.label); })
.y(function(d) { return y(d.value1); });
//Rysuje główne okno svg z grupą elementów g
var troll = d3.select("#tests-"+ iii).append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom);
var svg = troll
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
// Dodajemy domenę wartości osi x i y - zmienia skalę osi x i y z parametrów width i height na skalę określoną przez zakres danych
x.domain(d3.extent(data, function(d) { return d.label; }));
y.domain([data[0].value1, d3.max(data, function(d) {
return Math.max(d.value1); })]);
//
function make_x_axis() {
return d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(4);
}
function make_y_axis() {
return d3.svg.axis()
.scale(y)
.orient("left")
.ticks(4);
}
// Dodajemy linię wykresu danych do obrazka svg
svg.append("path")
.attr("d", valueline(data))
.attr("class", "wykresik");
// Dodajemy zdefiniowaną oś x wykresu
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
//Dodajemy zdefiniowaną oś y wykresu
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
//Rysuje element grupowy, który pomieści animacje funkcji mouseover
var focus = svg.append("g")
.style("display", "none");
//Dodajemy siatk wykresu - w tym wypadku tylko horyzontalną siatkę
svg.append("g")
.attr("class", "grid")
.call(make_y_axis()
.tickSize(-width, 0, 0)
.tickFormat("")
);
// Rysujemy linię x animacji mouseover
focus.append("line")
.attr("class", "x param")
.attr("y1", 0)
.attr("y2", height);
// Rysujemy linię y animacji mouseover
focus.append("line")
.attr("class", "y param")
.attr("x1", width)
.attr("x2", width);
// Dodajemy kółeczko animacji mouseover
focus.append("circle")
.attr("class", "y circle")
.attr("r", 6);
// Dodajemy tekst do kółeczka a aktualną wartością
focus.append("text")
.attr("class", "y1 text")
.style("opacity", 0.8)
.attr("dx", 12)
.attr("dy", "-.6em");
focus.append("text")
.attr("class", "y2 text")
.attr("dx", 12)
.attr("dy", "-.6em");
// Dodajemy tekst do kółeczka a aktualną datą
focus.append("text")
.attr("class", "y3 text")
.style("opacity", 0.8)
.attr("dx", 12)
.attr("dy", "1em");
focus.append("text")
.attr("class", "y4 text")
.attr("dx", 12)
.attr("dy", "1em");
// Dodajemy kwadrat który będzie służył jako canvas dla pozycji myszy
svg.append("rect")
.attr("width", width)
.attr("height", height)
.style("fill", "none")
.style("pointer-events", "all")
.on("mouseover", function() { focus.style("display", null); })
.on("mouseout", function() { focus.style("display", "none"); })
.on("mousemove", mousemove);
var legenda = svg.append("g");
legenda.append("text")
.attr("class", "wyniktext")
.attr("x", 0)
.attr("y", -20)
.text("Wynik: ");
legenda.append("text")
.attr("class", "mytext")
.attr("x", 80)
.attr("y", -20)
.text(lastPercent + "%");
//Funkcja definiuje animacje zależne od pozycji myszy na wykresie
function mousemove() {
////console.log(bisectDate);
var x0 = x.invert(d3.mouse(this)[0]),
i = bisectDate(data, x0, 1),
d0 = data[i - 1],
d1 = data[i],
d = x0 - d0.label > d1.label - x0 ? d1 : d0;
//console.log(d.label);
//console.log(d.value1);
focus.select("circle.y")
.attr("transform", "translate(" + x(d.label) + "," + y(d.value1) + ")");
focus.select("circle.y")
.attr("transform", "translate(" + x(d.label) + "," + y(d.value1) + ")");
focus.select("text.y1")
.attr("transform","translate(" + x(d.label) + "," + y(d.value1) + ")")
.text(d.value1);
focus.select("text.y2")
.attr("transform","translate(" + x(d.label) + "," + y(d.value1) + ")")
.text(d.value1);
focus.select("text.y3")
.attr("transform","translate(" + x(d.label) + "," + y(d.value1) + ")")
.text(formatDate(d.label));
focus.select("text.y4")
.attr("transform","translate(" + x(d.label) + "," +y(d.value1) + ")")
.text(formatDate(d.label));
legenda.select("text.mytext").text(Math.round(((d.value1 - data[0].value1) / data[0].value1)*100) + "%");
focus.select(".x")
.attr("transform","translate(" + x(d.label) + "," + 0 + ")")
.attr("y2", height);
focus.select(".y")
.attr("transform","translate(" + width * -1 + "," + y(d.value1) + ")")
.attr("x2", width + width);
}
}
$('#test').click(function(){
draw(nodata, 30);
});
$('#test3m').click(function(){
draw(rawdata, 30);
});
});
}
wykresy(30);
});
&#13;
答案 0 :(得分:3)
您似乎正在尝试重新解析最初已解析过的数据(第二次点击图表时label
已经Date
)。