gpt4 book ai didi

d3.js - 使用 Math.sqrt() 而不是 d3.scaleSqrt() 来调整 map 上的圆圈大小?

转载 作者:行者123 更新时间:2023-12-01 09:45:45 25 4
gpt4 key购买 nike

我正在构建一个 map ,其中附加到美国 map 上城市的圆圈的大小基于 CSV 中的值(枪列或 JavaScript 中的 d.guns)。

我能够在附加圆圈时使用 Math.sqrt() 来调整圆圈的大小,但我认为这不是正确的方法(或者可以吗?) :

.attr('r', function(d) {
return Math.sqrt(d.guns * 0.0010);
})

Here's how the map looks right now.

我尝试使用 d3.scaleSqrt()d3.extent 根据值调整圆圈的大小,但我在控制台中遇到了以下错误:

Console errors

这是我尝试使用 d3.scaleSqrt 时的代码:

<head>
<script>
function draw(geo_data) {
'use strict';

var margin = 75,
width = 1920 - margin,
height = 1080 - margin;

var svg = d3.select('body')
.append('svg')
.attr('width', width + margin)
.attr('height', height + margin)
.append('g')
.attr('class', 'map');

var projection = d3.geoAlbersUsa();

var path = d3.geoPath().projection(projection);

var map = svg.selectAll('path')
.data(geo_data.features)
.enter()
.append('path')
.attr('d', path)
.style('fill', 'rgba(253, 227, 167, 0.8)')
.style('stroke', 'black')
.style('stroke-width', 0.4);

d3.csv('top100cities.csv', function(error, data) {
// Converts strings to integers.

data.forEach(function(d) {
return d.guns = +d.guns;
})
var guns_extent = d3.extent(function(d) {
return d.guns;
});

var radius = d3.scaleSqrt()
.domain(guns_extent)
.range([0, 12]);

svg.append('g')
.attr('class', 'bubble')
.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('cx', function(d) {
return projection([d.lon, d.lat])[0];
})
.attr('cy', function(d) {
return projection([d.lon, d.lat])[1];
})
.attr('r', function(d) {
return radius(d.guns);
})
.style('fill', 'rgba(103, 65, 114, 0.5)');

});

};
</script>

<body>
<script>
d3.json('us_states.json', draw);
</script>
</body>

最佳答案

尽管 Xavier Guihot 的 answer在技​​术上是正确的,并提出了一个稍微偏离 D3 轨道的工作解决方案。您的代码中的错误是由于未向 d3.extent() 提供所有参数造成的;您只是忘记传入数组,即data,从中确定范围(强调我的):

# d3.extent(array[, accessor]) <>

Returns the minimum and maximum value in the given array using natural order. Providing both, the array as well as the accessor, your code would look like this:

var guns_extent = d3.extent(data, function(d) {   // Pass in data as first parameter
return d.guns;
});

下面是工作演示:

function draw(geo_data) {
'use strict';

var margin = 75,
width = 1920 - margin,
height = 1080 - margin;

var svg = d3.select('body')
.append('svg')
.attr('width', width + margin)
.attr('height', height + margin)
.append('g')
.attr('class', 'map');

var projection = d3.geoAlbersUsa();

var path = d3.geoPath().projection(projection);

var map = svg.selectAll('path')
.data(geo_data.features)
.enter()
.append('path')
.attr('d', path)
.style('fill', 'rgba(253, 227, 167, 0.8)')
.style('stroke', 'black')
.style('stroke-width', 0.4);

d3.csv("https://raw.githubusercontent.com/dieterholger/US-Gun-Manufacturing-Interactive/master/top100cities.csv", function(error, data) {
// Converts strings to integers.

data.forEach(function(d) {
return d.guns = +d.guns;
})
var guns_extent = d3.extent(data, function(d) { // Pass in data
return d.guns;
});

var radius = d3.scaleSqrt()
.domain(guns_extent)
.range([0, 12]);

svg.append('g')
.attr('class', 'bubble')
.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('cx', function(d) {
return projection([d.lon, d.lat])[0];
})
.attr('cy', function(d) {
return projection([d.lon, d.lat])[1];
})
.attr('r', function(d) {
return radius(d.guns);
})
.style('fill', 'rgba(103, 65, 114, 0.5)');

});

};

d3.json('https://raw.githubusercontent.com/dieterholger/US-Gun-Manufacturing-Interactive/master/us_states.json', draw);
<script src="https://d3js.org/d3.v4.js"></script>

关于d3.js - 使用 Math.sqrt() 而不是 d3.scaleSqrt() 来调整 map 上的圆圈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49205616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com