2016-08-12 25 views
1

我嘗試添加jointplot到NBA拍圖,添加jointplot到NBA拍圖使用d3js

所以它看起來像這樣:

enter image description here

的問題是我不能讓酒吧正常工作,我真的不知道爲什麼會發生這種情況。

如果有人引導我在聯合圖中爲了與NBA圖表一起工作而需要改變什麼,那將是非常棒的。

NBA拍圖:

http://jsbin.com/guqiviniji/edit?html,output

Jointplot實現:

<!DOCTYPE html> 
 
<meta charset="utf-8"> 
 

 
<head> 
 
    <style> 
 
    .bar { 
 
     fill: steelblue; 
 
    } 
 
    
 
    .bar:hover { 
 
     fill: brown; 
 
    } 
 
    
 
    .axis { 
 
     font: 10px sans-serif; 
 
    } 
 
    
 
    .axis path, 
 
    .axis line { 
 
     fill: none; 
 
     stroke: #000; 
 
     shape-rendering: crispEdges; 
 
    } 
 
    
 
    .x.axis path { 
 
     display: none; 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 
    <script src="//d3js.org/d3.v3.min.js"></script> 
 
    <script> 
 
    // set the dimensions and margins of the graph 
 
    var margin = { 
 
     top: 80, 
 
     right: 80, 
 
     bottom: 20, 
 
     left: 20 
 
     }, 
 
     width = 400 - margin.left - margin.right, 
 
     height = 400 - margin.top - margin.bottom; 
 

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

 
    var g = svg.append("g") 
 
     .attr("transform", 
 
     "translate(" + margin.left + "," + margin.top + ")"); 
 

 
    var x = d3.scale.linear().range([0, width]).domain([0, 10]), 
 
     y = d3.scale.linear().range([height, 0]).domain([0, 10]); 
 

 
    // Add the X Axis 
 
    g.append("g") 
 
     .attr("class", "axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(d3.svg.axis().orient("bottom").scale(x)); 
 

 
    // Add the Y Axis 
 
    g.append("g") 
 
     .attr("class", "axis") 
 
     .call(d3.svg.axis().orient("left").scale(y)); 
 

 
    var random = d3.random.normal(0, 1.2), 
 
     data = d3.range(100).map(function() { 
 
     return [random() + 5, random() + 5]; 
 
     }); 
 

 
    g.selectAll(".point") 
 
     .data(data) 
 
     .enter() 
 
     .append("circle") 
 
     .attr("cx", function(d) { 
 
     return x(d[0]); 
 
     }) 
 
     .attr("cy", function(d) { 
 
     return y(d[1]); 
 
     }) 
 
     .attr("r", 7) 
 
     .style("fill", "steelblue") 
 
     .style("stroke", "lightgray"); 
 

 
    // top histogram 
 
    var gTop = svg.append("g") 
 
     .attr("transform", 
 
     "translate(" + margin.left + "," + 0 + ")"); 
 

 
    var xBins = d3.layout.histogram() 
 
     .range(x.domain()) 
 
     .bins(x.ticks(10)) 
 
     .value(function(d) { 
 
     return d[0]; 
 
     })(data); 
 

 
    var xy = d3.scale.linear() 
 
     .domain([0, d3.max(xBins, function(d) { 
 
     return d.length; 
 
     })]) 
 
     .range([margin.top, 0]); 
 

 
    var xBar = gTop.selectAll(".bar") 
 
     .data(xBins) 
 
     .enter().append("g") 
 
     .attr("class", "bar") 
 
     .attr("transform", function(d) { 
 
     return "translate(" + x(d.x) + "," + xy(d.length) + ")"; 
 
     }); 
 

 
    var bWidth = x(xBins[0].dx) - 1; 
 
    xBar.append("rect") 
 
     .attr("x", 1) 
 
     .attr("width", bWidth) 
 
     .attr("height", function(d) { 
 
     return margin.top - xy(d.length); 
 
     }) 
 
     .style("fill", "steelblue"); 
 

 
    xBar.append("text") 
 
     .attr("dy", ".75em") 
 
     .attr("y", 2) 
 
     .attr("x", bWidth/2) 
 
     .attr("text-anchor", "middle") 
 
     .text(function(d) { 
 
     return d.length < 4 ? "" : d.length; 
 
     }) 
 
     .style("fill", "white") 
 
     .style("font", "9px sans-serif"); 
 

 
    // right histogram 
 
    var gRight = svg.append("g") 
 
     .attr("transform", 
 
     "translate(" + (margin.left + width) + "," + margin.top + ")"); 
 

 
    var yBins = d3.layout.histogram() 
 
     .range(y.domain()) 
 
     .bins(y.ticks(10)) 
 
     .value(function(d) { 
 
     return d[1]; 
 
     })(data); 
 

 
    console.log(yBins); 
 

 
    var yx = d3.scale.linear() 
 
     .domain([0, d3.max(yBins, function(d) { 
 
     return d.length; 
 
     })]) 
 
     .range([0, margin.right]); 
 

 
    var yBar = gRight.selectAll(".bar") 
 
     .data(yBins) 
 
     .enter().append("g") 
 
     .attr("class", "bar") 
 
     .attr("transform", function(d) { 
 
     return "translate(" + 0 + "," + y(d.x + d.dx) + ")"; 
 
     }); 
 

 
    yBar.append("rect") 
 
     .attr("y", 1) 
 
     .attr("width", function(d) { 
 
     return yx(d.length); 
 
     }) 
 
     .attr("height", bWidth) 
 
     .style("fill", "steelblue"); 
 

 
    yBar.append("text") 
 
     .attr("dx", "-.75em") 
 
     .attr("y", bWidth/2 + 1) 
 
     .attr("x", function(d) { 
 
     return yx(d.length); 
 
     }) 
 
     .attr("text-anchor", "middle") 
 
     .text(function(d) { 
 
     return d.length < 4 ? "" : d.length; 
 
     }) 
 
     .style("fill", "white") 
 
     .style("font", "9px sans-serif"); 
 
    </script> 
 
</body> 
 

 
</html>

+1

嗯,它看起來對我好。實際上有什麼不對?什麼*確切*是你的問題? – altocumulus

+0

@altocumulus jsbin有兩個鏈接,第一個鏈接是nba拍攝圖表,第二個鏈接是聯合圖表實現,我正在嘗試將聯合圖表集成到nba拍攝圖表中,以便獲得與它的聯合圖表看起來像上面的圖片。 –

回答

3

因爲我投入了大量的精力投入到個回答在評論over here的問題是問題,我想這是值得的重新散列它作爲對這個問題的答案。

我真的看到jsbin鏈接中的代碼有兩個大問題。

首先,強烈依賴魔術號碼。它看起來像OP使用試驗和錯誤,以適應他的圖表的特定高度/寬度。當然,這意味着增加利潤率或更改大小需要花費大量精力開發新的幻數。在圖表高度和寬度改變時,我通過按百分比縮放原始幻數來解決以下依賴問題。這有點破解,但似乎工作。

其次,原來的「聯合策劃」樣品中我開發的,我使用用戶空間數據分級數據。然後,我需要x和y比例將用戶空間倉映射回像素位置。但在OPs jsbin中,他正在使用像素空間數據來存儲數據。這當然是完全有效的,事實上,可能是更好,,因爲酒吧的位置變得更容易。你不需要重新引入更多的尺度來放置它們。

最後,我做了一些更多的工作來使倉大小可調。

下面是正確的直方圖一些代碼:

// right histogram 
    var gRight = r_svg.append("g") 
     .attr("transform", 
     "translate(" + (margins.left + max.x) + "," + margins.top + ")"); 

    var m = d3.max(histogramData, function(d) { return d[1] }); 
    var yBins = d3.layout.histogram() 
     .range([0, m]) 
     .bins(d3.range(0, m + 20, 20)) //<-- bin size is more adjustable, lower the 20, 20 for more bins 
     .value(function(d) { 
     return d[1]; 
     })(histogramData); //<-- data has pixel values 

    var yx = d3.scale.linear() 
     .domain([0, d3.max(yBins, function(d) { 
     return d.length; 
     })]) 
     .range([0, margins.right]); 

    var yBar = gRight.selectAll(".bar") 
     .data(yBins) 
     .enter().append("g") 
     .attr("class", "bar") 
     .attr("transform", function(d) { 
     return "translate(" + 0 + "," + (d.x) + ")"; //<-- pixel values just place at d.x 
     }); 

    yBar.append("rect") 
     .attr("y", 1) 
     .attr("width", function(d) { 
     return yx(d.length); 
     }) 
     .attr("height", bWidth) 
     .style("fill", "steelblue"); 

    yBar.append("text") 
     .attr("dx", "-.75em") 
     .attr("y", bWidth/2 + 1) 
     .attr("x", function(d) { 
     return yx(d.length); 
     }) 
     .attr("text-anchor", "middle") 
     .text(function(d) { 
     return d.length < 15 ? "" : d.length; 
     }) 
     .style("fill", "white") 
     .style("font", "9px sans-serif"); 

Running code is here

+0

非常感謝您的幫助,像魅力一樣運作。 –