【发布时间】:2017-11-14 07:19:27
【问题描述】:
首先,我对 D3.Js 还很陌生。过去一周左右,我一直在研究 D3.JS 问题——特别是制作带有 Y 轴标签的图表。但是,我无法准确地得到我想要的图表。它几乎就在那里,但倒置或我的数据出现错误。现在,在展示所有代码之前,我将简要展示我的一些代码和主要问题的图像。我花了一些时间查看其他有类似问题的 Stack Overflow 帖子,我做了这些帖子上的内容,但仍然遇到同样的问题。
例如,我认为这个帖子会有解决方案:reversed Y-axis D3
数据如下:
[0,20,3,8] (它实际上是一个对象数组,但我认为这可能就是所需要的。
所以,开始时,yScale 是这样的:
var yScale = d3.scaleLinear()
.domain([0, maxPound]) //Value of maxpound is 20
.range([0, 350]);
正如我们所看到的,Y 图表从顶部的 0 和底部的 20 开始——起初我认为这是一个简单的解决方法,可以将域中的值翻转为:
var yScale = d3.scaleLinear()
.domain([0, maxPound]) //Value of maxpound is 20
.range([0, 350]);
我得到这张图片:
在第二张图片中,y 轴在右侧 - 20 在顶部 - 耶!但是图表是错误的。 0 现在返回 350 像素的值 - SVG 元素的高度。那就是 20 应该返回的值!如果我尝试切换图像范围值,我会遇到同样的问题!
现在是代码:
var w = 350;
var h = 350;
var barPadding = 1;
var margin = {top: 5, right: 200, bottom: 70, left: 25}
var maxPound = d3.max(poundDataArray,
function(d) {return parseInt(d.Pounds)}
);
//Y-Axis Code
var yScale = d3.scaleLinear()
.domain([maxPound, 0])
.range([0, h]);
var yAxis = d3.axisLeft()
.scale(yScale)
.ticks(5);
//Creating SVG element
var svg = d3.select(".pounds")
.append('svg')
.attr("width", w)
.attr('height', h)
.append("g")
.attr("transform", "translate(" + margin.left + "," +
margin.top + ")");
svg.selectAll("rect")
.data(poundDataArray)
.enter()
.append("rect")
.attr('x', function(d, i){
return i * (w / poundDataArray.length);
})
.attr('y', function(d) {
return 350 - yScale(d.Pounds);
})
.attr('width', (w / 4) - 25)
.attr('height', function(d){
return yScale(d.Pounds);
})
.attr('fill', 'steelblue');
//Create Y axis
svg.append("g")
.attr("class", "axis")
.call(yAxis);
感谢您的帮助!我相信错误可能出现在 y 或 height 值中,并且花了很多时间在那里乱七八糟地没有结果。
【问题讨论】:
-
您需要从比例尺的高度中减去边距吗?
-
我已经尝试过了,但我不相信是这样——第一张图片中的图表实际上正是他们想象的样子,y 轴只是颠倒了。但是确实尝试过这样做: .domain([maxPound - margin.top, 0]) 或 .range([0, h - margin.top]);如果这就是你的意思
标签: javascript html css d3.js svg