const getAxes = function (svgGroup, scales, GRAPH_HEIGHT, GRAPH_WIDTH) {

  let xAxisCall = d3.axisBottom(scales.x_scale);
  let yAxisCall = d3.axisLeft(scales.y_scale);

  svgGroup.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0, " + GRAPH_HEIGHT + ")")
    .call(xAxisCall)
    .selectAll("text")
      .attr("y", "10")
      .attr("x", "-5")
      .attr("text-anchor", "end")
      .attr("transform", "rotate(-40)");
  
  svgGroup.append("g")
    .attr("class", "y axis")
    .call(yAxisCall)

  return svgGroup;

}
const getRects = function (data, svgGroup, scales, GRAPH_HEIGHT) {

  let rects = svgGroup.selectAll('rect') // SVG Rectangle Element
    .data(data)
    .enter() //D3 Enter Link
    .append('rect')
      .attr('width', scales.x_scale.bandwidth())
      .attr('height', function(d) {
        return GRAPH_HEIGHT - scales.y_scale(d.averageWeight)
      })
      .attr('x', function(d, i) {
        return scales.x_scale(d.dog)
      })
      .attr('y', function(d) {
        return scales.y_scale(d.averageWeight)
      })
      .attr('fill', function(d, i) {
        return d3.scaleSequential
          (d3.interpolateOranges)
          .domain([0, data.length])
          (i)
      })
      .attr('stroke', 'black')
      .attr('fill-opacity', .6)

  return rects

}
const getScales = function(data, GRAPH_WIDTH, GRAPH_HEIGHT) {
  const scales = {
    x_scale: d3
      .scaleBand()
      .domain(data.map(d => d.dog))
      .range([0, GRAPH_WIDTH])
      .paddingInner(0.2)
      .paddingOuter(0.2),
    y_scale: d3
      .scaleLinear()
      .domain([0, d3.max(data, function(d) {
          return d.averageWeight;
        })
      ])
      .range([GRAPH_HEIGHT, 0])
  };

  return scales;
};
const getSVG = function(GRAPH_WIDTH, GRAPH_HEIGHT, MARGIN) {

  let svg = d3
    .select('.bar-chart')
    .append('svg') //Link
      .attr('width', GRAPH_WIDTH + MARGIN.LEFT + MARGIN.RIGHT)
      .attr('height', GRAPH_HEIGHT + MARGIN.TOP + MARGIN.BOTTOM)
      .style('border', '1px solid red')

  let g = svg.append('g')
    .attr("transform", "translate(" + MARGIN.LEFT + ", " + MARGIN.TOP + ")")

  return g;
  
}
const getData = function() {
  return [
    { dog: 'Beagle', averageWeight: 24 },
    { dog: 'Bulldog', averageWeight: 45 },
    { dog: 'English Mastiff', averageWeight: 190},
    { dog: 'German Shepherd', averageWeight: 85 },
    { dog: 'Golden Retriever', averageWeight: 70 },
    { dog: 'Great Dane', averageWeight: 145 },
    { dog: 'Rottweiler', averageWeight: 102},
    { dog: 'Samoyed', averageWeight: 50 }
  ];
};
<!DOCTYPE html>
  <head>
    <style>
      .bar-chart { border: 2px solid gray; }
    </style>
  </head>
  <body>
    <div class="bar-chart"></div>
    <script src="https://d3js.org/d3.v5.min.js"></script>
    <script src="data.js"></script>
    <script src="config/scales.js"></script>
    <script src="config/svg.js"></script>
    <script src="config/axes.js"></script>
    <script src="config/rects.js"></script>
    <script src="main.js"></script>
  </body>
</html>
const MARGIN = { TOP: 20, BOTTOM: 80, LEFT: 30, RIGHT: 30 }

const SVG_WIDTH = 300;
const SVG_HEIGHT = 300;

const GRAPH_WIDTH = SVG_WIDTH - MARGIN.LEFT - MARGIN.RIGHT;
const GRAPH_HEIGHT = SVG_HEIGHT - MARGIN.TOP - MARGIN.BOTTOM;

let data = getData();

let svgGroup = getSVG(GRAPH_WIDTH, GRAPH_HEIGHT, MARGIN);

let scales = getScales(data, GRAPH_WIDTH, GRAPH_HEIGHT);

let axes = getAxes(svgGroup, scales, GRAPH_HEIGHT, GRAPH_WIDTH);

let rects = getRects(data, svgGroup, scales, GRAPH_HEIGHT);