简体   繁体   English

如何减少分组条形图中条形之间的填充?

[英]How to reduce padding between bars in grouped bar chart?

I've a grouped bar chart based on D3 .我有一个基于D3的分组条形图。 Is there a way I can reduce the gap between bars in each group and not between the groups.有没有办法可以减少每个组中酒吧之间的差距,而不是组之间的差距。 I've a fixed width for each bar.我对每个条都有固定的宽度。

Snippet as follows:片段如下:

 //DATA var data = [ { category: "test4", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test4", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test3", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test3", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test1", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test1", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test2", type1: 150, type2: 100, type3: 0, column: "column1" }, { category: "test2", type1: 0, type2: 0, type3: 400, column: "column2" } ]; var groupData = d3 .nest() .key(function(d) { return d.column + d.category; }) .rollup(function(v) { return { ...v[0], total: v[0].type1 + v[0].type2 + v[0].type3 }; }) .entries(data) .map(function(d) { return { ...d.value }; }); //INITIAL SETUP var margin = { top: 30, right: 10, bottom: 50, left: 40 }; var width = groupData.length * 80 - margin.left - margin.right; var height = 500 - margin.top - margin.bottom; var barwidth = 40; var tip = d3 .tip() .attr("class", "d3-tip") .html(function(d) { return "<span>Test</span>"; }); var graph = d3 .select("#chart-area") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); graph.call(tip); var x0 = d3 .scaleBand() .rangeRound([0, width]) .paddingInner(0.1); var x1 = d3.scaleBand().padding(0.05); var y = d3.scaleLinear().range([height, 0]); var y1 = d3.scaleBand(); var z = d3.scaleOrdinal().range(["#98abc5", "#8a89a6"]); var stack = d3.stack(); x0.domain( data.map(function(d) { return d.category; }) ); x1 .domain( data.map(function(d) { return d.column; }) ) .range([0, x0.bandwidth()]) .padding(0.2); z.domain(Object.keys(data[0]).filter(x => x !== "category" && x !== "column")); var keys = z.domain(); //["type1", "type2", "type3"]; var stackData = stack.keys(keys)(groupData); y.domain([ 0, d3.max(groupData, function(d) { return d.total; }) ]); var serie = graph .selectAll(".serie") .data(stackData) .enter() .append("g") .attr("class", "serie") .attr("fill", function(d) { return z(d.key); }); serie .selectAll("rect") .data(function(d) { return d; }) .enter() .append("rect") .attr("class", "serie-rect") .attr("transform", function(d) { return "translate(" + x0(d.data.category) + ",0)"; }) .attr("x", function(d) { return x1(d.data.column) + x1.bandwidth() / 2 - 20; }) .attr("y", function(d) { return y(d[1]); }) .attr("height", function(d) { return y(d[0]) - y(d[1]); }) .attr("width", barwidth) .on("mouseover", tip.show) .on("mouseout", tip.hide); graph .append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x0)); graph .append("g") .attr("class", "axis") .call(d3.axisLeft(y).ticks(null, "s"));
 #chart-area { width: 600px; overflow-x: auto; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js"></script> <div id="chart-area"></div>

Change the paddingOuter in the innerScale.更改paddingOuter中的paddingOuter。 For instance:例如:

x1.paddingOuter(0.5);

Here is the code with that change.这是具有该更改的代码。

 //DATA var data = [ { category: "test4", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test4", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test3", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test3", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test1", type1: 100, type2: 200, type3: 0, column: "column1" }, { category: "test1", type1: 0, type2: 0, type3: 500, column: "column2" }, { category: "test2", type1: 150, type2: 100, type3: 0, column: "column1" }, { category: "test2", type1: 0, type2: 0, type3: 400, column: "column2" } ]; var groupData = d3 .nest() .key(function(d) { return d.column + d.category; }) .rollup(function(v) { return { ...v[0], total: v[0].type1 + v[0].type2 + v[0].type3 }; }) .entries(data) .map(function(d) { return { ...d.value }; }); //INITIAL SETUP var margin = { top: 30, right: 10, bottom: 50, left: 40 }; var width = groupData.length * 80 - margin.left - margin.right; var height = 500 - margin.top - margin.bottom; var barwidth = 40; var tip = d3 .tip() .attr("class", "d3-tip") .html(function(d) { return "<span>Test</span>"; }); var graph = d3 .select("#chart-area") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); graph.call(tip); var x0 = d3 .scaleBand() .rangeRound([0, width]) .paddingInner(0.1); var x1 = d3.scaleBand().padding(0.05); var y = d3.scaleLinear().range([height, 0]); var y1 = d3.scaleBand(); var z = d3.scaleOrdinal().range(["#98abc5", "#8a89a6"]); var stack = d3.stack(); x0.domain( data.map(function(d) { return d.category; }) ); x1 .domain( data.map(function(d) { return d.column; }) ) .range([0, x0.bandwidth()]) .paddingOuter(0.5); z.domain(Object.keys(data[0]).filter(x => x !== "category" && x !== "column")); var keys = z.domain(); //["type1", "type2", "type3"]; var stackData = stack.keys(keys)(groupData); y.domain([ 0, d3.max(groupData, function(d) { return d.total; }) ]); var serie = graph .selectAll(".serie") .data(stackData) .enter() .append("g") .attr("class", "serie") .attr("fill", function(d) { return z(d.key); }); serie .selectAll("rect") .data(function(d) { return d; }) .enter() .append("rect") .attr("class", "serie-rect") .attr("transform", function(d) { return "translate(" + x0(d.data.category) + ",0)"; }) .attr("x", function(d) { return x1(d.data.column) + x1.bandwidth() / 2 - 20; }) .attr("y", function(d) { return y(d[1]); }) .attr("height", function(d) { return y(d[0]) - y(d[1]); }) .attr("width", barwidth) .on("mouseover", tip.show) .on("mouseout", tip.hide); graph .append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x0)); graph .append("g") .attr("class", "axis") .call(d3.axisLeft(y).ticks(null, "s"));
 #chart-area { width: 600px; overflow-x: auto; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js"></script> <div id="chart-area"></div>

As you can see, this will simultaneously reduce the distance between the grouped bars and increase the distance among the groups (because, obviously, I'm not changing the range of the outer scale).正如您所看到的,这将同时减少分组条之间的距离并增加组之间的距离(因为,显然,我没有改变外部比例的范围)。 Also, not related to your question: you're overwriting the padding in the inner scale.此外,与您的问题无关:您正在覆盖内部比例的填充。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM