123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import Ember from 'ember';
- import BaseChartComponent from 'yarn-ui/components/base-chart-component';
- export default BaseChartComponent.extend({
- // data:
- // [{label=label1, value=value1}, ...]
- // ...
- renderBarChart: function(data, title, textWidth = 50) {
- var g = this.chart.g;
- var layout = this.getLayout();
- this.renderTitleAndBG(g, title, layout);
- var maxValue = -1;
- for (var i = 0; i < data.length; i++) {
- if (data[i] instanceof Array) {
- if (data[i][0].value > maxValue) {
- maxValue = data[i][0].value;
- }
- } else {
- if (data[i].value > maxValue) {
- maxValue = data[i].value;
- }
- }
- }
- var singleBarHeight = 30;
- // 50 is for text
- var maxBarWidth = layout.x2 - layout.x1 - 2 * layout.margin - textWidth - 50;
- // 30 is for title
- var maxBarsHeight = layout.y2 - layout.y1 - 2 * layout.margin - 30;
- var gap = (maxBarsHeight - data.length * singleBarHeight) / (data.length -
- 1);
- var xScaler = d3.scale.linear()
- .domain([0, maxValue])
- .range([0, maxBarWidth]);
- // show bar text
- for (var i = 0; i < data.length; i++) {
- g.append("text")
- .text(
- function() {
- return data[i].label;
- })
- .attr("y", function() {
- return layout.y1 + singleBarHeight / 2 + layout.margin + (gap +
- singleBarHeight) * i + 30;
- })
- .attr("x", layout.x1 + layout.margin);
- }
- // show bar
- var bar = g.selectAll("bars")
- .data(data)
- .enter()
- .append("rect")
- .attr("y", function(d, i) {
- return layout.y1 + 30 + layout.margin + (gap + singleBarHeight) * i;
- })
- .attr("x", layout.x1 + layout.margin + textWidth)
- .attr("height", singleBarHeight)
- .attr("fill", function(d, i) {
- return this.colors[i];
- }.bind(this))
- .attr("width", 0);
- this.bindTooltip(bar);
- bar.transition()
- .duration(500)
- .attr("width", function(d) {
- var w;
- w = xScaler(d.value);
- // At least each item has 3 px
- w = Math.max(w, 3);
- return w;
- });
- // show bar value
- for (var i = 0; i < data.length; i++) {
- g.append("text")
- .text(
- function() {
- return data[i].value;
- })
- .attr("y", function() {
- return layout.y1 + singleBarHeight / 2 + layout.margin + (gap +
- singleBarHeight) * i + 30;
- })
- .attr("x", layout.x1 + layout.margin + textWidth + 15 + xScaler(data[i].value));
- }
- },
- draw: function() {
- this.initChart();
- this.renderBarChart(this.get("data"), this.get("title"), this.get("textWidth"));
- },
- didInsertElement: function() {
- this.draw();
- },
- })
|