gpt4 book ai didi

javascript - 使用 D3.js 的响应式词云

转载 作者:行者123 更新时间:2023-11-28 03:19:02 26 4
gpt4 key购买 nike

我正在尝试使用 d3.js 实现响应式词云。我还需要能够更新/更改数据。

有很多基于 Jason Davies 很好的解决方案的例子。我正在尝试调整词云实现 (found here)以满足我的要求。

这是我的代码。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<script type="text/javascript" src="bower_components/d3/d3.min.js"></script>
<script type="text/javascript" src="bower_components/d3-cloud/d3.layout.cloud.js"></script>
<script type="text/javascript" src="tags.js"></script>

<body>
<div id="wordcloud">
<div id="vis"></div>
</div>

<script>

var w = window.innerWidth, h = window.innerHeight;

var fontSize;

var layout = d3.layout.cloud()
.timeInterval(Infinity)
.size([w, h])
.fontSize(function(d) {
return fontSize(+d.value);
})
.text(function(d) {
return d.key;
})
.on("end", draw);

var svg = d3.select("#vis").append("svg")
.attr("width", w)
.attr("height", h);

var vis = svg.append("g").attr("transform", "translate(" + [w >> 1, h >> 1] + ")");

update();

if(window.attachEvent) {
window.attachEvent('onresize', update);
}
else if(window.addEventListener) {
window.addEventListener('resize', update);
}

function draw(data, bounds) {
var w = window.innerWidth,
h = window.innerHeight;

// ***
svg.remove();
svg = d3.select("#vis").append("svg")
.attr("width", w)
.attr("height", h);

vis = svg.append("g").attr("transform", "translate(" + [w >> 1, h >> 1] + ")");
// ***

svg.attr("width", w).attr("height", h);

scale = bounds ? Math.min(
w / Math.abs(bounds[1].x - w / 2),
w / Math.abs(bounds[0].x - w / 2),
h / Math.abs(bounds[1].y - h / 2),
h / Math.abs(bounds[0].y - h / 2)) / 2 : 1;

var text = vis.selectAll("text")
.data(data, function(d) {
return d.text.toLowerCase();
});
text.transition()
.duration(1000)
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.style("font-size", function(d) {
return d.size + "px";
});
text.enter().append("text")
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.style("font-size", function(d) {
return d.size + "px";
})
.style("opacity", 1e-6)
.transition()
.duration(1000)
.style("opacity", 1);
text.style("font-family", function(d) {
return d.font;
})
.style("fill", function(d) {
return fill(d.text.toLowerCase());
})
.text(function(d) {
return d.text;
});

vis.transition().attr("transform", "translate(" + [w >> 1, h >> 1] + ")scale(" + scale + ")");
}

function update() {
layout.font('impact').spiral('archimedean');
fontSize = d3.scale['sqrt']().range([10, 100]);
if (tags.length){
fontSize.domain([+tags[tags.length - 1].value || 1, +tags[0].value]);
}
layout.stop().words(tags).start();
}

function changeWords(newTags) {
tags = newTags;
update();
}
</script>

此解决方案适用于整个窗口。但我希望词云显示在 div 内。

当我尝试将 var w = window.innerWidth, h = window.innerHeight; 替换为 var w = $('#wordcloud').innerWidth(), h = $ ('#wordcloud').innerHeight(); 或类似的东西,它不起作用。
在我的实际应用程序中,我想使用这个解决方案,我在其他容器中有一个深度嵌套的 div 。 div 没有明确的宽度和高度。

我在这里缺少什么?
感谢您的帮助。

最佳答案

您必须定义一些有关 div 尺寸的值,无论是内联样式还是 css。例如,整页div:

<div id="wordcloud" style="width:100%; height:100vh; display: block">
<div id="vis"></div>
</div>

将起作用,否则如果任何宽度或高度属性丢失或等于 0,脚本将停止。

关于javascript - 使用 D3.js 的响应式词云,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59361834/

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