2016-05-13 79 views
1

我目前正在使用D3.JS每24小時試圖添加一個現有的圖表。使用這樣的JSON數據:D3.JS添加新數據時的柱形圖柱偏移量

[{"name": "bill", "val": 28}, {"name": "kevin", "val": 46}, {"name": "ryan", "val": 23},{"name": "ville", "val": 56}] 

我在我的Y軸上有一個頻率值,在我的x軸上有一個用戶名。我認爲我的放置功能是正確的,但是當添加一個新的列時(儘管偏移應該保持不變),所有的列都被移出來。目標是能夠添加列(新數據)並將列(rects)保留在正確的用戶名之上。

這裏是我當前的工作代碼:

<html> 
<head> 
    <script type="text/javascript" src="d3.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 
    <script type="data/json" src="data.json"></script> 

<style> 
#chart rect{ 
    fill: #4aaeea; 
} 
#chart text{ 
    fill: white; 
    font: 10px sans-serif; 
    text-anchor: end; 
} 
.axis text{ 
    font: 10px sans-serif; 
} 
.axis path, .axis line{ 
    fill: none; 
    stroke : #fff; 
    shape-rendering: crispEdges; 
} 
body{ 
    background: #1a1a1a; 
    color : #eaeaea; 
    padding : 5px; 
} 
    </style> 
    </head> 
<body> 
    <div id="chart"</div> 
<script> 
var margin ={top:20, right:30, bottom:30, left:40}, 
    width=960-margin.left - margin.right, 
    height=500-margin.top-margin.bottom; 
// scale to ordinal because x axis is not numerical 
var x = d3.scale.ordinal().rangeRoundBands([0, width], .1); 
//scale to numerical value by height 
var y = d3.scale.linear().range([height, 0]); 
var chart = d3.select("#chart") 
       .append("svg") //append svg element inside #chart 
       .attr("width", width+(2*margin.left)+margin.right) //set width 
       .attr("height", height+margin.top+margin.bottom); //set height 
var xAxis = d3.svg.axis() 
       .scale(x) 
       .orient("bottom"); //orient bottom because x-axis will appear below the bars 
var yAxis = d3.svg.axis() 
       .scale(y) 
       .orient("left"); 
var data; 
d3.json("http://localhost:8000/data.json", function(error, data){ 
    if (error) return console.warn(error); 
    x.domain(data.map(function(d){ return d.name})); 
    y.domain([0, d3.max(data, function(d){return d.val})]); 

    var bar = chart.selectAll("g") 
        .data(data) 
        .enter() 
        .append("g") 
        .attr("transform", function(d, i){ 
         return "translate("+x(d.name)+", 0)"; 
        }); 
console.log(margin.left); 
    bar.append("rect") 
     .attr("y", function(d) { 
     return y(d.val); 
     }) 
     .attr("x", function(d,i){ 
     return x(margin.left + 2); 
     }) 
     .attr("height", function(d) { 
     return height - y(d.val); 
     }) 
     .attr("width", Math.min.apply(null, [x.rangeBand()-2, 100])); 
     //.attr("width", x.rangeBand()); //set width base on range on ordinal data 
    bar.append("text") 
     .attr("x", (margin.left * 2.2)) 
     .attr("y", function(d) { return y(d.val) }) 
     .attr("dy", ".75em") 
     .text(function(d) { return d.val; }); 

    chart.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate("+margin.left+","+ height+")")   
     .call(xAxis); 

    chart.append("g") 
     .attr("class", "y axis") 
     .attr("transform", "translate("+margin.left+",0)") 
     .call(yAxis) 
     .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Frequency"); 
}); 
function type(d) { 
    d.name = +d.name; // coerce to number 
    return d; 
    } 
</script> 
+0

我認爲需要一個'domain' ......也許'。域序尺度(data.map(函數(d){回報d.name;}))'? – tarulen

+0

此外,你的類型函數是無用的(而且相當危險,如果你調用它,它只會從你的數據中刪除名字) – tarulen

+0

@tarulen我已經刪除了那個函數 - 謝謝指出!我用我的加載函數爲json包裝了所有的d3代碼嗎? – confusedandamused

回答

1

我已經做了一些調整,以包含酒吧rect元素g元素和文本元素的dxdy屬性的位置屬性。

希望這個工作代碼片段有所幫助。

