如何在分组的条形图d3js v4中减小矩形大小

H4rris

我正在尝试重现该图表,但无法调整矩形的大小。

我发现的解决方案是更改图表的宽度大小,但我想保持相同的宽度,只更改图表中矩形的大小。

然后我尝试通过减去每个rect宽度来减小宽度,.attr("width", x1.bandwidth() - 50)但是现在rect之间的空间越来越大。

var data = [{
  "State": "CA",
  "AA": 100,
  "BB": 200,
  "CC": 300
}, {
  "State": "TX",
  "AA": 454,
  "BB": 344,
  "CC": 250
}];

w = 900;
h = 500;

var svg = d3.select("#chart").append("svg"),
  margin = {
    top: 20,
    right: 20,
    bottom: 30,
    left: 40
  },
  width = w - margin.left - margin.right,
  height = h - margin.top - margin.bottom,
  g = svg
  .attr("width", w)
  .attr("height", h)
  .append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// The scale spacing the groups:
var x0 = d3.scaleBand()
  .rangeRound([0, width])
  .paddingInner(0.1);

// The scale for spacing each group's bar:
var x1 = d3.scaleBand()
  .padding(0.05);

var y = d3.scaleLinear()
  .rangeRound([height, 0]);

var z = d3.scaleOrdinal()
  .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);


var keys = d3.keys(data[0]).slice(1);


x0.domain(data.map(function(d) {
  return d.State;
}));
x1.domain(keys).rangeRound([0, x0.bandwidth()]);
y.domain([0, d3.max(data, function(d) {
  return d3.max(keys, function(key) {
    return d[key];
  });
})]).nice();

