2016-10-12 56 views
2

我有一個d3條形圖,顯示了一系列使用JSON文件數據的條形圖。默認情況下,所有數據都顯示在圖表上,用戶可以使用d3的筆刷功能放大圖表的特定部分。帶刷子的d3條形圖

我已經建立了plunkr這裏:https://plnkr.co/edit/TJrbCN2tUOlngQbjogCJ?p=preview

但是我有幾個問題:

1)x軸的標籤,而不是隻顯示個月平均的模糊混亂。

x軸的設置,如:

var xScale = d3.scale.ordinal().rangeRoundBands([0, mainWidth], 0); 
var xAxis = d3.svg.axis().scale(xScale).orient('bottom') 
      .innerTickSize(-mainHeight) 
      .outerTickSize(0) 
      .tickPadding(10); 
xScale.domain(data.map(function (d) { 
     return d.date; 
    })); 

這有什麼不好呢?

2.)拖動畫筆時,它會導致xAxis只顯示兩個標籤,它們會更改爲畫筆的正確開始和結束日期,但不會像正常一樣顯示日期。

3.)這些條不會縮放到您所刷新的位置,您仍然可以在defaultRange函數中看到默認條。

回答

2

說實話,你的問題沒有得到回答(即使是賞金)的原因是你的代碼是難以閱讀和難以解決的。我最初着手「修復」它,但很快就失去了如此多的寬度,高度和邊緣,我無法遵循它。那麼,我們可以在這裏做什麼?

首先,使用d3.js版本4.沒有錯,3版本,但新的發展很可能會更好開始與過時,不支持的軟件。

其次,尋找你正在嘗試做的規範例子。 M. Bostock的任何內容都是您應該關注的起點。剪切/粘貼並開始修改。在你的情況下,我會從this example開始。

從該基線開始,我能夠適應您的數據並在大約10分鐘內將其切換到條形圖。這裏是the code example


全碼:

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

 
.area { 
 
    fill: steelblue; 
 
} 
 

 
.bar { 
 
    fill: steelblue; 
 
    clip-path: url(#clip); 
 
} 
 

 
.zoom { 
 
    cursor: move; 
 
    fill: none; 
 
    pointer-events: all; 
 
} 
 

 
</style> 
 
<svg width="960" height="500"></svg> 
 
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<script> 
 

 
var svg = d3.select("svg"), 
 
    margin = {top: 20, right: 20, bottom: 110, left: 40}, 
 
    margin2 = {top: 430, right: 20, bottom: 30, left: 40}, 
 
    width = +svg.attr("width") - margin.left - margin.right, 
 
    height = +svg.attr("height") - margin.top - margin.bottom, 
 
    height2 = +svg.attr("height") - margin2.top - margin2.bottom; 
 

 
var parseDate = d3.timeParse("%Y-%m"); 
 

 
var x = d3.scaleTime().range([0, width]), 
 
    x2 = d3.scaleTime().range([0, width]), 
 
    y = d3.scaleLinear().range([height, 0]), 
 
    y2 = d3.scaleLinear().range([height2, 0]); 
 

 
var xAxis = d3.axisBottom(x), 
 
    xAxis2 = d3.axisBottom(x2), 
 
    yAxis = d3.axisLeft(y); 
 

 
var brush = d3.brushX() 
 
    .extent([[0, 0], [width, height2]]) 
 
    .on("brush end", brushed); 
 

 
var area = d3.area() 
 
    .curve(d3.curveMonotoneX) 
 
    .x(function(d) { return x(d.Date); }) 
 
    .y0(height) 
 
    .y1(function(d) { return y(d.Total); }); 
 

 
var area2 = d3.area() 
 
    .curve(d3.curveMonotoneX) 
 
    .x(function(d) { return x2(d.Date); }) 
 
    .y0(height2) 
 
    .y1(function(d) { return y2(d.Total); }); 
 

 
svg.append("defs").append("clipPath") 
 
    .attr("id", "clip") 
 
    .append("rect") 
 
    .attr("width", width) 
 
    .attr("height", height); 
 

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

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

 
d3.json("https://jsonblob.com/api/58063c0fe4b0bcac9f814ee6", function(error, data) { 
 
    
 
    if (error) throw error; 
 
    
 
    data.forEach(function(d){ 
 
    d.Date = parseDate(d.Date); 
 
    }); 
 

 
    x.domain(d3.extent(data, function(d) { return d.Date; })); 
 
    y.domain([0, d3.max(data, function(d) { return d.Total; })]); 
 
    x2.domain(x.domain()); 
 
    y2.domain(y.domain()); 
 
    
 
    focus.selectAll(".bar") 
 
    .data(data) 
 
    .enter().append("rect") 
 
     .attr("class", "bar") 
 
     .attr("x", function(d) { return x(d.Date); }) 
 
     .attr("y", function(d) { return y(d.Total); }) 
 
     .attr("width", width/data.length - 2) 
 
     .attr("height", function(d) { return height - y(d.Total); }); 
 

 
    focus.append("g") 
 
     .attr("class", "axis axis--x") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis); 
 

 
    focus.append("g") 
 
     .attr("class", "axis axis--y") 
 
     .call(yAxis); 
 

 
    context.append("path") 
 
     .datum(data) 
 
     .attr("class", "area") 
 
     .attr("d", area2); 
 

 
    context.append("g") 
 
     .attr("class", "axis axis--x") 
 
     .attr("transform", "translate(0," + height2 + ")") 
 
     .call(xAxis2); 
 

 
    context.append("g") 
 
     .attr("class", "brush") 
 
     .call(brush) 
 
     .call(brush.move, x.range()); 
 
}); 
 

 
function brushed() { 
 
    var s = d3.event.selection || x2.range(); 
 
    x.domain(s.map(x2.invert, x2)); 
 
    focus.select(".area").attr("d", area); 
 
    focus.select(".axis--x").call(xAxis); 
 
    focus.selectAll(".bar") 
 
    .attr("x", function(d) { return x(d.Date); }); 
 
} 
 

 
</script>

+0

嗨,馬克,將有可能以顯示與疊置條形圖的例子嗎?另外,我的xaxis不是類型日期,而是字符串。 – Pintu