Я создаю потоковую диаграмму в d3. js версии 3, и моя потоковая диаграмма выглядит очень изменчивой.
Я использую следующий пример.
http://bl.ocks.org/WillTurman/4631136
Моя гипотеза состоит в том, что, хотя все мои даты для каждого индоссанта совпадают, причина для 'отбивной' состоит в том, что мой столбец даты не увеличивается линейно. В качестве примера 1/13/2020 будет иметь подтверждение A, B, C, D, E, F со значениями 1, 2, 0, 0, 4, 8, с повторением 1/13/2020 для каждой строки, однако вместо следующей даты, которая является 1/14/2020, она переходит к 19.01.2020 с подтверждением и значениями, имеющими соответствующие данные. Если это так, я предполагаю, что могу просто go и заполнить пропущенные даты соответственно, однако я не совсем уверен.
вот код:
<div id="streamGraph"></div>
#streamGraph {
background: #fff;
}
.axis path, .axis line {
fill: none;
stroke: #000;
stroke-width: 2px;
shape-rendering: crispEdges;
}
chart("static/data/endorsements/endorsementsUpdated.csv", "blue");
var datearray = [];
var colorrange = [];
function chart(csvpath, color) {
if (color == "blue") {
colorrange = ["#045A8D", "#2B8CBE", "#74A9CF", "#A6BDDB", "#D0D1E6", "#F1EEF6"];
}
strokecolor = colorrange[0];
var format = d3.time.format("%m/%d/%Y");
var margin = {top: 20, right: 40, bottom: 30, left: 30};
var width = 960;
var height = 400;
var x = d3.time.scale()
.range([ 0, width ]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
//.ticks(d3.time.weeks);
var y = d3.scale.linear()
.range([ height, 0 ]);
var yAxis = d3.svg.axis()
.scale(y);
var z = d3.scale.ordinal()
.range(colorrange);
var stack = d3.layout.stack()
.offset("silhouette")
.values(function(d) { return d.values; })
.x(function(d) { return d.date; })
.y(function(d) { return d.points; });
var nest = d3.nest()
.key(function(d) { return d.endorsee; });
var area = d3.svg.area()
.interpolate("cardinal")
.x(function(d) { return x(d.date); })
.y0(function(d) { return y(d.y0); })
.y1(function(d) { return y(d.y0 + d.y); });
var svg = d3.select("#streamGraph").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.attr("viewBox", "0 0 " + (width + margin.left + margin.right) + " " + (height + margin.top
+ margin.bottom))
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var graph = d3.csv(csvpath, function(data) {
data.forEach(function(d) {
d.date = format.parse(d.date);
d.endorsee = d.endorsee;
d.points =+d.points;
});
var layers = stack(nest.entries(data));
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([0, d3.max(data, function(d) { return d.y0 + d.y; })]);
svg.selectAll(".layer")
.data(layers)
.enter().append("path")
.attr("class", "layer")
.attr("d", function(d) { return area(d.values); })
.style("fill", function(d, i) { return z(i); });
svg.append("g")
.attr("class", "y axis")
.attr("transform", "translate(" + width + ", 0)")
.call(yAxis.orient("right"));
});
}
Вот фрагмент моих данных:
date endorsee value
1/13/2020 A 3
1/13/2020 B 9
1/13/2020 C 0
1/13/2020 D 0
1/13/2020 E 1
1/13/2020 F 4
1/19/2020 A 0
1/19/2020 B 2
1/19/2020 C 4
1/19/2020 D 4
1/19/2020 E 0
1/19/2020 F 0
Любая помощь будет очень признательна.