当前位置: 首页 > 知识库问答 >
问题:

用d3生成svg形状并应用梯度

高增
2023-03-14

我正在尝试将不同颜色的渐变(意在象征一个调查中记录的不同答案的百分比)添加到一个svg形状(在本例中,该形状是用户点击过的一个国家)。我希望它看起来像这样(请忽略糟糕的颜色选择)。

然而,这个屏幕截图是在每个答案的百分比数据被硬编码时拍摄的(图中右侧可见),而不是从带有调查数据的csv文件中提取的。所以,我编写了这段代码,根据调查中的数据生成一个梯度。它计算收到的每个答案的百分比,并创建两个定义特定答案边界的偏移量属性(然后应用于梯度svg)。最后,这个梯度被应用到用户点击的国家。

function calculateGrad(csvData, noOfQuestions, chosenCountry){
    var total = 0
    for (var i = 0; i < noOfQuestions; i++) {
        total += parseInt(csvData[i][chosenCountry])
    }

    var grad = svg.append("defs")
        .append("linearGradient")
        .attr("id", "grad")
        .attr("x1", "0%")
        .attr("x2", "0%")
        .attr("y1", "100%")
        .attr("y2", "0%")


    totalPercentFilled = 0
    counter = 0

    for (var i = 0; i < noOfQuestions; i++) {
        var randomColor = "#000000".replace(/0/g,function(){return (~~(Math.random()*16)).toString(16);});
        if (i == 0) {
            grad.append("stop").attr("offset", "0%").attr("stop-color", randomColor)
            var prevColor = randomColor
            counter += 1
        }

        else {
            grad.append("stop").attr("offset", totalPercentFilled).attr("stop-color", randomColor)
            var prevColor = randomColor
            counter += 1
        }
        grad.append("stop").attr("offset", (totalPercentFilled + (parseInt(csvData[i][chosenCountry])/parseInt(total))*100)).attr("stop-color", prevColor);

        totalPercentFilled += (parseInt(csvData[i][chosenCountry])/parseInt(total)*100)
    }

    console.log(grad)
    // console.log("Number of loops made: " + counter)
    // console.log("Number of Q:s: " + noOfQuestions)
    g.selectAll("#" + country.id).style("fill", "url(#grad)")
    console.log("Gradient applied")

虽然这段代码似乎生成了完全相同的渐变(对我来说),但它的结果是国家只填充了一种颜色(渐变的第一种)。

我不明白为什么会发生这种情况,因为两个示例中登录在控制台中的渐变在我看来都是一样的。如果有人知道问题出在哪里,我会永远感激你的指导。

如果我需要提供更多的细节,也请让我知道。

共有1个答案

魏书
2023-03-14

在示例D3屏幕截图中,您可以看到没有将百分比%单元追加到梯度stop。渐变停止的默认单位是ObjectBoundingBox,这些单位从0运行到1。

所以你的梯度可能在那里,它只是100×从你想要的。你只看到一条(非常大的)梯度带。

 类似资料:
  • 如果我使用web inspector来“编辑元素的HTML”,即使我没有改变任何东西,梯度也会突然起作用--所以我猜Chrome的SVG解析或D3的元素生成中发生了一些奇怪的事情。 我认为这可能归因于和之间的混淆-D3似乎在camelCased元素上有一些问题,当我让它创建元素时,它不会选择它们(我得到了很多很多副本)。此外,在Chrome的检查器中,这些元素显示为;当我编辑为HTML时,它们是。

  • 我有个跟班问题。在构建我的应用程序时遇到这样一个错误,我找不到是怎么回事。 这是我的分级:

  • 问题内容: 使用Mobile Safari 转到http://m.google.com页面时,您会在页面顶部看到漂亮的栏。 我想那样画一些梯形(美国:梯形),但我不知道怎么做。我应该使用CSS3 3D转换吗?如果您有实现此目标的好方法,请告诉我。 问题答案: 您可以使用以下CSS: 制作所有这些形状真的很酷,请查看以下更漂亮的形状: http://css-tricks.com/examples/S

  • 我想把html附加到D3中的矩形上,给我一个多行工具提示。底部是如何添加一个矩形,这可能是问题的一部分。最上面是应该在我的世界里工作的代码。 这会将文本字段插入SVG,但它只是不显示: html: 我有一个鼠标移过函数,它运行以下内容: 我想我应该这么做,但这不起作用。它只是删除了我试图追加到的g.node。 问题:为什么我的文字没有出现?我试过.html,.textarea。我想要一个多行标签,

  • 本文向大家介绍d3.js 使用D3 js创建SVG元素,包括了d3.js 使用D3 js创建SVG元素的使用技巧和注意事项,需要的朋友参考一下 示例 尽管D3并非专门用于处理SVG元素,但它已广泛用于创建和处理基于SVG的复杂数据可视化。D3提供了许多强大的方法,可帮助轻松创建各种几何SVG结构。 建议首先了解SVG规范的基本概念,然后使用大量的D3 js示例创建可视化效果。 D3 JS范例 SV

  • 若要使用形状生成器工具创建形状,请执行下列操作: 创建要应用“形状生成器工具”的形状。 使用“选择”工具,选择需要合并来创建形状的路径。 注意:请确保仅选择需要应用该工具的路径。如果在合并前全选路径,将会出现性能开销。 从工具面板或按 Shift+M 选择“形状生成器工具”。默认情况下,该工具处于合并模式;在此模式下,您可以合并不同的路径。在此模式下,指针显示为 。 识别您要选取或合并的选区。 若