D3.js 在D3上分组条形图的每个条形下添加标签
我对D3还比较陌生,正在尝试向分组条形图添加标签。。通过下面的实现,我只能在一个组下看到它们,而不是在两个组下看到它们 以下是数据在数据库中的外观: 类别、超出、完全满足、部分满足、不满足 商业,10,20,30,30 领导力,15,5,30,50 代码如下:D3.js 在D3上分组条形图的每个条形下添加标签,d3.js,D3.js,我对D3还比较陌生,正在尝试向分组条形图添加标签。。通过下面的实现,我只能在一个组下看到它们,而不是在两个组下看到它们 以下是数据在数据库中的外观: 类别、超出、完全满足、部分满足、不满足 商业,10,20,30,30 领导力,15,5,30,50 代码如下: var chart1 = d3.select("#svgarea2"), margin = { top: 70, right: 0, bottom: 30, left: 40 },
var chart1 = d3.select("#svgarea2"),
margin = { top: 70, right: 0, bottom: 30, left: 40 },
width = +chart1.attr("width") - margin.left - margin.right,
height = +chart1.attr("height") - margin.top - margin.bottom,
g = chart1.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//chart background color
var bg = d3.select("g").append("svg")
// .attr("width", width + margin.right + margin.left)
.attr("width", 510 + "px")
// .attr("height", height + margin.top + margin.bottom);
.attr("height", 310 + "px");
bg.append("rect")
.attr("width", "100%")
.attr("height", "100%")
.attr("fill", "#f8f8ff");
bg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//scale chart
var x0 = d3.scaleBand()
.rangeRound([0, width])
.paddingInner(0.4);
var x1 = d3.scaleBand()
.padding(0.05);
var y = d3.scaleLinear()
.rangeRound([height, 0]);
var z = d3.scaleOrdinal() //d3.schemeCategory20
// .range(["#0000ff", "#dcdcdc", "#696969", "#00008b"]);
.range(["#00008b", "#696969", "#dcdcdc", "#0000ff"]);
var columns = ['category', 'Does Not Meet', 'Partially Meets', 'Fully Meets', 'Exceed'];
var keys = columns.slice(1);
var color = d3.scaleOrdinal()
.range(["#00008b", "#696969", "#dcdcdc", "#0000ff"]);
x0.domain(data.map(function (d) { return d.category; }));
x1.domain(keys).rangeRound([0, x0.bandwidth()]);
y.domain([0, 100]).nice();
g.append("g")
.selectAll("g")
.data(data)
.enter().append("g")
.attr("transform", function (d) { return "translate(" + x0(d.category) + ",0)"; })
.selectAll("rect")
.data(function (d) { return keys.map(function (key) { return { key: key, value: d[key] }; }); })
.enter().append("rect")
.attr("x", function (d) { return x1(d.key); })
.attr("y", function (d) {
return y(d.value);
})
.attr("width", x1.bandwidth() - 7)
.attr("height", function (d) { return height - y(d.value); })
.attr("fill", function (d) { return z(d.key); })
.on("mousemove", function(d){
tooltip
.style("left", d3.event.pageX - 50 + "px")
.style("top", d3.event.pageY - 70 + "px")
.style("display", "inline-block")
.html((d.key) + "<br>" + (d.value) + "%");
});
g.append("g")
.selectAll("g")
.data(data).enter()
.append("g")
.attr("transform", function (d) { return keys })
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.attr("x", function (d) { return x0(d.category); })
.call(d3.axisBottom(x1))
.selectAll("text")
.attr("y", 15)
.attr("x", 0)
.attr("dy", ".35em")
.attr("transform", "rotate(50)")
.style("text-anchor", "start");;
g.append("g")
.attr("class", "axis")
.call(d3.axisLeft(y).ticks(null, "s"))
.append("text")
.attr("x", 2)
.attr("y", y(y.ticks().pop()) - 5)
.attr("dy", "0.32em")
.attr("fill", "#000")
.attr("font-weight", "bold")
.attr("text-anchor", "start")
.text("Employees (%)");
//chart title
g.append("text")
.attr("x", (width / 2) + 30)
.attr("y", 1 - (margin.top / 2) + 20)
.attr("text-anchor", "middle")
.style("font-size", "16px")
.style("font-weight", "bold")
.style("text-decoration", "underline")
.attr("font-family", "sans-serif")
.text("Performance Distribution");
};
var chart1=d3.选择(“svgarea2”),
边距={顶部:70,右侧:0,底部:30,左侧:40},
宽度=+图表1.attr(“宽度”)-margin.left-margin.right,
高度=+图表1.attr(“高度”)-margin.top-margin.bottom,
g=chart1.append(“g”).attr(“transform”、“translate”(“+margin.left+”,“+margin.top+”));
//图表背景色
var bg=d3.选择(“g”).追加(“svg”)
//.attr(“宽度”,宽度+边距。右侧+边距。左侧)
.attr(“宽度”,510+“像素”)
//.attr(“高度”,高度+边距。顶部+边距。底部);
.attr(“高度”,310+“像素”);
bg.append(“rect”)
.attr(“宽度”、“100%”)
.attr(“高度”、“100%”)
.attr(“填充”,“#f8f8ff”);
背景附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
//比例图
var x0=d3.scaleBand()
.rangeRound([0,宽度])
.填塞器(0.4);
var x1=d3.scaleBand()
.填充(0.05);
变量y=d3.scaleLinear()
.rangeRound([高度,0]);
var z=d3.scaleOrdinal()//d3.schemeCategory 20
//.范围([“#0000ff”、“#DCDC”、“#696969”、“#00008b”]);
.范围([“#00008b”、“#696969”、“#DCDC”、“#0000ff”);
var columns=['category'、'Not-meeting'、'Partially-meeting'、'Fully-meeting'、'except'];
var keys=columns.slice(1);
var color=d3.scaleOrdinal()
.范围([“#00008b”、“#696969”、“#DCDC”、“#0000ff”);
域(data.map(函数(d){returnd.category;}));
x1.域(键).rangeRound([0,x0.bandwidth()]);
y、 域([01100]).nice();
g、 附加(“g”)
.全选(“g”)
.数据(数据)
.enter().append(“g”)
.attr(“transform”,函数(d){return”translate(“+x0(d.category)+”,0)”;})
.selectAll(“rect”)
.data(函数(d){return key.map(函数(key){return{key:key,value:d[key]};});})
.enter().append(“rect”)
.attr(“x”,函数(d){返回x1(d.key);})
.attr(“y”,函数(d){
返回y(d值);
})
.attr(“宽度”,x1.bandwidth()-7)
.attr(“高度”,函数(d){返回高度-y(d.value);})
.attr(“fill”,函数(d){返回z(d.key);})
.on(“mousemove”,函数(d){
工具提示
.style(“左”,d3.event.pageX-50+“px”)
.样式(“顶部”,d3.event.pageY-70+“px”)
.style(“显示”、“内联块”)
.html((d.key)+“
”+(d.value)+“%”);
});
g、 附加(“g”)
.全选(“g”)
.data(data).enter()
.附加(“g”)
.attr(“转换”,函数(d){返回键})
.attr(“类”、“轴”)
.attr(“变换”、“平移(0)”、“高度+”)
.attr(“x”,函数(d){return x0(d.category);})
.call(d3.axisBottom(x1))
.selectAll(“文本”)
.attr(“y”,15)
.attr(“x”,0)
.attr(“dy”,“.35em”)
.attr(“变换”、“旋转(50)”)
.style(“文本锚定”、“开始”);;
g、 附加(“g”)
.attr(“类”、“轴”)
.call(d3.axisLeft(y).ticks(null,“s”))
.append(“文本”)
.attr(“x”,2)
.attr(“y”,y(y.ticks().pop())-5)
.attr(“dy”,“0.32em”)
.attr(“填充”、“千”)
.attr(“字体大小”、“粗体”)
.attr(“文本锚定”、“开始”)
.文本(“员工(%)”;
//图表标题
g、 附加(“文本”)
.attr(“x”,(宽度/2)+30)
.attr(“y”,1-(margin.top/2)+20)
.attr(“文本锚定”、“中间”)
.style(“字体大小”、“16px”)
.style(“字体大小”、“粗体”)
.style(“文本装饰”、“下划线”)
.attr(“字体系列”、“无衬线”)
.文本(“绩效分配”);
};
感谢您的帮助 如果您为每个条形图创建一个g元素,然后将轴、条形图等添加到每个条形图中,则该功能将起作用。例如,请参见此处: 相关代码:
var chart = g.append("g")
.selectAll("g")
.data(data)
.enter().append("g");
chart.attr("transform", function (d) { return "translate(" + x0(d.category) + ",0)"; })
.selectAll("rect")
.data(function (d) { return keys.map(function (key) { return { key: key, value: d[key] }; }); })
.enter().append("rect")
.attr("x", function (d) { return x1(d.key); })
.attr("y", function (d) {
return y(d.value);
})
.attr("width", x1.bandwidth() - 7)
.attr("height", function (d) { return height - y(d.value); })
.attr("fill", function (d) { return z(d.key); })
//APPEND AN AXIS TO THE CHART G'S
chart.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.attr("x", function (d) { return x0(d.category); })
.call(d3.axisBottom(x1))
.selectAll("text")
.attr("y", 15)
.attr("x", 0)
.attr("dy", ".35em")
.attr("transform", "rotate(50)")
.style("text-anchor", "start");
如果您为每个条形图创建一个g元素,然后将轴、条形图等添加到每个条形图中,它将起作用。例如,请参见此处: 相关代码:
var chart = g.append("g")
.selectAll("g")
.data(data)
.enter().append("g");
chart.attr("transform", function (d) { return "translate(" + x0(d.category) + ",0)"; })
.selectAll("rect")
.data(function (d) { return keys.map(function (key) { return { key: key, value: d[key] }; }); })
.enter().append("rect")
.attr("x", function (d) { return x1(d.key); })
.attr("y", function (d) {
return y(d.value);
})
.attr("width", x1.bandwidth() - 7)
.attr("height", function (d) { return height - y(d.value); })
.attr("fill", function (d) { return z(d.key); })
//APPEND AN AXIS TO THE CHART G'S
chart.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.attr("x", function (d) { return x0(d.category); })
.call(d3.axisBottom(x1))
.selectAll("text")
.attr("y", 15)
.attr("x", 0)
.attr("dy", ".35em")
.attr("transform", "rotate(50)")
.style("text-anchor", "start");