2014-07-24 51 views
0

我一直在尋找一段時間來解決這個問題。我已經根據此圖創建了公司儀表板的條形圖。d3.js/JavaScript能否像圖表一樣更新文本值?

http://bl.ocks.org/mbostock/3887051

這是偉大的工作,但是我想現在做的是顯示一些,我在文字圖形的下面因此,例如外部數據。 「今日總銷售額= ......」而不僅僅是一個月的圖表。

所以我想我問的是有沒有辦法使用文本元素或任何類似d3.js做到這一點?如果不指出我可能會很棒的事情。生病還補充說,數據來自csv。

這是代碼:

var margin = {top: 20, right: 20, bottom: 30, left: 40}, 
width = 960 - margin.left - margin.right, 
height = 500 - margin.top - margin.bottom; 

var x0 = d3.scale.ordinal() 
.rangeRoundBands([0, width], .1); 

var x1 = d3.scale.ordinal(); 

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

var color = d3.scale.ordinal() 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); 

var xAxis = d3.svg.axis() 
    .scale(x0) 
    .orient("bottom"); 

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .tickFormat(d3.format(".2s")); 

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

d3.csv("data.csv", function(error, data) { 
    var Names = d3.keys(data[0]).filter(function(key) { return key !== "Month"; }); 

    data.forEach(function(d) { 
    d.Total = Names.map(function(name) { return {name: name, value: +d[name]}; }); 
    }); 

    x0.domain(data.map(function(d) { return d.Month; })); 
    x1.domain(Names).rangeRoundBands([0, x0.rangeBand()]); 
    y.domain([0, d3.max(data, function(d) { return d3.max(d.Total, function(d) { return  d.value; }); })]); 

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

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Sales Value £"); 

    var text = svg.selectAll("text") 
     .data(data) 
     .enter() 
     .append("text"); 


    var Month = svg.selectAll(".Month") 
     .data(data) 
    .enter().append("g") 
     .attr("class", "g") 
     .attr("transform", function(d) { return "translate(" + x0(d.Month) + ",0)"; }); 

    Month.selectAll("rect") 
     .data(function(d) { return d.Total; }) 
    .enter().append("rect") 
     .attr("width", x1.rangeBand()) 
     .attr("x", function(d) { return x1(d.name); }) 
     .attr("y", function(d) { return y(d.value); }) 
     .attr("height", function(d) { return height - y(d.value); }) 
     .style("fill", function(d) { return color(d.name); }); 

    var legend = svg.selectAll(".legend") 
     .data(Names.slice().reverse()) 
    .enter().append("g") 
     .attr("class", "legend") 
     .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); 

    legend.append("rect") 
     .attr("x", width - 18) 
     .attr("width", 18) 
     .attr("height", 18) 
     .style("fill", color); 

    legend.append("text") 
     .attr("x", width - 24) 
     .attr("y", 9) 
     .attr("dy", ".35em") 
     .style("text-anchor", "end") 
     .text(function(d) { return d; }); 

}); 

如果您需要任何更多的信息只是說

乾杯!

+0

是否要將x軸標籤更改爲「今日總銷售額= ...」或者是否希望在整個圖表下面添加標籤? – jluckin

+0

@JonathanLuckin低於整個圖表 – Sam

回答

0

在HTML文件中,建立圖表低於股利和股利爲您的標籤

<div id="chart"></div> 
<div id="label"></div> 

在你D3的代碼,而不是附加的SVG元素的身體,選擇「圖表」 div並附加一個svg元素。

var svg = d3.select("#chart").append("svg"). ... 

使用該svg元素繪製圖表,就像在上面的代碼中一樣。

在代碼中的某個點計算當天的總銷售額,並創建一個名爲totalSales變量。您可以在繪製圖表時總結銷售額,但只要計算出totalSales就無關緊要。

的「標籤」的div

var svgLabel = d3.select("#label").append("svg") ... 

使用創建另一個SVG元素此svgLabel寫文本元素與totalSales作爲文本屬性。

svg.append("text") 
... 
.text(totalSales); 
+0

我不確定是否理解最後幾行100%。這是我的整個位:'d3.csv( 「OrderValueToday.csv」),功能(錯誤數據){VAR = svgLabel d3.select( 「#標籤」).append( 「SVG」) svg.append( 「text」) .text(totalSales); }'這個工作,如果我加載另一個外部csv除了一個建立圖。此值將隨時更新,如圖所示,因此值也將更改 – Sam

+0

只需在添加/刪除數據時跟蹤總銷售額。要麼將totalSales數據綁定到標籤div,要麼執行類似'var text = svg.append(「text」)...'的任何操作,並且只要加載另一個csv就可以執行類似'text.text(totalSales);' – jluckin

+0

我現在完全搞不清楚了:/如果你可以通過執行'd3.csv(OrderValueToday.csv)...'來從csv獲取一個值,然後在那個階段I現在只是失去了......按照什麼順序,我在哪裏做其他步驟。這是我到目前爲止所管理的,但它沒有做任何事情 - 'd3.csv(「OrderValueToday。CSV 「),功能(錯誤,數據){ VAR svgLabel = d3.select(」 #標籤 「)。附加(」 SVG 「) } 變種totalSales = svg.append(」 文本「) 的.text( totalSales);'感謝您的幫助! – Sam