2015-03-31 21 views
9

DC.js github上,作爲使用dc.js庫的示例列出了Stock Market Selection Strategy by Lon Riesberg如何用dc.js創建一行堆棧的行圖?

Lon能夠創建堆疊的行圖並將其顯示爲單行。

enter image description here

我希望能夠完成同樣的事情。我只能弄清楚如何創建一個行圖,如in my codepen及以下所示。

HTML

<script src="https://rawgit.com/mbostock/d3/master/d3.js" charset="utf-8"></script> 
<script type="text/javascript" src="https://rawgithub.com/NickQiZhu/dc.js/master/web/js/crossfilter.js"></script> 
<script type="text/javascript" src="https://rawgit.com/dc-js/dc.js/master/dc.js" ></script> 


<div id="rowChart"></div> 

的Javascript

items = [ 
      {Id: "01", Name: "Red", Price: "1.00", Quantity: "1",TimeStamp:111}, 
      {Id: "02", Name: "White", Price: "10.00", Quantity: "1",TimeStamp:222}, 
      {Id: "04", Name: "Blue", Price: "9.50", Quantity: "10",TimeStamp:434}, 
      {Id: "03", Name: "Red", Price: "9.00", Quantity: "2",TimeStamp:545}, 
      {Id: "06", Name: "Red", Price: "100.00", Quantity: "2",TimeStamp:676}, 
      {Id: "05",Name: "Blue", Price: "1.20", Quantity: "2",TimeStamp:777} 
     ]; 


var ndx = crossfilter(items); 


var Dim = ndx.dimension(function (d) {return d.Name;}) 


var RowBarChart1 = dc.rowChart("#rowChart") 
RowBarChart1 
    .width(250).height(500) 
    .margins({top: 20, left: 15, right: 10, bottom: 20}) 
    .dimension(Dim) 
    .group(Dim.group().reduceCount()) 
    .elasticX(true) 
    .label(function (d) {return d.key + " " + d.value;}) 
    .ordering(function(d) { return -d.value }) 
    .xAxis().tickFormat(function(v){return v}).ticks(3); 




dc.renderAll(); 

我怎麼會做出這樣的層疊排表,其中每個部分是「紅色」,「白色」或「藍」,並顯示在一個行?

我的目標是建立一個可以構建的工作示例。迄今爲止的答案已經有所幫助,但我仍然無法構建這一點。

回答

4

你可以用d3.js創建一個div併爲flex添加屬性...

http://codepen.io/luarmr/pen/BNQYov

var chart = d3.select("#rowChart"); 

var bar = chart.selectAll("div") 
    .data(data) 
    .enter().append("div") 
     .attr('style',function(d,i){ 
     return (
     'flex:' + d.Quantity + '; ' 
     + 'background:' + color(i) + ';' 
     ) 
    }) 

的attr.style可以改善。

您可以添加前綴WebKit的

http://caniuse.com/#search=flex

編輯

http://codepen.io/luarmr/pen/yNVZMN

+0

加...您可以通過CSS控制大小和其他選項。 – 2015-05-26 19:05:31

+0

我試圖利用這個,但似乎無法得到它的工作:http://codepen.io/chriscruz/pen/yNVZYL。它似乎已經失去了Lon在這裏創建的一些交互功能(http://stackoverflow.com/questions/29360042/how-to-create-stacked-row-chart-with-one-row-with-dc -js)。例如,當我點擊Lon創建的欄時,它會更改其他圖表。那有意義嗎? – Chris 2015-05-27 16:59:18

+0

嘿,你有另一個代碼這裏 http://codepen.io/luarmr/pen/yNVZMN 我添加工具提示從http://cbracco.me/a-simple-css-tooltip/ 而行動點擊爲好。你只需要重畫圖... 問題是...你想展示什麼數據? – 2015-05-27 17:28:03

3

用於生成堆疊條形圖的JavaScript代碼根本不使用DC.js。它只使用D3.js.這可以從app.min.js的美化轉換中看出;這兩個函數中的一個(或兩個)是生成堆疊條形圖的函數:

