bar-chart.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import Ember from 'ember';
  2. import BaseChartComponent from 'yarn-ui/components/base-chart-component';
  3. export default BaseChartComponent.extend({
  4. // data:
  5. // [{label=label1, value=value1}, ...]
  6. // ...
  7. renderBarChart: function(data, title, textWidth = 50) {
  8. var g = this.chart.g;
  9. var layout = this.getLayout();
  10. this.renderTitleAndBG(g, title, layout);
  11. var maxValue = -1;
  12. for (var i = 0; i < data.length; i++) {
  13. if (data[i] instanceof Array) {
  14. if (data[i][0].value > maxValue) {
  15. maxValue = data[i][0].value;
  16. }
  17. } else {
  18. if (data[i].value > maxValue) {
  19. maxValue = data[i].value;
  20. }
  21. }
  22. }
  23. var singleBarHeight = 30;
  24. // 50 is for text
  25. var maxBarWidth = layout.x2 - layout.x1 - 2 * layout.margin - textWidth - 50;
  26. // 30 is for title
  27. var maxBarsHeight = layout.y2 - layout.y1 - 2 * layout.margin - 30;
  28. var gap = (maxBarsHeight - data.length * singleBarHeight) / (data.length -
  29. 1);
  30. var xScaler = d3.scale.linear()
  31. .domain([0, maxValue])
  32. .range([0, maxBarWidth]);
  33. // show bar text
  34. for (var i = 0; i < data.length; i++) {
  35. g.append("text")
  36. .text(
  37. function() {
  38. return data[i].label;
  39. })
  40. .attr("y", function() {
  41. return layout.y1 + singleBarHeight / 2 + layout.margin + (gap +
  42. singleBarHeight) * i + 30;
  43. })
  44. .attr("x", layout.x1 + layout.margin);
  45. }
  46. // show bar
  47. var bar = g.selectAll("bars")
  48. .data(data)
  49. .enter()
  50. .append("rect")
  51. .attr("y", function(d, i) {
  52. return layout.y1 + 30 + layout.margin + (gap + singleBarHeight) * i;
  53. })
  54. .attr("x", layout.x1 + layout.margin + textWidth)
  55. .attr("height", singleBarHeight)
  56. .attr("fill", function(d, i) {
  57. return this.colors[i];
  58. }.bind(this))
  59. .attr("width", 0);
  60. this.bindTooltip(bar);
  61. bar.transition()
  62. .duration(500)
  63. .attr("width", function(d) {
  64. var w;
  65. w = xScaler(d.value);
  66. // At least each item has 3 px
  67. w = Math.max(w, 3);
  68. return w;
  69. });
  70. // show bar value
  71. for (var i = 0; i < data.length; i++) {
  72. g.append("text")
  73. .text(
  74. function() {
  75. return data[i].value;
  76. })
  77. .attr("y", function() {
  78. return layout.y1 + singleBarHeight / 2 + layout.margin + (gap +
  79. singleBarHeight) * i + 30;
  80. })
  81. .attr("x", layout.x1 + layout.margin + textWidth + 15 + xScaler(data[i].value));
  82. }
  83. },
  84. draw: function() {
  85. this.initChart();
  86. this.renderBarChart(this.get("data"), this.get("title"), this.get("textWidth"));
  87. },
  88. didInsertElement: function() {
  89. this.draw();
  90. },
  91. })