Я пытаюсь нарисовать диаграмму профиля с d3. Мои данные содержат панель из примерно 70 мер в диапазоне от 3,5 до 10 и метку для каждого бара. Я хотел бы нарисовать диаграмму так, чтобы значения больше 6 были подняты вверх и ниже 6 вниз. Значения, превышающие 6.5, становятся зелеными полосами, ниже 5,5 оборотов до красного. Ниже приведена диаграмма. Рисование диаграммы профиля (бар) с d3
Используя следующий код d3, мне удалось нарисовать график ниже - бит был немного новым для d3.
Есть несколько вопросов, по-прежнему, для которых я спрашиваю некоторую помощь: 1. Полоски являются высокими, я хотел бы использовать фиксированный диапазон от 3 до 12, чем выше зеленая полоса на графике имеет значение 7.3 и, тем не менее, достигает вершины (10px margin). 2. Я не могу отобразить значения оси y, я бы хотел отобразить 3, 6 и 9. 3. x и y-оси слишком толстые, я бы предпочел 1px. 4. Некоторые бары на панели могут не иметь значения, я бы хотел, чтобы они отображались в виде пустых баров.
Начиная с кода ниже, что делать? Где я ошибся с отображением оси. Любая помощь будет оценена по достоинству.
function draw(data) {
data.forEach(function(d) {
d.value = d.value - 6.0;
});
var margin = { top: 10, right: 10, bottom: 80, left: 50 },
padding = { top: 2, right: 2, bottom: 2, left: 2 },
width = 960 - margin.left - margin.right - padding.left - padding.right,
height = 240 - margin.top - margin.bottom - padding.top - padding.bottom;
var xScale = d3.scale.ordinal()
.rangeRoundBands([0, width], .2);
var yScale = d3.scale.linear()
.range([height - padding.top - padding.bottom, 0])
.domain([-3, 6]);
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(function(d) { return d.label; });
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(yScale([3,6,9]));
xScale.domain(data.map(function(d) { return d.label; }));
yScale.domain(d3.extent(data, function(d) { return d.value; }));
var svg = d3.select("#chart").append("svg:svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom);
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate("+padding.top+"," + (height-padding.bottom) + ")")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("transform", "rotate(-50)");
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate("+padding.left+", "+padding.top+")")
.call(yAxis)
svg.selectAll("bar")
.data(data)
.enter().append("rect")
.attr("x", function(d) { return xScale(d.label); })
.attr("y", function(d) { return yScale(d3.max([0, d.value])); })
.attr("width", xScale.rangeBand())
.attr("height", function(d) { return Math.abs(yScale(d.value)-yScale(0)); })
.style("fill", function(d) {
if(d.value < -0.5) { return "red"; }
else if (d.value > 0.5) { return "green"; }
else { return "lightgray"; }
});
}
Можете ли вы обновить свой вопрос с помощью выборочных данных? – Mark