JSFiddle - React, Tailwind, and code Playground

by Shang-De You

CSS

.xAxis path, .xAxis line, .yAxis path, .yAxis line{
  fill: none;
  stroke: black;
  shape-rendering: crispEdges;
}

.xAxis text, .yAxis text {
  font-family: sans-serif;
  font-size: 11px;
}

.rect {
  fill: steelblue;
}

.linePath {
  stroke: steelblue;
  stroke-width: 2px;
  fill: none;
}

.overlay {
  fill: none;
  pointer-event: all;
}

JavaScript

var rand = d3.random.normal(170, 10)

var dataSet = []

for(var i=0; i<100; i++){
	dataSet.push(rand())
}

var width = 500
var height = 380
var padding = {top:30, right:30, bottom:30, left:30}

var svg = d3.select("body").append("svg")
	.attr("width",width)
  .attr("height",height)

// -- layout --
var binNum = 8, rangeMin = 130, rangeMax = 210

var histogram = d3.layout.histogram()
	.range([rangeMin, rangeMax])
  .bins(binNum)
  .frequency(true)
  
var hisData = histogram(dataSet)

console.log(hisData)

// -- 比例尺 --  
var xAxisWidth = width - padding.left - padding.right
var yAxisWidth = height - padding.top - padding.bottom
var xTicks = hisData.map(function(d){ return d.x })

var xScale = d3.scale.ordinal()
	.domain(xTicks)
  .rangeRoundBands([0, xAxisWidth])

var yScale = d3.scale.linear()
	.domain([d3.min(hisData, function(d){ return d.y }), d3.max(hisData, function(d){ return d.y })])
  .range([5, yAxisWidth])

// -- 刻度 --  
var xAScale = d3.scale.linear()
  .domain([rangeMin, rangeMax])
  .range([0, xAxisWidth])

var xAxis = d3.svg.axis()
	.scale(xAScale)
  .orient("bottom")
  .ticks((rangeMax - rangeMin) / binNum)

svg.append("g")
	.attr("class", "xAxis")
  .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
  .call(xAxis)

// -- 長條圖 --
var lineGenerator = d3.svg.line()
	.x(function(d){ return xScale(d.x) })
  .y(function(d){ return height - yScale(d.y) })
  .interpolate("basis")
  
var gLine = svg.append("g")
	.attr("transform", "translate(" + padding.left + "," + ( -padding.bottom ) + ")")

gLine.append("path")
	.attr("class", "linePath")
  .attr("d", lineGenerator(hisData))

// -- 焦點元素 --
var focusCircle = svg.append("g")
	.attr("class", "focusCircle")
  .style("display", "none")
  
focusCircle.append("circle")
	.attr("r", 4.5)
  
focusCircle.append("text")
	.attr("dx", 10)
  .attr("dy", "1em")
  
// -- 對齊線元素 --
var focusLine = svg.append("g")
	.attr("class", "focusLine")
  .style("display", "none")
  
var vLine =...