javascript - D3 条形图未正确调整大小

标签 javascript d3.js

我需要一些有关使用 D3 进行缩放的帮助。在我的代码笔中,我正在尝试创建一个包含一些检索 GDP 数据的图表。

数据已正确检索和显示,但当我尝试缩放图表时,只显示一个垂直条。

有人能指出我正确的方向吗?

这是项目代码笔的链接: https://codepen.io/henrycuffy/pen/gKVdgv

main.js:

    $(document).ready(function() {
    $.getJSON(
        'https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json',
            function(data) {
            const dataset = data.data;

            const w = 1000;
            const h = 500;

            var maxX = d3.max(dataset, d => d[1]);
            var minDate = new Date(dataset[0][0]);
            var maxDate = new Date(dataset[dataset.length - 1][0]);

            var xScale = d3
                .scaleTime()
                .domain([minDate, maxDate])
                .range([0, w]);

            var yScale = d3
                .scaleLinear()
                .domain([0, maxX])
                .range([h, 0]);

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

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

            const svg = d3
                .select('body')
                .append('svg')
                .attr('width', w)
                .attr('height', h);

            svg
                .selectAll('rect')
                .data(dataset)
                .enter()
                .append('rect')
                .attr('x', (d, i) => xScale(i * 10))
                .attr('y', d => h - yScale(d[1]))
                .attr('width', 2)
                .attr('height', d => yScale(d[1]))
                .attr('fill', 'navy');
        }
    );
});

最佳答案

您正在为 x 轴使用时间刻度。但是您并没有根据时间定位条形图:

.attr('x', (d, i) => xScale(i * 10))

您正在根据其索引定位每个条。秤希望您向它提供一个日期(它采用提供的数字并将其视为一个日期,该日期非常接近纪元的开始(1970 年 1 月 1 日),这解释了定位。条形显示为一个因为在覆盖数十年的尺度上,每一个都与前一个相差 10 毫秒,这是一种难以察觉的差异)。

相反,让我们将数据中的日期提供给 x 刻度:

.attr('x', d => xScale(new Date(d[0]) )

由于数据包含日期的字符串表示形式,因此我在这里转换为日期对象。您可以在数据加载后对其执行此操作,但为了尽量减少更改,我只是在分配 x 属性时这样做。

这是更新的 plunkr .

关于javascript - D3 条形图未正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51235419/

相关文章:

javascript - 为什么这段代码会使我的浏览器崩溃?

javascript - 如何在location.reload()之后发出通知;

javascript - React - 在 api 调用之前填充数据?

javascript - 附加到路径的文本不显示

javascript - 在添加新过滤器之前重置过滤器

javascript - Yii2 ActiveForm Ajax POST 被调用两次

javascript - Node.js 异步请求超时?

javascript - d3.js 雷达图 - 在行之间填充

javascript - D3js 没有将经度/纬度点正确投影到 topojson map 上

javascript - 从具有一些非数值的数组计算最大值