【发布时间】:2020-03-29 21:22:20
【问题描述】:
我已经分叉了示例 dc.js(版本 4)映射文件是 JsFiddle。我想要的是地图能够响应 Bootstrap 容器。因此,如果屏幕尺寸发生变化,地图将正确显示。 SVG 通过将宽度和高度设置为 null 以及 CSS 格式将宽度和高度设置为 100% 来响应。但是我看到底层的<g> (layer0) 元素没有响应。因此,我尝试在投影中添加比例元素。但不幸的是,我不知道如何让它像我使用 SVG 元素那样灵活。
另外,我希望可以放大。希望有人可以帮助我。
<div class="container">
<div class="row">
<div class="col">
<div id="world-map" class="responsive"></div>
</div>
</div>
</div>
<pre id="data">country total
Belgium 2
Germany 3
France 4
</pre>
function world(data) {
var xf = crossfilter(data);
var country = xf.dimension(function(d) {
return d.country;
});
var countryGroup = country.group().reduceSum(d => +d.total);
var worldMap = new dc.GeoChoroplethChart("#world-map");
d3.json("https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json").then(function(worldJson) {
worldMap
.width(null)
.height(null)
.dimension(country)
.group(countryGroup)
.colors(d3.scaleQuantize().range(["#E2F2FF", "#C4E4FF", "#9ED2FF", "#81C5FF", "#6BBAFF", "#51AEFF", "#36A2FF", "#1E96FF", "#0089FF", "#0061B5"]))
.colorDomain([0, 200])
.colorCalculator(function(d) {
return d ? worldMap.colors()(d) : '#ccc';
})
.overlayGeoJson(worldJson.features, "state", function(d) {
return d.properties.name;
})
.projection(d3.geoEquirectangular()
.scale(100)
.translate([800 / 2, 400 / 2])
)
.valueAccessor(function(kv) {
//console.log(kv);
return kv.value;
})
.title(function(d) {
return d.key + "\nTotal: " + (d.value ? d.value : 0);
});
dc.renderAll();
});
}
const data = d3.tsvParse(d3.select('pre#data').text());
world(data);
.row {
background: #f8f9fa;
margin-top: 20px;
}
.col {
border: solid 1px #6c757d;
padding: 10px;
}
pre#data {
display: none;
}
.responsive {
width: 100%;
height: 100%;
}
【问题讨论】:
-
这不是我最喜欢的解决方案,因为文本可能会失真,但您尝试过useViewBoxResizing 吗?否则,有一个folder of resizing examples 可能会有所帮助。困难的部分是检测 div 何时改变大小 - 遗憾的是,2020 年仍然没有跨浏览器方法。
-
嗨,Gordon,我找到了一个解决方案,通过将变量 innerWidth 和 innerHeight 设置为引导容器并用这些变量替换转换(800 和 400)来使 layer0 响应。但是您也知道放大图表的解决方案吗?
-
你问的是mouseZoomable还是别的什么?
-
是的,您知道如何将 mouseZoomable 应用于此地图吗?
-
哦,我忘了这是地理分布。嗯,它不是内置的,它可能不是那么难,但我不确定接下来的几天我是否有时间。现在我看到你把两个问题合二为一,聪明的把戏。
标签: javascript d3.js zooming responsive dc.js