JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://d3js.org/d3.v4.min.js"></script>
<pre...

CSS

pre#data {display:none;}

body {
  font: 10px sans-serif;
}

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

.dot {
  stroke: #000;
}

JavaScript

var item_width = 40, item_height = 60;

var margin = {top: 20, right: 50, bottom: 75, left: 40},
    width = 700 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scaleLinear()
    .range([0, width]);

var y = d3.scaleLinear()
    .range([height, 0]);

var color = d3.scaleOrdinal(d3.schemeCategory10);

var svg = d3.select("#chart").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var data = d3.csvParse( d3.select("pre#data").text() );
  // cast string to numeric
  data.forEach(function(d) {
    d.x_pos = +d.x_pos;
    d.y_pos = +d.y_pos;
    d.sales = +d.sales;
  });

  console.log(data);

  var x_offset = 5, y_offset = 5;

  x.domain(d3.extent(data, function(d) { return d.x_pos; }));        // set the x domain
  y.domain(d3.extent(data, function(d) { return d.y_pos; }));  			 // set the y domain

var firstDateData = data.filter(d=>d.date == '1-20-2017');

  var groups = svg.selectAll("g")
	  .data(firstDateData, d=> d.item_name)
	.enter().append('g')
  	.attr('transform',d=>'translate('+ (x(d.x_pos) + x_offset)+','+(y(d.y_pos) + y_offset)+')')
  
	  groups.append("rect")
	  .attr("class", "dot")
	  .attr("width", item_width)
	  .attr("height", item_height)
	  .attr("rx", 5)
	  .attr("ry", 5)
	  .style("fill", "#1f5fc6")     // color factor variable
	  .style("fill-opacity", 0.5);

  groups.append("text")
	   .attr("x", item_width/2)
	   .attr("y", item_height/2)
	   .attr("font-size", 10)
	   .attr("text-anchor", "middle")
	   .attr("fill", "black")
	   .text(function(d){ return d.item_name});

	// add a border around the main area
	var borderPath = svg.append("rect")
		.attr("x", 0)
		.attr("y", 0)
		.attr("height", height + margin.top + margin.bottom-25)
		.attr("width", width + margin.left + margin.right-41)
		.style("stroke", "black")
		.style("fill",...