我已经构建了一个类似于此示例的图表
http://bl.ocks.org/mbostock/4679202
这里我希望每个系列都有y轴标签
以下代码是我生成图表的代码
因为它的堆叠布局。对我来说感觉有点复杂想象每个系列的y轴变换属性
var margin = {top: 10, right: 5, bottom: -6, left: 5};
var width = $(div).width(),
height = $(div).height() - margin.top - margin.bottom;
var svg = d3.select(div).append('svg')
.attr('width',width)
.attr('height',height)
.append("g")
.attr("transform", "translate("+margin.left+"," + margin.top + ")");;
var nest = d3.nest()
.key(function(d) { return d.group; });
var stack = d3.layout.stack()
.values(function(d) { return d.values; })
.x(function(d) { return d.date; })
.y(function(d) { return d.value; })
.out(function(d, y0) { d.valueOffset = y0; });
var dataByGroup = nest.entries(data);
stack(dataByGroup);
var x = d3.scale.ordinal()
.rangeRoundBands([0, width-7], .25, 0);
var y0 = d3.scale.ordinal()
.rangeRoundBands([height-15, 0], .2);
var timeFormat = d3.time.format("%c");
var MinuteNameFormat = d3.time.format("%H:%M");
var y1 = d3.scale.linear();
var formatDate = function(d,i) {if(i%3 == 0){var date = new Date(parseInt(d)); return MinuteNameFormat(date);}else{return "";} };
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(d3.time.minutes,15)
.tickFormat(formatDate);
var yAxis = d3.svg.axis()
.scale(y1)
.orient("Left")
.ticks(0)
.tickFormat(formalLabel);
x.domain(dataByGroup[0].values.map(function(d) { return d.date; }));
y0.domain(dataByGroup.map(function(d) { return d.key; }));
y1.domain([0, d3.max(data, function(d) { return d.value; })]).range([y0.rangeBand(), 0]);
var tooltip = d3.select(div)
.append("div")
.style("position", "absolute")
.style("z-index", "10").attr("class","tooltip")
.style("visibility", "hidden")
.style("background","#fff")
.style("border","1px solid #CCC")
.style("font-size", "11px")
.style("padding","11px")
.text("a simple tooltip");
var group = svg.selectAll(".group")
.data(dataByGroup)
.enter().append("g")
.attr("class", "group")
.attr("transform", function(d) { return "translate(0," + y0(d.key) + ")"; });
group.filter(function(d, i) { return !i; }).append("g")
.attr("class", "y axis")
.attr("transform", "translate(0," + y0.rangeBand() + ")")
.call(yAxis);
var tipText
var bars = group.selectAll("rect")
.data(function(d) { return d.values; })
.enter().append("g");
bars.append("rect")
.style("fill", function(d,i) { return getColor(d.ip); })
.attr("x", function(d) { return x(d.date); })
.attr("y", function(d) { return y1(d.value); })
.attr("width",x.rangeBand()) //x.rangeBand()
.attr("height", function(d) { return y0.rangeBand() - y1(d.value); });
group.filter(function(d, i) { return !i; }).append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + y0.rangeBand() + ")")
.call(xAxis);
这是我的d3图表的代码
任何人都可以建议??
答案 0 :(得分:0)
这是完全可能的,但是如果你有超过2个y轴,一个在左边,一个在右边,它会使你的图形混乱。
以下是一个示例:http://bl.ocks.org/benjchristensen/2579619
使用以下代码声明轴:
var yAxis = d3.svg.axis()
.scale(y1)
.orient("Left")
.ticks(0)
.tickFormat(formalLabel);
你只需要为每个元素添加1个,你还需要为每个元素声明一个新的y1,y2,y3 ......等。最后,您需要确保每个数据都绑定到不同的轴y1,y2,y3 ......等
希望这有帮助。