G = function(e, t) { 
     var r = (o - 40)/t; 
     f = ""; 
     var a = d3.select("#categories-chart").append("svg").attr("height", 50).attr("width", o), 
      s = 0; 
     a.selectAll("rect").data(e).enter().append("rect").attr("category", function(e) { 
      return e.key 
     }).attr("x", function(e) { 
      var t = s, 
       a = Math.floor(r * e.value); 
      return s += a, t 
     }).attr("y", 7).attr("width", function(e) { 
      var t = Math.floor(r * e.value); 
      return t 
     }).attr("height", 25).style("fill", function(e) { 
      return "" != e ? "" === f || f === e.key ? d3.rgb(i[e.key]) : d3.rgb(i[e.key]).darker(1.75) : void 0 
     }).on("click", function(e) { 
      f = e.key, d3.select("#categories-chart").select(".reset").style("display", null), m.filter(f).top(t), C(m, t), dc.renderAll() 
     }).on("mouseover", function() { 
      d3.select(this).style("cursor", "pointer") 
     }), $("rect").popover({ 
      container: "body", 
      trigger: "hover", 
      placement: "top", 
      content: function() { 
       return d3.select(this).attr("category") 
      } 
     }) 
    }, 
    C = function(e, t) { 
     var r = (o - 40)/t, 
      a = 0, 
      s = d3.select("#categories-chart"); 
     s.selectAll("rect").data(e).transition().duration(150).attr("x", function(e) { 
      var t = a, 
       s = Math.floor(r * e.value); 
      return a += s, t 
     }).attr("y", 7).attr("width", function(e) { 
      var t = Math.floor(r * e.value); 
      return t 
     }).attr("height", 25).attr("category", function(e) { 
      return e.key 
     }).style("fill", function(e) { 
      return "" != e ? "" === f || f === e.key ? d3.rgb(i[e.key]) : d3.rgb(i[e.key]).darker(1.75) : void 0 
     }), $("rect").popover({ 
      container: "body", 
      trigger: "hover", 
      placement: "top", 
      content: function() { 
       return d3.select(this).attr("category") 
      } 
     }) 
    }, 

正如你所看到的,沒有DC.js.環顧其他地方,似乎沒有DC.js本地解決方案。目前,您可能必須使用D3.js(例如jsFiddle)。

+3

感謝@davidhwang。本週第二次有人試圖使用那個實際上並不是直流電的例子。 – Gordon 2015-03-31 14:31:20

1

我沒有發現任何API來創建DC.js疊排聊天,所以使用D3.js與https://www.dashingd3js.com/d3js-scales

var items = [ 
      {Id: "01", Name: "Red", Price: "1.00", Quantity: 1,TimeStamp:111}, 
      {Id: "02", Name: "Green", Price: "10.00", Quantity: 1,TimeStamp:222}, 
      {Id: "04", Name: "Blue", Price: "9.50", Quantity: 4,TimeStamp:434}, 
      {Id: "03", Name: "Orange", Price: "9.00", Quantity: 2,TimeStamp:545}, 
      {Id: "06", Name: "Red", Price: "100.00", Quantity: 2,TimeStamp:676}, 
      {Id: "05",Name: "purple", Price: "1.20", Quantity: 2,TimeStamp:777} 
     ]; 



var max_x = 700; //maximum width of the graph 
var height = 20; //maximum height 

var temp_x = 0 ; 
// calculating the quantity of all items 
for (var i = 0; i < items.length; i++) { 
    temp_x = temp_x + items[i].Quantity; 
} 


var svgContainer = d3.select("body").append("svg") 
            .attr("width", max_x) 
            .attr("height", height) 

var rectangles = svgContainer.selectAll("rect") 
          .data(items) 
          .enter() 
          .append("rect"); 
//temporary variable to mark start and end of an item. 
var start=0; 
var end=0; 
var end1=0; 
var rectangleAttributes = rectangles 
          .attr("x", function (d) { 
          // dynamically calculate the starting point of each item 
          start=end; 
          end=end+(d.Quantity * max_x)/temp_x; 
          return start; 
          }) 
          .attr("height", height) 
          .attr("width", function (d) { 
          //dynamically calculate the width of each item 
          end1=(d.Quantity * max_x)/temp_x; 
          return end1; }) 
          .style("fill", function(d) { return d.Name; }); 

HTML代碼的幫助

<script src="https://rawgit.com/mbostock/d3/master/d3.js" charset="utf-8"> </script> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" ></script> 
<div id="rowChart"></div> 

例如:http://codepen.io/anon/pen/vOXPBq?editors=101

+0

我試圖實現,但它似乎並沒有工作:http://codepen.io/chriscruz/pen/rVWPxx。它沒有Lon能夠在此實現的相同交互功能:http:// www。acrodatics.com/。請注意,當我點擊欄時,它會更改網站上的其他組件。 – Chris 2015-05-27 17:02:10