Javascript 使用D3将垂直杆的值恢复到其初始位置

Javascript 使用D3将垂直杆的值恢复到其初始位置,javascript,jquery,d3.js,Javascript,Jquery,D3.js,我目前使用的是D3代码,其中垂直条的宽度随着滑块的移动而增加。但当我们回到默认位置时,我希望条形图显示初始值,而不是默认值。为了使滑块工作,我使用了jquery的Math.min函数,但这并不完美。谁能帮忙吗 <!DOCTYPE html> <html lang="en"> <head> <style> .axis path, .axis line { fill: none; stroke: black;

我目前使用的是D3代码,其中垂直条的宽度随着滑块的移动而增加。但当我们回到默认位置时,我希望条形图显示初始值,而不是默认值。为了使滑块工作,我使用了jquery的Math.min函数,但这并不完美。谁能帮忙吗

<!DOCTYPE html>
<html lang="en">

  <head>
    <style>

    .axis path,
.axis line {
    fill: none;
    stroke: black;
    shape-rendering: crispEdges;
}

.axis text {
    font-family: sans-serif;
    font-size: 11px;
}

body {
    font: 10px sans-serif;
    <!--padding-top:50px;-->
}

div#slider{
    width: 940px;
    margin-left: 8%;

    margin-top: 4%; 
    }
svg {
    margin-left:3%; 
    }
    </style>
    <script data-require="jquery@2.1.4" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <link data-require="jqueryui@1.10.0" data-semver="1.10.0" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.0/css/smoothness/jquery-ui-1.10.0.custom.min.css" />
    <script data-require="jqueryui@1.10.0" data-semver="1.10.0" src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.0/jquery-ui.js"></script>
    <script data-require="d3@*" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>

  </head>

 <body>
    <div id="slider"></div>
    <script>
    $(function() {

        $("#slider").slider({
            min: 30,
            max: 950,
            // on slide adjust width of all rects
            slide: function(event, ui) {
                svg.selectAll("rect")
                        .attr("width", function (d) {
                            return Math.min(ui.value * d.rate, d.max);
                        })
            }
        });

        // create svg
        var svg = d3.select("body")
                .append("svg")
                .attr("width", 950)
                .attr("height", 400);


        // add 4 rects
        var data = [
            { row:1, rate:0.4, max:550 },
            { row:2, rate:0.5, max:600 },
            { row:3, rate:0.6, max:700 },
            { row:4, rate:0.7, max:750 },
            { row:5, rate:0.8, max:780 },
            { row:6, rate:0.9, max:800 },
            { row:7, rate:1.0, max:950 },
        ];

        svg.selectAll("g")
                .data(data)
                .enter()
                .append("rect")
                .attr("x", 20)
                .attr("y", function(d) {
                    return d.row * 30;
                })
                .attr("height", 20)
                .attr("width", 20)
                .style("fill","blue")
                .style("margin-top",20)
                .attr("transform", "translate(20,0)");

      //add x and y axis
   var x = d3.scale.linear()
                    .range([0, 950]);

                var y = d3.scale.linear()
                    .range([200, 0]);

                       var xAxis = d3.svg.axis()
                    .scale(x)
                    .orient("bottom")
                    .ticks(5)


                var yAxis = d3.svg.axis()
                    .scale(y)
                    .orient("left")
                    .ticks(7);

                     x.domain([0,25]);

                y.domain([0,7]);

                svg.append("g")
                    .attr("class", "x axis")
                    .attr("transform", "translate(30,260)")
                    .call(xAxis);

                svg.append("g")
                    .attr("class", "y axis")
                     .attr("transform", "translate(20,30)")
                    .call(yAxis);

    });
    </script>
  </body>

</html>

.轴线路径,
.轴线{
填充:无;
笔画:黑色;
形状渲染:边缘清晰;
}
.轴文本{
字体系列:无衬线;
字体大小:11px;
}
身体{
字体:10px无衬线;
}
div#滑块{
宽度:940px;
左缘:8%;
利润率最高:4%;
}
svg{
左缘:3%;
}
$(函数(){
$(“#滑块”).滑块({
分钟:30,,
最高:950,
//在幻灯片上调整所有矩形的宽度
幻灯片:功能(事件、用户界面){
svg.selectAll(“rect”)
.attr(“宽度”,函数(d){
返回数学最小值(ui.value*d.rate,d.max);
})
}
});
//创建svg
var svg=d3.选择(“主体”)
.append(“svg”)
.attr(“宽度”,950)
.attr(“高度”,400);
//添加4个矩形
风险值数据=[
{行:1,速率:0.4,最大值:550},
{行数:2,速率:0.5,最大值:600},
{行数:3,速率:0.6,最大值:700},
{行数:4,速率:0.7,最大值:750},
{行数:5,速率:0.8,最大值:780},
{行数:6,速率:0.9,最大值:800},
{行数:7,速率:1.0,最大值:950},
];
svg.selectAll(“g”)
.数据(数据)
.输入()
.append(“rect”)
.attr(“x”,20)
.attr(“y”,函数(d){
返回d行*30;
})
.attr(“高度”,20)
.attr(“宽度”,20)
.style(“填充”、“蓝色”)
.style(“页边空白顶部”,20)
.attr(“转换”、“翻译(20,0)”);
//添加x轴和y轴
var x=d3.scale.linear()
.范围([0950]);
变量y=d3.scale.linear()
.范围([200,0]);
var xAxis=d3.svg.axis()
.比例(x)
.orient(“底部”)
.滴答声(5)
var yAxis=d3.svg.axis()
.比例(y)
.东方(“左”)
.蜱(7);
x、 域([0,25]);
y、 域([0,7]);
svg.append(“g”)
.attr(“类”、“x轴”)
.attr(“转换”、“翻译(30260)”)
.呼叫(xAxis);
svg.append(“g”)
.attr(“类”、“y轴”)
.attr(“转换”、“翻译(20,30)”)
.呼叫(yAxis);
});

在您的幻灯片活动中:

slide: function(event, ui) {
    svg.selectAll("rect")
        .attr("width", function (d) {
            return Math.min(ui.value * d.rate, d.max);
    })
}
您可能希望使用
ui.value

大概是这样的:

slide: function(event, ui) {
    svg.selectAll("rect")
        .attr("width", function (d) {
            if(ui.value === 0){
                // return your default width here
            } else {
                return Math.min(ui.value * d.rate, d.max);
            }
    })
}

无法实现这一点,我尝试使用一个变量来存储初始值。你能帮忙吗?我不确定你到底在画什么,但不应该像这样工作:
返回数据[0]。rate
数据[0]。max
?这是我正在使用的代码,请检查:svg.selectAll(“rect”).attr(“width”,函数(d){if(ui.value==0){return inival;}else{返回Math.min(ui.value*d.rate,d.min);}}};var数据=[{row:1,rate:1.0,min:200,max:350},{row:2,rate:1.0,min:250,max:400},{row:3,rate:1.0,min:280,max:475},{row:4,rate:1.0,min:320,max:510},{row:5,rate:1.0,min:350,max:530,{row:6,rate:1.0,min:375,max:550},{行:7,速率:1.0,最小值:400,最大值:600},];变量inival=[数据[0]。最小值,数据[1]。最小值,数据[2]。最小值,数据[3]。最小值,数据[4]。最小值,数据[5]。最小值,数据[6]。最小值];因为您的数据是硬编码的,所以您应该能够简单地引用初始值。此外,我的示例假设
ui.value==0
是滑块上的默认点。我不确定我是否可以在这方面进一步帮助您,因为据我所知,这非常简单。