我试图在d3上使用scala-js外观来创建一个大约1000个整数的直方图。我已经使用其中一个例子来创建一个有点工作的模型,但是有一些风格方面我无法真正解决。
理想情况下,我想将左边的整个直方图对齐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。