散布

2016-10-23 7 views
2

に各点のwordcloudを描き、私は(最初の2つのフィールドは、現在プロットするために使用されていることに注意)以下のデータに定義された散布図を作成します。散布

var data = [[5,3,"{'text':'word1',size:4},{'text':'word2','size':1}"], 
      [3,5,"{'text':'word3',size:5},{'text':'word4','size':4}"], 
      [1,4,"{'text':'word1',size:3},{'text':'word2','size':5},{'text':'word3','size':2}"], 
      [2,3,"{'text':'word2',size:1},{'text':'word3','size':5}"]]; 

次に、私たちはそれぞれの特定をクリックしてください散布図のポイントで、アプリケーションはdata変数の3番目のフィールドに格納された単語から定義されたワードクラウドを添付する必要があります。私はwordcloudのJason Daviesの実装を使用します。現在(デモ目的のため)、ワードクラウドは変数frequency_listに格納されている静的データからのみ生成されています。現在のコードはJSFiddleにも格納されています。

どのように進めるか?

var data = [[5,3,"{'text':'word1',size:4},{'text':'word2','size':1}"], 
      [3,5,"{'text':'word3',size:5},{'text':'word4','size':4}"], 
      [1,4,"{'text':'word1',size:3},{'text':'word2','size':5},{'text':'word3','size':2}"], 
      [2,3,"{'text':'word2',size:1},{'text':'word3','size':5}"]]; 

var margin = {top: 20, right: 15, bottom: 60, left: 60}, 
    width = 500 - margin.left - margin.right, 
    height = 250 - margin.top - margin.bottom; 

var x = d3.scale.linear() 
    .domain([0, d3.max(data, function(d) { return d[0]; })]) 
    .range([ 0, width ]); 

var y = d3.scale.linear() 
    .domain([0, d3.max(data, function(d) { return d[1]; })]) 
    .range([ height, 0 ]); 

var chart = d3.select('body') 
    .append('svg:svg') 
    .attr('width', width + margin.right + margin.left) 
    .attr('height', height + margin.top + margin.bottom) 
    .attr('class', 'chart') 

var main = chart.append('g') 
    .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') 
    .attr('width', width) 
    .attr('height', height) 
    .attr('class', 'main') 

// Draw the x axis 
var xAxis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom'); 

main.append('g') 
    .attr('transform', 'translate(0,' + height + ')') 
    .attr('class', 'main axis date') 
    .call(xAxis); 

// draw the y axis 
var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient('left'); 

main.append('g') 
    .attr('transform', 'translate(0,0)') 
    .attr('class', 'main axis date') 
    .call(yAxis); 

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

g.selectAll("scatter-dots") 
    .data(data) 
    .enter().append("svg:circle") 
    .attr("cx", function (d,i) { return x(d[0]); }) 
    .attr("cy", function (d) { return y(d[1]); }) 
    .attr("r", 5) 
    .on("mouseover", function(){d3.select(this).style("fill", "red")}) 
    .on("mouseout", function(){d3.select(this).style("fill", "black")}); 

// FUNCTION TO DISPLAY CIRCLE 
g.on('mouseover', function(){ 
    div.style("display", "block") 
    d3.select("krog").style("fill", "orange"); 
    generate(); 
}); 

g.on('mouseout', function(){ 
    //div.style("display", "none") 
    div.select("svg").remove(); 
}); 

var div = d3.select("body") 
    .append("div") 
    .attr("class", "tooltip") 
    .style("display", "none"); 


// Functions to draw wordcloud 
var frequency_list = [{"text":"study","size":40},{"text":"motion","size":15},{"text":"forces","size":10},{"text":"electricity","size":15},{"text":"movement","size":10},{"text":"relation","size":5},{"text":"things","size":10},{"text":"force","size":5},{"text":"ad","size":5}]; 

var color = d3.scale.linear() 
      .domain([0,1,2,3,4,5,6,10,15,20,100]) 
      .range(["#ddd", "#ccc", "#bbb", "#aaa", "#999", "#888", "#777", "#666", "#555", "#444", "#333", "#222"]); 

// Generates wordcloud 
function generate(){ 
    d3.layout.cloud().size([800, 300]) 
    .words(frequency_list) 
    .rotate(0) 
    .fontSize(function(d) { return d.size; }) 
    .on("end", draw) 
    .start(); 
} 

function draw(words) { 
    d3.select("div").append("svg") 
    .attr("width", 850) 
    .attr("height", 350) 
    .attr("class", "wordcloud") 
    .append("g") 
    // without the transform, words words would get cutoff to the left and top, they would 
    // appear outside of the SVG area 
    .attr("transform", "translate(320,200)") 
    .selectAll("text") 
    .data(words) 
    .enter().append("text") 
    .style("font-size", function(d) { return d.size + "px"; }) 
    .style("fill", function(d, i) { return color(i); }) 
    .attr("transform", function(d) { 
     return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")"; 
    }) 
    .text(function(d) { return d.text; }); 
} 

答えて

3

ここではいくつか問題があります。

まず、データには単語の文字列が含まれています。その後

var data = [[5,3,[{'text':'word1',size:4},{'text':'word2','size':1}]], 
     [3,5,[{'text':'word3',size:5},{'text':'word4','size':4}]], 
     [1,4,[{'text':'word1',size:3},{'text':'word2','size':5},{'text':'word3','size':2}]], 
     [2,3,[{'text':'word2',size:1},{'text':'word3','size':5}]]]; 

、私は機能drawを変更:代わりにあなたは円を合わせるたびに新しいdiv要素を追加すると、それだけでdivの内容を変更します。

div.append("svg") 
    .attr("width", 300) 
    .attr("height", 300) 
    .attr("class", "wordcloud") 
    .append("g") 
私は、オブジェクトの配列のことを変更しました

しかし、今では最も重要な変更が行われています。

ユーザーがサークルを移動するたびにwordcloudを表示していますが、グループ要素に対してmouseoverを呼び出しています。そうすれば、特定のサークルにバインドされたデータにアクセスすることはできません。

その代わりに、我々は円のための変数を設定します:

var circle = g.selectAll("scatter-dots") 
    .data(data) 
    .enter() 
    .append("svg:circle"); 

したがって、我々は、アレイ内の第三の要素である各ホバー円のデータを得ることができる:

circle.on('mouseover', function(d){ 
    div.style("display", "block") 
    d3.select("krog").style("fill", "orange"); 
    generate(d[2]);//here, d[2] is the third element in the data array 
}); 

そして、我々はthisWordsという名前のパラメータとして機能generateに、この第三の要素(d[2])を渡す:

function generate(thisWords){ 
    d3.layout.cloud().size([800, 300]) 
    .words(thisWords) 
    .rotate(0) 
    .fontSize(function(d) { return d.size; }) 
    .on("end", draw) 
    .start(); 
} 

はここにあります:https://jsfiddle.net/jwrbps4j/

PS:あなたはその言葉のためにtranslateを改善する必要があります。