堆积条形图,彩条

时间:2018-01-22 10:37:08

标签: d3.js

我在这里有一个codepen - https://codepen.io/anon/pen/xpBqxG?editors=1010

我对初始数据进行了一些简单的更改,然后创建堆积条形图。

我目前正在为每个条形图着色相同的颜色,但应该有两种颜色,堆叠图表中的每个按键一种颜色。每个酒吧应该分为两种颜色。

如何为条形图的每个部分着色相同的颜色。

.style('fill', (d, i) => {
    return colors[i];
});

1 个答案:

答案 0 :(得分:1)

style应用于组,而不是矩形:

let layers = layersArea.selectAll('.layer')
    .data(stackedSeries)
    .enter()
    .append('g')
    .attr('class', 'layer')
    .style('fill', (d, i) => {
        return colors[i];
    });

以下是仅包含此更改的代码:



let keys = [];

let dataToStack = [];
let totalData = [];

let legendKeys = ['usedInf', 'newInf'];

let w = 800;
let h = 450;

let margin = {
  top: 30,
  bottom: 40,
  left: 50,
  right: 20,
};

let width = w - margin.left - margin.right;
let height = h - margin.top - margin.bottom;

let colors = ['#FF9A00', '#FFEBB6', '#FFC400', '#B4EDA0', '#FF4436'];

let data = [{
  "one": 10,
  "two": 12,
  "three": 18,
  "four": 22,
  "five": 30,
  "six": 44,
  "seven": 25,
  "date": "2015-05-31T00:00:00"
}, {
  "one": 30,
  "two": 42,
  "three": 38,
  "four": 62,
  "five": 90,
  "six": 144,
  "seven": 95,
  "date": "2015-06-30T00:00:00"
}, {
  "one": 30,
  "two": 92,
  "three": 18,
  "four": 100,
  "five": 120,
  "six": 10,
  "seven": 110,
  "date": "2015-07-31T00:00:00"
}, ];

for (let i = 0; i < data.length; i++) {
  dataToStack.push({
    date: data[i]['date'].toString(),
    usedInf: data[i]['one'] + data[i]['two'] + data[i]['three'],
    newInf: data[i]['four'] + data[i]['five'] + data[i]['six']
  });
  totalData.push({
    date: data[i]['date'].toString(),
    total: data[i]['seven']
  });
}

let stack = d3.stack()
  .keys(legendKeys);

let stackedSeries = stack(dataToStack);


let x = d3.scaleBand()
  .domain(dataToStack.map(function(d) {
    return d.date;
  }))
  .rangeRound([0, width])
  .padding(0.05);

let y = d3.scaleLinear()
  .domain([0, d3.max(stackedSeries, function(d) {
    return d3.max(d, (d) => {
      return d[1];
    })
  })])
  .range([height, 0]);

let svg = d3.select('.chart').append('svg')
  .attr('class', 'chart')
  .attr('width', w)
  .attr('height', h);

let chart = svg.append('g')
  .classed('graph', true)
  .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');

let layersArea = chart.append('g')
  .attr('class', 'layers');

let layers = layersArea.selectAll('.layer').data(stackedSeries)
  .enter()
  .append('g')
  .attr('class', 'layer')
  .style('fill', (d, i) => {

    return colors[i];
  });

layers.selectAll('rect')
  .data((d) => {
    return d
  })

  .enter()
  .append('rect')

  .attr('height', (d, i) => {
    return y(d[0]) - y(d[1]);
  })

  .attr('y', (d) => {
    return y(d[1]);
  })

  .attr('x', (d, i) => {
    return x(d.data.date)
  })

  .attr('width', x.bandwidth());

chart.append('g')
  .classed('x axis', true)
  .attr("transform", "translate(0," + height + ")")
  .call(d3.axisBottom(x));

chart.append('g')
  .classed('y axis', true)
  .call(d3.axisLeft(y)
    .ticks(10));
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<div class="chart"></div>
&#13;
&#13;
&#13;