<!DOCTYPE html>
<meta charset="utf-8">

<style type="text/css">
svg {
  border: 1px solid rgb(40,200,130);
}
circle {
  fill-opacity: 0.8;
}
</style>

<body>
</body>

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

<script type="text/javascript">
var xdim = "xPos",
    ydim = "yPos",
    colordim = "group";

var margin = { top: 12, right: 12, bottom: 30, left: 30 },
    width = 500 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

// create quantitative linear scales
var xscale = d3.scaleLinear()
  .domain([2, 20])
  .range([0, width]);

var yscale = d3.scaleLinear()
  .domain([2, 14])
  .range([height, 0]);

var color = d3.scaleOrdinal()
  .domain(["I", "II", "III", "IV"])
  .range(["#30C7A4","#076004","#600437","#C90975"]);

// load the data from a tsv file
d3.tsv("quartet.tsv", function(error, data) {
  if (error) console.log(error);

  // filter
  /*
  data = data.filter(function(d) {
    return d.group == "II";
  });
  */

  // coerce the data to a number
  data.forEach(function(d) {
    d[xdim] = +d[xdim];
    d[ydim] = +d[ydim];
  });

  var xAxis = d3.axisBottom()
    .scale(xscale);

  var yAxis = d3.axisLeft()
    .scale(yscale);

  // adding an svg for our visualization
  var svg = d3.select("body").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] + ")");

  svg.append("g")
    .attr("class", "y--axis")
    .call(yAxis);

  svg.append("g")
    .attr("class", "x--axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);

  // join the data to some circle elements
  var enter = svg.selectAll("circle")
    .data(data)
    .enter().append("circle")
    .attr("fill", function(d) { return color(d[colordim]); })
    .attr("cx", function(d) { return xscale(d[xdim]); })
    .attr("cy", function(d) { return yscale(d[ydim]); })
    .attr("r", 5)

  console.log(data);
});
</script>