g.append("g")
  .selectAll("g")
  .data(data)
  .enter().append("g")
  .attr("class", "bar")
  .attr("transform", function(d) {
    return "translate(" + x0(d.State) + ",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())
  .attr("height", function(d) {
    return height - y(d.value);
  })
  .attr("fill", function(d) {
    return z(d.key);
  });

g.append("g")
  .attr("class", "axis")
  .attr("transform", "translate(0," + height + ")")
  .call(d3.axisBottom(x0));

g.append("g")
  .attr("class", "axis")
  .call(d3.axisLeft(y).ticks(null, "s"))
  .append("text")
  .attr("x", 2)
  .attr("y", y(y.ticks().pop()) + 0.5)
  .attr("dy", "0.32em")
  .attr("fill", "#000")
  .attr("font-weight", "bold")
  .attr("text-anchor", "start")
  .text("Population");

var legend = g.append("g")
  .attr("font-family", "sans-serif")
  .attr("font-size", 10)
  .attr("text-anchor", "end")
  .selectAll("g")
  .data(keys.slice().reverse())
  .enter().append("g")
  .attr("transform", function(d, i) {
    return "translate(0," + i * 20 + ")";
  });

legend.append("rect")
  .attr("x", width - 17)
  .attr("width", 15)
  .attr("height", 15)
  .attr("fill", z)
  .attr("stroke", z)
  .attr("stroke-width", 2)
  .on("click", function(d) {
    update(d)
  });

legend.append("text")
  .attr("x", width - 24)
  .attr("y", 9.5)
  .attr("dy", "0.32em")
  .text(function(d) {
    return d;
  });

var filtered = [];

////
//// Update and transition on click:
////

function update(d) {

  //
  // Update the array to filter the chart by:
  //

  // add the clicked key if not included:
  if (filtered.indexOf(d) == -1) {
    filtered.push(d);
    // if all bars are un-checked, reset:
    if (filtered.length == keys.length) filtered = [];
  }
  // otherwise remove it:
  else {
    filtered.splice(filtered.indexOf(d), 1);
  }

  //
  // Update the scales for each group(/states)'s items:
  //
  var newKeys = [];
  keys.forEach(function(d) {
    if (filtered.indexOf(d) == -1) {
      newKeys.push(d);
    }
  })
  x1.domain(newKeys).rangeRound([0, x0.bandwidth()]);
  y.domain([0, d3.max(data, function(d) {
    return d3.max(keys, function(key) {
      if (filtered.indexOf(key) == -1) return d[key];
    });
  })]).nice();

  //
  // Filter out the bands that need to be hidden:
  //
  var bars = svg.selectAll(".bar").selectAll("rect")
    .data(function(d) {
      return keys.map(function(key) {
        return {
          key: key,
          value: d[key]
        };
      });
    })

  bars.filter(function(d) {
      return filtered.indexOf(d.key) > -1;
    })
    .transition()
    .attr("x", function(d) {
      return (+d3.select(this).attr("x")) + (+d3.select(this).attr("width")) / 2;
    })
    .attr("height", 0)
    .attr("width", 0)
    .attr("y", function(d) {
      return height;
    })
    .duration(500);

  //
  // Adjust the remaining bars:
  //
  bars.filter(function(d) {
      return filtered.indexOf(d.key) == -1;
    })
    .transition()
    .attr("x", function(d) {
      return x1(d.key);
    })
    .attr("y", function(d) {
      return y(d.value);
    })
    .attr("height", function(d) {
      return height - y(d.value);
    })
    .attr("width", x1.bandwidth())
    .attr("fill", function(d) {
      return z(d.key);
    })
    .duration(500);


  // update legend:
  legend.selectAll("rect")
    .transition()
    .attr("fill", function(d) {
      if (filtered.length) {
        if (filtered.indexOf(d) == -1) {
          return z(d);
        } else {
          return "white";
        }
      } else {
        return z(d);
      }
    })
    .duration(100);

}
* {
  margin: 0;
  padding: 0;
  border: 0;
}

body {
  background: #ffd;
}

.axis .domain {
  display: none;
}
<script src="https://d3js.org/d3.v4.min.js">
</script>
<div id="chart"></div>

有任何想法吗 ?

烟熏振动器

我不完全明白。如何在不增加杆间距的情况下减小杆的宽度?

制作更细的条形的更简单方法是将padding更改paddingInner为更大的百分比:

var x1 = d3.scaleBand()
  .padding(0.2);

您引用的图表构成了组之间的空间。因此,请更改x0填充:

var x0 = d3.scaleBand()
  .rangeRound([0, width])
  .paddingInner(0.3);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将文本追加到d3js v4中的分组条形图

来自分类Dev

在d3js中创建基本的条形图

来自分类Dev

D3.js-如何在放大分组的条形图时裁剪矩形外部的区域

来自分类Dev

D3.js-如何在放大分组的条形图时裁剪矩形外部的区域

来自分类Dev

如何在c3.js中获得分组条形图(堆栈图)的圆角

来自分类Dev

如何使用angularjs在d3js中制作动态条形图

来自分类Dev

D3.js中的分组条形图

来自分类Dev

D3js 水平条形图:如何从每个条形末尾的数据中添加数字?

来自分类Dev

如何在 d3 v4 中制作可点击的过渡条形图?

来自分类Dev

如何使用json数据在d3.js中创建垂直分组的条形图?

来自分类Dev

如何在d3.js中创建分层条形图

来自分类Dev

如何在d3.js中创建动态条形图?

来自分类Dev

如何在d3.js中更新条形图?

来自分类Dev

更改d3.js条形图矩形大小

来自分类Dev

更改d3.js条形图矩形大小

来自分类Dev

如何在d3中的分组条形图数据的右侧显示第二个y轴

来自分类Dev

如何在amCharts中创建分组的条形图?

来自分类Dev

如何制作可点击的过渡条形图以在 d3 v4 中显示 3 个图形?

来自分类Dev

调整d3.js条形图的大小

来自分类Dev

调整d3.js条形图的大小

来自分类Dev

如何在c3.js中在x轴上制作倒置条形图

来自分类Dev

如何在 Python3 中制作条形图?

来自分类Dev

如何在matplotlib中绘制伪3d条形图?

来自分类Dev

如何在d3中用附带的文本更新条形图?

来自分类Dev

如何在 d3 中绘制镜像 x 轴(倒置)条形图?

来自分类Dev

尝试更新d3.js中的条形图

来自分类Dev

反转d3.js中堆积的条形图

来自分类Dev

d3.js中的简单条形图

来自分类Dev

尝试更新d3.js中的条形图

Related 相关文章

热门标签

归档