2016-03-24 30 views
1

おはようStackoverflow、d3.js choropleth/htmlのドロップダウンリストを使用してテーブルのコンボを更新

長時間の読者、初めて尋ねる。

私の初期の検索は、このbl.ock確かに非常にクールなhttp://bl.ocks.org/phil-pedruco/7557092

に連れて行ってくれました。だから、私はそのコードを取って仕事に行きました。私はそれが下の例で見ることができるように働いている。

私はあなたのためにすべてをフィドルに入れました。 jsfiddle.net/Majomo/npya9khq/

また、ここにコードを記入すると赤いボックスが表示されました。私のポストを大量にしましたが、赤い箱は私にそれをさせてくれました。テキストの壁には申し訳ありません。

HTML

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3-legend/1.9.0/d3-legend.min.js"></script> 

    <body> 
     <!-- Table to hold the Divs --> 
     <table border="0" cellpadding="10" style="overflow-y: scroll;"> 
     <tr> 
      <td> 
      <div id="table_container" class="csvTable"></div> 
      </td> 
      <td> 
      <div id="map_container"></div> 
      </td> 
      <td> 
      <div id="d3legend" class="legend"></div> 
      </td> 
      <td> 
      <div class="styled-select"> 
       <select id="data_sources" name="data_sources"> 
       <option value="regionalDistrictData.csv" selected>Census 1996 Data</option> 
       <option value="regionalDistrictData2.csv">Census 2001 Data</option> 
       <option value="regionalDistrictData3.csv">Census 2006</option> 
       </select> 
      </div> 
      </td> 
     </tr> 
     </table> 
</html> 

CSS

rect { 
    fill: none; 
    cursor: pointer; 
} 

.feature { 
    fill: #ccc; 
    cursor: pointer; 
} 

.mesh { 
    fill: none; 
    stroke: #fff; 
    stroke-width: .5px; 
    stroke-linejoin: round; 
} 

.csvTable table { 
    border-collapse: collapse; 
    text-align: left; 
    width: 100%; 
} 

.csvTable { 
    font: normal 12px/150% Arial, Helvetica, sans-serif; 
    background: #fff; 
    overflow: hidden; 
    border: 1px solid #069; 
    -webkit-border-radius: 3px; 
    -moz-border-radius: 3px; 
    border-radius: 3px; 
} 

.csvTable table td, 
.csvTable table th { 
    padding: 3px 10px; 
} 

.csvTable table thead th { 
    background: 0; 
    filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F'); 
    background-color: #006D2C; 
    color: #FFF; 
    font-size: 15px; 
    font-weight: 700; 
    border-left: 1px solid #0070A8; 
} 

.csvTable table thead th:first-child { 
    border: none; 
} 

.csvTable table tbody td { 
    color: #00496B; 
    border-left: 1px solid #E1EEF4; 
    font-size: 12px; 
    border-bottom: 1px solid #E1EEF4; 
    font-weight: 400; 
} 

.csvTable table tbody td:first-child { 
    border-left: none; 
} 

.csvTable table tbody tr:last-child td { 
    border-bottom: none; 
} 

.csvTable tr:hover td { 
    background-color: #069; 
    color: white; 
} 

.styled-select select { 
    background: transparent; 
    font: normal 12px/150% Arial, Helvetica, sans-serif; 
    width: 268px; 
    padding: 5px; 
    font-size: 16px; 
    line-height: 1; 
    border: 0; 
    border-radius: 0; 
    height: 34px; 
    -webkit-appearance: none; 
} 