var margin = { 
 
    top: 20, 
 
    right: 30, 
 
    bottom: 30, 
 
    left: 40 
 
    }, 
 
    width = 960 - margin.left - margin.right, 
 
    height = 500 - margin.top - margin.bottom; 
 
// scale to ordinal because x axis is not numerical 
 
var x = d3.scale.ordinal().rangeRoundBands([0, width], .1); 
 

 
//scale to numerical value by height 
 
var y = d3.scale.linear().range([height, 0]); 
 

 
var chart = d3.select("#chart") 
 
    .append("svg") //append svg element inside #chart 
 
    .attr("width", width + margin.left + margin.right) //set width 
 
    .attr("height", height + margin.top + margin.bottom); //set height 
 

 
var xAxis = d3.svg.axis() 
 
    .scale(x) 
 
    .orient("bottom"); //orient bottom because x-axis will appear below the bars 
 

 
var yAxis = d3.svg.axis() 
 
    .scale(y) 
 
    .orient("left"); 
 

 
var data = [{ 
 
    "name": "bill", 
 
    "val": 28 
 
}, { 
 
    "name": "kevin", 
 
    "val": 46 
 
}, { 
 
    "name": "ryan", 
 
    "val": 23 
 
}, { 
 
    "name": "ville", 
 
    "val": 56 
 
}]; 
 

 
x.domain(data.map(function(d) { 
 
    return d.name 
 
})); 
 
y.domain([0, d3.max(data, function(d) { 
 
    return d.val 
 
})]); 
 

 
var barWidth = Math.min.apply(null, [x.rangeBand() - 2, 100]); 
 

 
var bar = chart.selectAll("g") 
 
    .data(data) 
 
    .enter() 
 
    .append("g") 
 
    .attr("transform", function(d, i) { 
 
    return "translate(" + x(d.name) + ", " + y(d.val) + ")"; 
 
    }); 
 

 
bar.append("rect") 
 
    .attr("y", 0) 
 
    .attr("x", barWidth - 10) 
 
    .attr("height", function(d) { 
 
    return height - y(d.val); 
 
    }) 
 
    .attr("width", barWidth); 
 

 
bar.append("text") 
 
    .attr("x", barWidth - 10) 
 
    .attr("y", 0) 
 
    .attr("dx", barWidth/2) 
 
    .attr("dy", ".75em") 
 
    .text(function(d) { 
 
    return d.val; 
 
    }); 
 

 
chart.append("g") 
 
    .attr("class", "x axis") 
 
    .attr("transform", "translate(" + margin.left + "," + height + ")") 
 
    .call(xAxis); 
 

 
chart.append("g") 
 
    .attr("class", "y axis") 
 
    .attr("transform", "translate(" + margin.left + ",0)") 
 
    .call(yAxis) 
 
    .append("text") 
 
    .attr("transform", "rotate(-90)") 
 
    .attr("y", 6) 
 
    .attr("dy", ".71em") 
 
    .style("text-anchor", "end") 
 
    .text("Frequency"); 
 

 
function type(d) { 
 
    d.name = +d.name; // coerce to number 
 
    return d; 
 
}
#chart rect { 
 
    fill: #4aaeea; 
 
} 
 
#chart text { 
 
    fill: white; 
 
    font: 10px sans-serif; 
 
    text-anchor: end; 
 
} 
 
.axis text { 
 
    font: 10px sans-serif; 
 
} 
 
.axis path, 
 
.axis line { 
 
    fill: none; 
 
    stroke: #fff; 
 
    shape-rendering: crispEdges; 
 
} 
 
body { 
 
    background: #1a1a1a; 
 
    color: #eaeaea; 
 
    padding: 5px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<div id="chart" </div>

+0

我在重新創建您的代碼片段之外時遇到問題。這是運行它的當前狀態。 https://i.imgur.com/uFUFkJs.png 唯一的區別是我加載了一個json文件。任何其他想法? 當前的代碼:https://github.com/kzisme/logViz/blob/master/index.html – confusedandamused

+0

看起來像x軸稍微向左移動(可能是約40像素 - margin.left) 。檢查x軸組元素的屬性變換是否與片段中的.attr(「transform」,「translate(0,」+ height +「)」)相同。 – Gilsha

+0

這是我在嘗試添加新數據值(從我的json文件中)時得到的結果。我是否正確追加?軸組元素匹配的片段 - 可以在這裏看到https://github.com/kzisme/logViz/blob/master/index.html#L106 – confusedandamused