如何在 geoChoroplethChart 重绘时更新 pointRadius()?

How can I get pointRadius() updated on geoChoroplethChart redraw?

dc.geoChoroplethChart 上,我使用路径的 pointRadius 方法设置 geojson 点的半径:

.geoPath().pointRadius(function(feature, index) {
    var v = placeGroup.all().filter(function(item) { return item.key === feature.id; })[0].value;
    return (v == 0)? 0 : pointScale(v);
});

我发现它运行良好,但在 redraw() 上,点的大小没有调整。它们在 render() 上进行了调整。我如何让它们也用 redraw() 进行调整?


这是地理图表的完整代码块,以防相关

    var projection = d3.geo.mercator()
        .scale(1)
        .translate([0, 0]);
    var path = d3.geo.path()
        .projection(projection);
    var width = 280,
        height = 200,
        b = path.bounds(places),  // [[left, top], [right, bottom]]
        x_extent = Math.abs(b[1][0] - b[0][0]),
        y_extent = Math.abs(b[1][1] - b[0][1]),
        s = (.95 / Math.max(x_extent / width, y_extent / height)),
        t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];

    // Update projection with our actual data
    projection
        .scale(s)
        .translate(t)
    ;

    var mapchart = dc.geoChoroplethChart("#map-chart");
    var valueDomain = [0, placeGroup.top(1)[0].value];
    var maxPointRadius = Math.min(width, height) / 40,
        minPointRadius = maxPointRadius / 2;

    var pointScale = d3.scale.linear()
            .domain(valueDomain)
            .range([minPointRadius, maxPointRadius]);

    mapchart.width(width)
        .height(height)
        .projection(projection)
        .dimension(placeDim)
        .group(placeGroup)
        .colors(d3.scale.quantize().range(['#feb24c','#fd8d3c','#fc4e2a','#e31a1c','#bd0026'])) //first three '#ffffcc','#ffeda0', '#fed976', last one,'#800026'
        .colorDomain(valueDomain)
        .colorCalculator(function (d) { return d ? mapchart.colors()(d) : '#ccc'; })
        .overlayGeoJson(places.features, "placeLayer", function (d) {
            return d.id;
        }).geoPath().pointRadius(function(feature, index) {
            var v = placeGroup.all().filter(function(item) { return item.key === feature.id; })[0].value;
            return (v == 0)? 0 : pointScale(v);
        });

看起来 geoChoroplethChart 不会重绘 geojson,除非投影发生变化。 (它并不期望您更改 geoPath - 如文档中所述,这主要是一种读取和确定中心的便捷方法。)

https://github.com/dc-js/dc.js/blob/develop/src/geo-choropleth-chart.js#L169-L171

作为解决方法,我建议在每次重绘图表时通过重置投影来强制重绘。类似于:

mapchart.on('preRedraw', function() {
    mapchart.projection(projection);
});

https://github.com/dc-js/dc.js/blob/develop/web/docs/api-latest.md#basemixinon--basemixin