.styled-select { 
    width: 240px; 
    height: 34px; 
    padding: 5px; 
    overflow: hidden; 
    background: url(http://i62.tinypic.com/2e3ybe1.jpg) no-repeat right #ddd; 
    border: 1px solid #069; 
} 

JS

// Based on http://public.johnnyotoole.fastmail.fm/county_map.html 
// Based on http://bl.ocks.org/mbostock/4699541 

//Width and height 
var w = 600; 
var h = 750; 
var active; 
var jsonOutside; 

//Define map projection NB change to albers and changed zoom etc 
var projection = d3.geo.albers() 
    .center([-3.5, 43.4]) 
    .rotate([121, -11]) 
    .scale(2400) 
    .translate([w/2, h/2]); 

//Define path generator 
var path = d3.geo.path() 
    .projection(projection); 

//Create SVG element 
var svg = d3.select("#map_container") 
    .append("svg") 
    .attr("width", w) 
    .attr("height", h); 

// from colorbrewer (http://colorbrewer2.org/) 
//var colours = ["#BAE4B3", "#74C476", "#31A354", "#006D2C"]; 
//var colours = ["#fef0d9", "#fdcc8a", "#fc8d59", "#d7301f"]; 

// setup colours for choropleth 
var colScale = d3.scale.quantile() 
    .domain([1.2, 1.5, 2]) 
    .range(['#edf8fb', '#b3cde3', '#8c96c6', '#8856a7', '#810f7c']); 


var dropdown = d3.select("#data_sources") 
var change = function() { 
    var source = dropdown.node().options[dropdown.node().selectedIndex].value; 
    d3.csv(source, function(csv) { 
    //continue doing stuff here. 
    }) 
} 

dropdown.on("change", change) 
change(); //trigger json on load 

svg.append("rect") 
    .attr("width", w) 
    .attr("height", h) 
    .on("click", reset); 

var g = svg.append("g"); 


//Load in CSV data 
d3.csv(src = "https://gist.githubusercontent.com/majomo/2d5409622ff825ad932d/raw/5a37026b6c11d129a6eb1bcd32ef2a23d8833770/regDistBC.csv", function(data) { 

    //Load in GeoJSON data 
    d3.json(src = "https://gist.githubusercontent.com/majomo/1beba4e212d12f3d6e29/raw/1bd280591bc4959449505395c90f7ffdd2e2ddbd/bcGeo.json", function(json) { 

    // join csv data with json data and create 
    json.features.forEach(function(d, i) { 
     data.forEach(function(e, j) { 
     if (d.properties.CDNAME === e.Region) { 
      d.properties.value = +e.Result; 
     }; 
     }) 
    }) 

    jsonOutside = json; // pass json to a global so tableRowClicked has access 

    var columns = ["Region", "Result"]; 
    var table = d3.select("#table_container").append("table"), 
     thead = table.append("thead"), 
     tbody = table.append("tbody"); 

    // append the header row 
    thead.append("tr") 
     .selectAll("th") 
     .data(columns) 
     .enter() 
     .append("th") 
     .text(function(column) { 
     return column; 
     }); 

    // create a row for each object in the data 
    var rows = tbody.selectAll("tr") 
     .data(data) 
     .enter() 
     .append("tr"); 

    // create a cell in each row for each column 
    var cells = rows.selectAll("td") 
     .data(function(row) { 
     return columns.map(function(column) { 
      return { 
      column: column, 
      value: row[column] 
      }; 
     }); 
     }) 
     .enter() 
     .append("td") 
     .text(function(d) { 
     return d.value; 
     }) 
     .on("click", function(d) { 
     tableRowClicked(d); 
     }); // added on click eventto td   element NB you need to click on the cell with the conuty name 

    // add extents (max and min) from data results for choropleth 
    colScale.domain(d3.extent(data, function(d) { 
     return d.Result; 
    })); 

    //Bind data and create one path per GeoJSON feature 
    g.selectAll("path") 
     .data(json.features) 
     .enter() 
     .append("path") 
     .attr("d", path) 
     .attr("class", "feature") 
     .attr("id", function(d) { 
     return d.properties.CDNAME; 
     }) // added id so click could work on id which is common between the json and csv data 
     .on("click", function(d) { 
     click(d); 
     }) 
     .style("stroke", "gray") 
     .style("fill", function(d, i) { 
     return colScale(d.properties.value); 
     }); // fill based on colour scale 

    g.append("path") 
     .data(json.features) 
     .enter() 
     .append("path") 
     .attr("class", "mesh") 
     .attr("d", path); 
    }); 

}); 

function click(d) { 

    if (active === d) return reset(); 
    g.selectAll(".active").classed("active", false); 
    d3.select("#" + d.properties.CDNAME).classed("active", active = d); // changed selection to id 

    var b = path.bounds(d); 

    g.transition().duration(750).attr("transform", 
    "translate(" + projection.translate() + ")" + "scale(" + .95/Math.max((b[1][0] - b[0][0])/w, (b[1][1] - b[0][1])/h) + ")" + "translate(" + -(b[1][0] + b[0][0])/2 + "," + -(b[1][1] + b[0][1])/2 + ")"); 
} 

function reset() { 
    g.selectAll(".active").classed("active", active = false); 
    g.transition().duration(750).attr("transform", ""); 
} 

function tableRowClicked(x) { 

    jsonOutside.features.forEach(function(d) { // loop through json data to match td entry 
    if (x.value === d.properties.CDNAME) { 
     var region = d; 
     click(d); // pass json element that matches td data to click 
    }; 
    }) 
}; 

はこれまでのところ、それは偉大に見えますが、私は今、失わ取得しています。

ご覧のとおり、データセットの読み込みを制御するために使用したいhtmlドロップダウンを作成しました。私はこの点まで私を捜し求めた答えを探して見つけました。私は異なるデータを持つ3つのcsvファイルを持っており、それぞれを選択するためにドロップダウンを使用しようとしています。 私が勉強していた答え/ウェブサイトには、これのいくつかの変形がありました。

var dropdown = d3.select("#data_sources") 
var change = function() { 
    var source = dropdown.node().options[dropdown.node().selectedIndex].value; 
    d3.csv(source, function(csv) { 
    //continue doing stuff here. 
    }) 
} 

dropdown.on("change", change) 
change(); //trigger json on load 

私の問題は、私がこれを試したとき、私はどこにもいませんでした。私はそれがもはや属しているときに私も確信していないので、私は上記のコードから削除しました。私の大きな関心事は、テーブルと地図があり、私は働く場所を知らないということです。

だから、私が望んでいることについては、 はこの方法が可能ですか? そうでない場合は、これを行う方法はありますか?

ありがとうございます。

答えて

0

グラフのデータソースを変更できるようにするには、初期化フェーズを分離し、すべてのデータソースに共通するチャートの要素を作成し、描画する必要があります。あなたのデータに依存する要素。ここでは、同じジオリージョンの異なる値を視覚化するときに、すべてのチャートに共通点があるように見えます。

これを実行したら、すべての一般的なもののコードを一度実行するだけで済みます。残りのデータは、引数としてデータを受け取る関数に入れることができます。データソースを更新するたびに、この関数を新しいデータで呼び出すだけです。

あなたのケースでどのように動作するかを示すためにjsfiddleを少し修正しました。これは実際には最適な解決策ではありませんが、コードの構造についての考え方を与えるはずです。あなたが見ることができるように私はいつもsvgとテーブルからすべてを削除し、すべてを再描画することを選択しました。あなたの最終的なupdateChart関数は、リージョンが同じであれば、パスの色とテーブルセルの内部テキストを更新するだけで済みます。

jsfiddle.net/jwd2ded9/7/

関連する問題