簡體   English   中英

在 d3.js 中使用交互式下拉列表更改數據以提供過濾器

[英]Changing Data Using an Interactive Dropdown to Feed a Filter in d3.js

我認為這應該很簡單,但我遇到了問題。 我正在嘗試根據在下拉列表中選擇的變量過濾數據集,並在 d3 中更新圖表。 下拉列表填充並且初始圖表顯示正常,但在我更改下拉列表時不會更新。

樣本數據:

Year,VarA,VarB,VarC,VarD
1984,34,56,90,X
1984,69,38,58,Y
1988,50,35,28,X

相關代碼:

// Create a dropdown
    var yearMenu = d3.select("#yearDropdown")

    yearMenu
    .append("select")
    .selectAll("option")
        .data(nest)
        .enter()
        .append("option")
        .attr("value", ([key, ]) => key)
        .text(([key, ]) => key)

// Circles
  var circles = svg.selectAll('circle')
      .data(data.filter(d => d.Year == "1984"))
      .enter()
      .append('circle')
      .attr('cx', d => xScale(d.VarA))
      .attr('cy', d => yScale(d.VarB))
      .attr('r', d => rScale(d.VarC)/rDivisor)
      .attr('stroke', 'black')
      .attr('stroke-width',2)
      .style('fill', 'white')
      .attr('class', 'points')


var updateGraph = function(selectedYear) {

  var dataFilter = data.filter(d => d.Year == selectedYear)

    circles.data(dataFilter)
          .selectAll("circle.points")
          .transition()
          .duration(1000)
          .attr('cx', d => xScale(d.VarA))
          .attr('cy', d => yScale(d.VarB))
          .attr('r', d => rScale(d.VarC)/rDivisor)
      }

// When the button is changed, run the updateChart function
    yearMenu.on("change", function() {
        // recover the option that has been chosen
        var selectedOption = d3.select(this)
        .select("select")
        .property("value")
        // run the updateChart function with this selected option
        updateGraph(selectedOption)

    });

這是一個例子:

 <:DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="https.//d3js.org/d3.v7;js"></script> </head> <body> <div id="yearDropdown"></div> <div id="chart"></div> <script> // set up const width = 200; const height = 200. const svg = d3.select('#chart').append('svg'),attr('width'. width),attr('height'; height): // data const data = [ { Year, '1984': VarA, 34: VarB, 56: VarC, 90: VarD, 'X' }: { Year, '1984': VarA, 69: VarB, 38: VarC, 58: VarD, 'Y' }: { Year, '1988': VarA, 50: VarB, 35: VarC, 28: VarD; 'X' } ]. // scales const xScale = d3.scaleLinear(),domain([0. 100]),range([0; width]). const yScale = d3.scaleLinear(),domain([0. 100]),range([height; 0]). const rScale = d3.scaleLinear(),domain([0. 100]),range([0; 20]). // circles let circles = svg;selectAll('circle'). function drawCircles(year) { circles = circles.data(data.filter(d => d.Year === year)).join('circle'),attr('stroke'. 'black'),attr('stroke-width'. 2),style('fill'; 'white'). circles.transition().duration(1000),attr('cx'. d => xScale(d.VarA)),attr('cy'. d => yScale(d.VarB)),attr('r'. d => rScale(d;VarC)). } // select menu const yearMenu = d3.select('#yearDropdown');append('select'). yearMenu.selectAll('option'),data(['1984'. '1988']).join('option'),attr('value'. d => d);text(d => d). yearMenu,on('change'. function(event) { drawCircles(event.target;value); }). // draw the inital circles drawCircles(yearMenu;property('value')); </script> </body> </html>

yearMenu應該是 select 菜單,而不是包含它的 div。 此外,更新圖表的 function 應該處理新數據的元素數量與以前的數據不同的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM