В оригинале bullet.js
из примера bostock https://bl.ocks.org/mbostock/4061961
Вместо того, чтобы брать тики из шкалы, вы получаете значения из диапазона, измеряете и помечаете
вокруг линии109
// var tickVals = x1.ticks(8);
var tickVals = rangez.concat(measurez).concat(markerz);
// Update the tick groups.
var tick = g.selectAll("g.tick")
.data(tickVals, function(d) {
return this.textContent || format(d);
});
Редактировать
Проблема возникает, если вы обновляете данные на основе новой выборки с сервера.некоторые из тиков оказываются не в том месте.Если количество маркеров, мер, диапазонов также изменяется, они также оказываются в неправильном месте.
Это зависит от выбора, который вы предоставляете для вызова пули.
Путаница вызванаплохое наименование основной программы.
var svg = d3.select("body").selectAll("svg")
.data(data)
.enter().append("svg")
.attr("class", "bullet")
.attr("width", svgWidth)
.attr("height", svgHeight)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.call(chart);
Название предполагает, что svg
- это выборка из svg
элементов.Это неверно, это выборка из g
элементов.
Функция update()
должна отражать это
function updateData() {
d3.json("mailboxes.json", function (error, data) {
d3.select("body")
.selectAll("svg")
.select('g')
.data(data)
.call(chart.duration(500));
});
}
Если в обновлении изменяется количество пулевых графиков,проблема в том, что они не создаются или удаляются при необходимости.Поэтому нам нужно создать функцию, которая будет использоваться для начальных и обновленных вызовов.
function drawCharts() {
d3.json("mailboxes.json", function (error, data) {
var svg = d3.select("body").selectAll("svg").data(data);
svg.exit().remove();
svg.enter().append("svg")
.attr("class", "bullet")
.attr("width", svgWidth)
.attr("height", svgHeight)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
d3.select("body")
.selectAll("svg")
.select('g')
.data(data)
.call(chart.duration(500));
});
}
Лучшее изменение в bullet.js [109] будет следующим:
// var tickVals = x1.ticks(8);
var tickVals = [];
rangez.concat(measurez).concat(markerz).forEach(e => {
if (tickVals.indexOf(e) == -1) tickVals.push(e);
});
// Update the tick groups.
var tick = g.selectAll("g.tick").data(tickVals);
То естьне используйте значение галочки, чтобы соответствовать, если у нас есть несколько значений в галочках, и удалите дубликаты.
Нам также нужно изменить обновление тиков, примерно на 30 строк вниз
tickUpdate.select("text")
.attr("y", height * 7 / 6);
до
tickUpdate.select("text")
.text(format)
.attr("y", height * 7 / 6);