首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D3.js响应字云

D3.js响应字云
EN

Stack Overflow用户
提问于 2019-12-16 17:46:39
回答 1查看 1.4K关注 0票数 1

我正在尝试用d3.js实现一个响应的 word云。我还需要更新/更改数据的能力。

基于贾森·戴维斯非常好的解决方案,有很多示例。我正在尝试调整一个word云实现(在此发现)以满足我的需求。

这是我的密码。

代码语言:javascript
复制
<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没有显式的宽度和高度。

我在这里错过了什么?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-01-09 20:55:41

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

代码语言:javascript
复制
<div id="wordcloud" style="width:100%; height:100vh; display: block">
    <div id="vis"></div>
</div>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59361834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档