使用scalajs和d3创建直方图

时间:2016-03-07 04:36:31

标签: javascript scala d3.js scala.js

我试图在d3上使用scala-js外观来创建一个大约1000个整数的直方图。我已经使用其中一个例子来创建一个有点工作的模型,但是有一些风格方面我无法真正解决。 enter image description here

理想情况下,我想将左边的整个直方图对齐y轴,或者至少将整个事物的中心对齐,然后将y轴移动到接近它的位置。我还想让这个直方图更像是一个密度图,其中y轴为百分比,但我还没有真正找到它。

val margin = js.Dictionary("top" -> 30, "right" -> 30, "bottom" -> 30, "left" -> 30)
val width = 2500 - margin("left") - margin("right")
val height = 500 - margin("top") - margin("bottom")

val x = d3.scale.identity().range(js.Array(values.min, values.max))

val data = d3.layout.histogram().bins(x.ticks(100))(values)

val mm: js.Function2[Bin[Double], Double, Double] = { (x: Bin[Double], y: Double) => x.y }

val m = d3.max(data, mm)

val y = d3.scale.linear().domain(js.Array(0, m)).range(js.Array(height, 0))

val xAxis = d3.svg.axis().scale(x).orient("bottom")
val yAxis = d3.svg.axis().scale(y).tickValues(js.Array(20, 40, 60, 80)).orient("right")

dom.document.getElementById("scalajsShoutOut").textContent = data.join(", ")

val 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") + ")")

val ff = (d: Bin[Double]) => "translate(" + x(d.x) + "," + y(d.y) + ")"

val bar = svg.selectAll(".bar")
  .data(data)
  .enter().append("g")
  .attr("class", "bar")
  .attr("transform", ff)

val rect = (d: Bin[Double]) => height - y(d.y)

bar.append("rect")
  .attr("x", 1)
  .attr("width", x(data(0).dx) - 1)
  .attr("height", rect)

bar.append("text")
  .attr("dy", ".75em")
  .attr("y", 6)
  .attr("x", x(data(0).dx) / 2)
  .attr("text-anchor", "middle")
  .text((d: Bin[Double]) => formatPercent(d.y))

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

svg.append("g")
  .attr("class", "y axis")
  .attr("transform", "translate(" + 0 + ", 0)")
  .call(yAxis)

有没有人对如何实现这种效果有任何见解?感谢您的帮助,对不起,我的代码现在非常hacky。

0 个答案:

没有答案