Javascript 如何实现d3.js中图形的html变量
我想在d3.js中做一个甜甜圈图表。基本上,想法是编写3个输入,并应以如下方式显示: 不幸的是,我不能做到这一点,我不确定如何在javascript代码中实现变量fuel、fuel 2和fuel 3,我不确定是在html代码中还是在javascript代码中指明。提前谢谢Javascript 如何实现d3.js中图形的html变量,javascript,html,css,d3.js,Javascript,Html,Css,D3.js,我想在d3.js中做一个甜甜圈图表。基本上,想法是编写3个输入,并应以如下方式显示: 不幸的是,我不能做到这一点,我不确定如何在javascript代码中实现变量fuel、fuel 2和fuel 3,我不确定是在html代码中还是在javascript代码中指明。提前谢谢 <meta charset="utf-8"> <!-- Load d3.js --> <script src="https://d3js.org/d3.v4.j
<meta charset="utf-8">
<!-- Load d3.js -->
<script src="https://d3js.org/d3.v4.js"></script>
<div>
<input type="number" id="fuel" style="text-align:center">
</div>
<div>
<input type="number" id="fuel2" style="text-align:center">
</div>
<div>
<input type="number" id="fuel3" style="text-align:center">
</div>
<!-- Create a div where the graph will take place -->
<div id="my_dataviz"></div>
这个答案使用d3v6
方法1
您可以使用数据数组来表示输入框和切片。这可能有好处,尤其是从数据源加载图表时。尝试以下方法:
// Date representing your slices:
var data = [
{name:"A",value:1},
{name:"B",value:1},
{name:"B",value:1}
];
// Create the fields based on the data:
d3.select("#my_inputs")
.selectAll(null)
.data(data)
.enter()
.append("input")
.attr("value",function(d) { return d.value; })
.on("keyup", function(_,d) {
d.value = d3.select(this).node().value;
update();
})
这里我们创建一个数据数组来表示输入字段和切片。我们将数据绑定到输入字段,并在字段值每次更改时更新绑定的数据
现在,我们可以在每次值更改时更新图表,最初使用如下函数:
function update() {
var pie = d3.pie()
.value(function(d) {return d.value; })(data);
svg
.selectAll('path')
.data(pie)
.join('path')
.attr(.....
}
我在下面做了一些修改,因为我们需要注意的是,如果切片的数量不变,那么在第一次绘制切片后,enter选择将为空。因此,我使用selection.join()
尽管selection.merge()
单独处理update和enter也可以
以下是这两种情况:
var宽度=450
高度=450
保证金=40
变量半径=数学最小值(宽度、高度)/2-边距
//表示切片的日期:
风险值数据=[
{name:“A”,值:1},
{名称:“B”,值:1},
{名称:“C”,值:1}
];
//根据数据创建字段:
d3.选择(“我的输入”)
.selectAll(空)
.数据(数据)
.输入()
.append(“输入”)
.attr(“value”,函数(d){返回d.value;})
.on(“keyup”,函数(u,d){
d、 value=d3.选择(this).node().value;
更新();
})
//创建SVG
var svg=d3。选择(“我的数据维”)
.append(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度)
.附加(“g”)
.attr(“变换”、“平移”(+width/2+)、“+height/2+”);
//设置颜色比例
var color=d3.scaleOrdinal()
.domain(data.map(函数(d){返回d.name;}))
.范围([“#98abc5”、“#8a89a6”、“#7b6888”])
更新();
函数更新(){
//计算每个组在饼图上的位置:
var pie=d3.pie()
.value(函数(d){返回d.value;})(数据);
//构建饼图:基本上,饼图的每个部分都是我们使用arc函数构建的路径。
svg
.selectAll('路径')
.数据(pie)
.join('路径')
.attr('d',d3.arc()
.内半径(100)
.外部(半径)
)
.attr(“笔划”、“黑色”)
.style(“笔划宽度”、“2px”)
.style(“fill”,函数(d){返回颜色(d.data.name);})
}
简直太棒了。我可以问一下这个变量派是干什么的吗?我把:var-pie=d3.pie().value(函数(d){return d.value;})var-data\u-ready=pie(d3.entries(data))
压缩为:var-pie=d3.pie().value(函数(d){return d.value;})(data)
,所以pie
替换代码段中的data\u-ready
,我们仍然需要将其传递给selectAll().data()
。
function update() {
var pie = d3.pie()
.value(function(d) {return d.value; })(data);
svg
.selectAll('path')
.data(pie)
.join('path')
.attr(.....
}