2012-11-02 47 views
18

我正在尝试使用nvd3创建垂直堆叠条形图。我将使用离散数据值,而不是随机生成的值作为website上的示例。nvd3具有离散值的堆叠条形图

我试图玩弄集团/堆积条形图的活代码示例,并把包含我自己的价值观JSON数据。我试图做的是从水平条形图中获取JSON数据并将其作为垂直条形图的数据。

这是我就位在组/堆积条形图中的数据在实时代码示例中使用的数据:

[ 
    { 
    "key": "Series1", 
    "color": "#d62728", 
    "values": [ 
     { 
     "label" : "Group A" , 
     "value" : -1.8746444827653 
     } , 
     { 
     "label" : "Group B" , 
     "value" : -8.0961543492239 
     } , 
     { 
     "label" : "Group C" , 
     "value" : -0.57072943117674 
     } , 
     { 
     "label" : "Group D" , 
     "value" : -2.4174010336624 
     } , 
     { 
     "label" : "Group E" , 
     "value" : -0.72009071426284 
     } , 
     { 
     "label" : "Group F" , 
     "value" : -0.77154485523777 
     } , 
     { 
     "label" : "Group G" , 
     "value" : -0.90152097798131 
     } , 
     { 
     "label" : "Group H" , 
     "value" : -0.91445417330854 
     } , 
     { 
     "label" : "Group I" , 
     "value" : -0.055746319141851 
     } 
    ] 
    }, 
    { 
    "key": "Series2", 
    "color": "#1f77b4", 
    "values": [ 
     { 
     "label" : "Group A" , 
     "value" : 25.307646510375 
     } , 
     { 
     "label" : "Group B" , 
     "value" : 16.756779544553 
     } , 
     { 
     "label" : "Group C" , 
     "value" : 18.451534877007 
     } , 
     { 
     "label" : "Group D" , 
     "value" : 8.6142352811805 
     } , 
     { 
     "label" : "Group E" , 
     "value" : 7.8082472075876 
     } , 
     { 
     "label" : "Group F" , 
     "value" : 5.259101026956 
     } , 
     { 
     "label" : "Group G" , 
     "value" : 0.30947953487127 
     } , 
     { 
     "label" : "Group H" , 
     "value" : 0 
     } , 
     { 
     "label" : "Group I" , 
     "value" : 0 
     } 
    ] 
    } 
] 

我取代了函数调用的JavaScript来数据的数据():

nv.addGraph(function() { 
    var chart = nv.models.multiBarChart(); 

    chart.xAxis 
     .tickFormat(d3.format(',f')); 

    chart.yAxis 
     .tickFormat(d3.format(',.1f')); 

    d3.select('#chart svg') 
     .datum(data) 
     .transition().duration(500).call(chart); 

    nv.utils.windowResize(chart.update); 

    return chart; 
}); 

该图恰当地标记了我的系列,但没有显示条形图。该图表可否不采取这种类型的数据?我得到了我的数据与横条的工作,但我想尽可能使用垂直条。

+0

它是如何“知道”要使用哪个系列? –

+0

嘿@rkseth您还可以在小提琴中提供您的工作代码吗? –

回答

40

组/堆积条形图(所述multiBarChart模型)用于xy属性,其中y是条的高度和x是标签,并且可以是一些数字或文字。

不幸的是没有太多关于确切数据格式的文档,我发现所有例子都使用了一些令人困惑的函数来生成数据。因此,这里是我得到了使用混合数字和文本标签工作的例子:

var chart = nv.models.multiBarChart(); 
 
d3.select('#chart svg').datum([ 
 
    { 
 
    key: "S1", 
 
    color: "#51A351", 
 
    values: 
 
    [  
 
     { x : "A", y : 40 }, 
 
     { x : "B", y : 30 }, 
 
     { x : 5, y : 20 } 
 
    ] 
 
    }, 
 
    { 
 
    key: "S2", 
 
    color: "#BD362F", 
 
    values: 
 
    [  
 
     { x : "A", y : 60 }, 
 
     { x : "B", y : 50 }, 
 
     { x : 5, y : 70 } 
 
    ] 
 
    } 
 
]).transition().duration(500).call(chart);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.1/nv.d3.min.js"></script> 
 
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.1/nv.d3.min.css"> 
 

 
<div id="chart" style="height: 200px;"><svg></svg></div>

group/stacked bar chart


现在有两个问题与您的代码:

  1. 您需要删除tickFormat您打算用文本标注轴。
    tickFormat函数设置轴标签的数字格式。它只有在标签可以转换为数字并且在您的情况下会导致NaN

  2. 你需要或者到labelvalue属性重命名为xy或者您需要创建功能,以提供这些值:

    var chart = nv.models.multiBarChart(); 
    
    chart.x(function(d) { return d.label; }); 
    chart.y(function(d) { return d.value; }); 
    
    d3.select('#chart svg') 
        .datum(/* your data */) 
        .transition().duration(500).call(chart); 
    
+1

这对我有用!谢谢您的帮助。 – rhlsthrm

+1

非常有帮助,特别是最后一部分,您展示了如何创建函数以提供我们想要的任何值。我用它来链接它与一个选择框来选择我想要显示的值。 – dominicbri7

+0

真棒答案,这是一个有用的是...谢谢。 – Vish