Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.39 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <meta charset="utf-8">
  3. <style>
  4.  
  5. body {
  6. font: 10px sans-serif;
  7. }
  8.  
  9. .axis path,
  10. .axis line {
  11. fill: none;
  12. stroke: #000;
  13. shape-rendering: geometricPrecision;
  14. }
  15.  
  16. .x.axis path {
  17. display: none;
  18. }
  19. .grouped-rect {
  20. stroke-width: 0.5;
  21. fill-opacity: 0.8;
  22. stroke: gray;
  23. cursor: pointer;
  24. }
  25. #chartPanel, #legendDiv {
  26. float: left;
  27. }
  28. #legendPanel, #legendText {
  29. float: right;
  30. }
  31. </style>
  32. <body>
  33. <div id="chartPanel"></div>
  34. <div id="legendPanel">
  35. <div id="legendDiv"></div>
  36. <div id="legendText"></div>
  37. </div>
  38. </body>
  39. <script src="//d3js.org/d3.v5.min.js"></script>
  40. <script>
  41. let margin = {
  42. top: 20,
  43. right: 20,
  44. bottom: 30,
  45. left: 40
  46. },
  47. xScale,
  48. groupScale,
  49. yScale,
  50. xAxis,
  51. yAxis,
  52. groupAxis,
  53. svg,
  54. svgGroup,
  55. svgGroupAxis,
  56. color,
  57. data = [{"categorie":"Student","values":[{"value":0,"rate":"Not at all"},{"value":4,"rate":"Not very much"},{"value":12,"rate":"Medium"},{"value":6,"rate":"Very much"},{"value":0,"rate":"Tremendously"}]},{"categorie":"Liberal Profession","values":[{"value":1,"rate":"Not at all"},{"value":21,"rate":"Not very much"},{"value":13,"rate":"Medium"},{"value":18,"rate":"Very much"},{"value":6,"rate":"Tremendously"}]},{"categorie":"Salaried Staff","values":[{"value":3,"rate":"Not at all"},{"value":22,"rate":"Not very much"},{"value":6,"rate":"Medium"},{"value":15,"rate":"Very much"},{"value":3,"rate":"Tremendously"}]},{"categorie":"Employee","values":[{"value":12,"rate":"Not at all"},{"value":7,"rate":"Not very much"},{"value":18,"rate":"Medium"},{"value":13,"rate":"Very much"},{"value":6,"rate":"Tremendously"}]},{"categorie":"Craftsman","values":[{"value":6,"rate":"Not at all"},{"value":15,"rate":"Not very much"},{"value":9,"rate":"Medium"},{"value":12,"rate":"Very much"},{"value":3,"rate":"Tremendously"}]},{"categorie":"Inactive","values":[{"value":6,"rate":"Not at all"},{"value":6,"rate":"Not very much"},{"value":6,"rate":"Medium"},{"value":2,"rate":"Very much"},{"value":3,"rate":"Tremendously"}]}],
  58. categorie,
  59. rateNames,
  60. width = 960 - margin.left - margin.right,
  61. height = 500 - margin.top - margin.bottom;
  62.  
  63. xScale = d3.scaleBand()
  64. .range( [30, width] );
  65.  
  66. groupScale = d3.scaleBand();
  67.  
  68. yScale = d3.scaleLinear()
  69. .range( [(height-60), 10]);
  70.  
  71. xAxis = d3.axisBottom( xScale )
  72. .tickSize(10);
  73.  
  74. groupAxis = d3.axisBottom (groupScale)
  75. .tickSizeOuter(20);
  76.  
  77. yAxis = d3.axisLeft( yScale )
  78. .tickSizeInner(4)
  79. .tickSizeOuter(8);
  80.  
  81. svg = d3.select('#chartPanel').append('svg')
  82. .attr('width', width + margin.left + margin.right )
  83. .attr('height', height + margin.top + margin.bottom )
  84. .append('g')
  85. .attr('transform', 'translate('+ margin.left + ',' + margin.right +')' );
  86.  
  87. categorie = data.map( (d) => { return d.categorie; } );
  88. rateNames = data[0].values.map( (d) => { return d.rate; });
  89.  
  90. color = d3.scaleOrdinal()
  91. .range(["#ca0020","#f4a582","#d5d5d5","#92c5de","#0571b0"]);
  92.  
  93. xScale.domain( categorie );
  94.  
  95. groupScale.domain( rateNames )
  96. .range( [10, xScale.bandwidth() ] )
  97. .paddingInner(0.2)
  98. .paddingOuter(1);
  99.  
  100. yScale.domain( [0, d3.max(data, (categorie) => { return d3.max (categorie.values, (d)=> { return d.value; } ) } )]);
  101.  
  102. svg.append('g')
  103. .attr('class', 'x-axis')
  104. .attr('transform', 'translate(0,' + (height-60) + ')' )
  105. .call(xAxis);
  106.  
  107. svgGroupAxis = svg.selectAll('.x-axis-group')
  108. .data(categorie)
  109. .enter()
  110. .append('g')
  111. .attr('class', 'x-axis-group')
  112. // .attr('transform', 'translate(0,' + height + ')' )
  113.  
  114. svgGroupAxis
  115. .attr('transform', (d)=> { return 'translate('+ xScale(d)+ ','+ (height-30) + ')'} )
  116. .call(groupAxis)
  117. .selectAll("text")
  118. .attr("y", 0)
  119. .attr("x", 9)
  120. .attr("dy", ".35em")
  121. .attr("transform", "rotate(90)")
  122. .style("text-anchor", "start");
  123.  
  124. svg.append('g')
  125. .attr('class', 'y-axis')
  126. .attr('transform', 'translate(30, 0)' )
  127. .call(yAxis)
  128.  
  129. svgGroup = svg.selectAll('bar')
  130. .data(data)
  131. .enter()
  132. .append('g')
  133. .attr('class', 'g')
  134. .attr('transform', (d) => { return "translate(" + xScale(d.categorie) + ", 0)" });
  135.  
  136. svgGroup.selectAll('rect')
  137. .data (function(d){ return d.values })
  138. .enter()
  139. .append('rect')
  140. .attr('class', 'grouped-rect')
  141. .attr('width', groupScale.bandwidth() )
  142. .attr('height', (d)=> { return ((height-60) - yScale(d.value)); })
  143. .attr('x', (d)=> { return groupScale(d.rate); })
  144. .attr('y', (d)=> { return yScale(d.value); })
  145. .style('fill', (d)=> { return color(d.rate); })
  146. .on("mouseover", function(d) {
  147. d3.select(this).style("fill", d3.rgb(color(d.rate)).darker(2));
  148. })
  149. .on("mouseout", function(d) {
  150. d3.select(this).style("fill", color(d.rate));
  151. })
  152. .append('title')
  153. .text( (d)=> { return 'Rate = ' + d.rate + '\nValue = ' + d.value } )
  154.  
  155. let legendPanel = d3.select('#legendDiv')
  156. .selectAll('div')
  157. .data(rateNames);
  158.  
  159. legendPanel
  160. .enter()
  161. .append('div')
  162. .style('width', '50px')
  163. .style('height', '50px')
  164. .style('margin', '3px')
  165. .style('background-color', (d)=> { return color(d); })
  166.  
  167. legendPanel.exit();
  168.  
  169. let legendText = d3.select('#legendText')
  170. .selectAll('div')
  171. .data(rateNames);
  172.  
  173. legendText
  174. .enter()
  175. .append('div')
  176. .style('width', '200px')
  177. .style('height', '50px')
  178. .append('div')
  179. .style('padding', '20px 5px 10px 5px')
  180. .style('font-weight' , 'bold')
  181. .text( function(d) { return d; } )
  182.  
  183.  
  184. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement