2017-10-10 9 views
2

軸プロットに軸を追加する際に問題があります。バージョン3でD3.jsを使用しています。 円と線からなる私の茎を描きます。D3.js軸付きステムプロット

1.まず
1.1私はその後、私はY軸がステム上にプロットされ

軸追加
1.2茎追加:私は2つのシナリオを持っている

。次の画像上にマゼンタの線は、その後、私は

ステム追加緑色いずれかを私は
2.2軸追加


2.1ファースト(私は反対に、ステムは軸カバーすべきたい)カバー茎の線はプロットされていません。

私は、なぜ線が描かれていないのか説明する人が必要です。

enter image description here

ファイルjs/stem-functions.js

var svgParams = { 
    // Graph field 
    graphWidth : 200, 
    graphHeight : 120, 
    // Margins 
    leftPadding : 30, 
    rightPadding : 10, 
    upPadding : 15, 
    downPadding : 25, 
} 

function setParametersSvg() { 
    // Size of the SVG object 
    this.svgWidth = this.graphWidth + this.leftPadding + this.rightPadding; 
    this.svgHeight = this.graphHeight + this.upPadding + this.downPadding; 
} 

setParametersSvg.apply(svgParams); 

// Create Scale functions 

var xScale = (function ustawSkaleX(minX, maxX, svgParam) { 
    var xSc = d3.scale.linear() 
    .domain([minX, maxX]) 
    .range([svgParam.leftPadding, svgParam.leftPadding + svgParam.graphWidth]); 

    return xSc; 
} (0, 5, svgParams)); 


var yScale = (function ustawSkaleY(minY, maxY, svgParam) { 
    var ySc = d3.scale.linear() 
    .domain([minY, maxY]) 
    .range([svgParam.upPadding + svgParam.graphHeight, svgParam.upPadding]); 

    return ySc; 
} (0, 0.5, svgParams)); 


function addAxis(svg, svgParam, xScale, yScale) { 
    // Functions drawing axis X 
    var xAxis = d3.svg.axis(); 
    xAxis.scale(xScale) // Scale function for X 
    .orient("bottom") // Location of label 
    .ticks(7);  // Ticks 

    // Add group 
    svg.append("g") 
    .attr("class", "axis") 
    .attr("transform", "translate(0," + (svgParam.svgHeight - svgParam.downPadding) +")") 
    .call(xAxis); 

    // Functions drawing axis Y 
    var yAxis = d3.svg.axis(); 
    yAxis.scale(yScale) // Scale function for Y 
    .orient("left") // Location of label 
    .ticks(4);  // Ticks 

    // Add group 
    svg.append("g") 
    .attr("class", "axis") 
    .attr("transform", "translate(" + (svgParam.leftPadding) + ", 0)") 
    .call(yAxis); 
} 

function addStems(svg, dataset, xScale, yScale) { 
    var circles = svg.selectAll("circle") 
    .data(dataset) 
    .enter() 
    .append("circle") 
    .attr("fill", "green") 
    .attr("cx", function(d) { return xScale(d.x); }) 
    .attr("cy", function(d) { return yScale(d.n); }) 
    .attr("r", 4);  

    var lines = svg.selectAll("line") 
    .data(dataset) 
    .enter() 
    .append("line") 
    .attr("class", "stem-line") 
    .attr("stroke", "green") 
    .attr("stroke-width", "1") 
    .attr("x1", function(d) { return xScale(d.x); }) 
    .attr("x2", function(d) { return xScale(d.x); }) 
    .attr("y1", function(d) { return yScale(0); }) 
    .attr("y2", function(d) { return yScale(d.n); }); 
} 

ファイルjs/stem-examples.js

// Data set 
var p = [ 
    { x: 0, n: 0.15 }, 
    { x: 1, n: 0.25 }, 
    { x: 2, n: 0.40 }, 
    { x: 3, n: 0.15 }, 
    { x: 4, n: 0.05 } 
    ]; 

console.log('probabilities ', p); 

d3.select("body").append("h4").html("Call Stems printing before Axis printing"); 

// Stems before Axis => Axis is over stem 
var svg1 = d3.select("body") 
    .append("svg") 
    .attr("width", svgParams.svgWidth) 
    .attr("height", svgParams.svgHeight); 

addStems(svg1, p, xScale, yScale); 

addAxis(svg1, svgParams, xScale, yScale); 

d3.select("body").append("br"); 

d3.select("body").append("h4").html("Call Axis printing before Stems printing"); 

// Axis before Stems => stem lines are gone (why?) 
var svg2 = d3.select("body") 
    .append("svg") 
    .attr("width", svgParams.svgWidth) 
    .attr("height", svgParams.svgHeight); 

addAxis(svg2, svgParams, xScale, yScale); 

addStems(svg2, p, xScale, yScale); 

ファイルcss/styl.js

svg { border: teal 1px solid; } 

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

.axis text { 
    font-family: sans-serif; 
    font-size: 12px; 
    fill: DarkViolet; 
} 

ファイルindex.html

答えて

1

第一の軸をアペンドした後、茎は正しいアプローチです。問題はそうではありません。

問題は、あなたがこれを行う際に、ということです...

var lines = svg.selectAll("line") 
    .data(dataset) 
    .enter() 
    .append("line") 
    //etc... 

...あなたはすでにそのSVGに存在する行を選択し、それらにデータをバインドしています。

ソリューション

この操作を行います。ここでは私のこの質問/答えを見て、私はnullを選択てる理由を理解するには

var lines = svg.selectAll(null) 
    .data(dataset) 
    .enter() 
    .append("line") 
    //etc... 

を:Selecting null: what is the reason of using 'selectAll(null)' in D3.js?

関連する問題