20

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

我尝试使用 Group / Stacked Bar Chart 的实时代码示例,并放入包含我自己的值的 JSON 数据。我试图做的是从水平条形图中获取 JSON 数据并将其作为垂直条形图的数据。

这是我在实时代码示例中使用的数据来代替 Group / Stacked Bar Chart 中的数据:

[
  {
    "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中对data()的函数调用替换为数据:

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;
});

该图正确标记了我的系列,但未显示条形。这张图可以不取这种数据吗?我的数据使用水平条,但如果可能的话,我想使用垂直条。

4

1 回答 1

44

分组/堆叠条形图(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>

分组/堆积条形图


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

  1. 您需要删除tickFormat您打算用文本标记的 for 轴。
    tickFormat函数设置轴标签的数字格式。只有当标签可以转换为数字并且会导致NaN您的情况时,它才会起作用。

  2. 您需要将labelandvalue属性重命名为xandy或者您需要创建函数来提供这些值:

    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); 
    
于 2012-11-24T13:39:23.090 回答