NVD3在条形图中强制特定宽度的条形

时间:2013-07-12 14:35:23

标签: javascript d3.js nvd3.js

我试图在nvd3离散条形图上设置特定的宽度值。我可以在初始渲染后更改rect元素,但似乎有一些方法可以在图表的设置中指定条宽。

这是我当前的图表设置。

nv.addGraph ->
  chart = nv.models.discreteBarChart()
    .x (d) ->
      return d.label
    .y (d) ->
      return d.value
    .staggerLabels(false).showValues(false)
    .color(['#56bd78']).tooltips(false)
    .margin({top: 0, right: 0, bottom: 30, left: 0})

  chart.tooltipContent (key, x, y, e, graph) ->
    return '<h3><span>' + parseFloat(y) + '</span><em>' +
             key + '</em></h3>'

  chart.xAxis.tickFormat (d) ->
      return d3.time.format('%b')(new Date('2013/'+d+'/01'))
  # chart.xAxis.tickPadding({top: 0, bottom: 0, left: 20, right:30})

  d3.select(element).datum(data).transition().duration(500).call(chart)

  nv.utils.windowResize(chart.update)
  return chart

我假设因为我找不到关于这个特定问题的任何发布的问题,它可能很简单,我想念它。提前谢谢。

4 个答案:

答案 0 :(得分:11)

尝试chart.groupSpacing(0.5)并相应更改值以查看它是否解决了问题。

答案 1 :(得分:3)

解决这个问题的好方法是使用CSS:

.nv-bars rect {
  width: 20px;
}

这是我们在我们的应用程序中所做的,它运作良好。

答案 2 :(得分:1)

在Nvd3中,条形图中单个条的宽度取决于图表中数据项的数量。

好的,首先,groupSpacing适用于nvd3的多条形图,而不适用于离散条形图。但是,它不能解决您的问题。

其他修复方法,例如更改bar(rect)的css属性和将宽度设置为固定值或使用调度事件,可以确保减小钢筋的宽度,但会破坏布局,您将拥有可以根据条形宽度的更改手动进行计算以设置数据标签和其他值。

.nv-groups .nv-group rect{
    width: 50px;
}

 chart.dispatch.on("renderEnd", (d) => {
    d3.selectAll("rect.discreteBar").attr('width', 50);
    d3.selectAll("g.nv-bar text").attr('x', 30);
    d3.selectAll(".nv-discretebar").attr('transform', 'translate(100,0)');  
}
);

无论如何,由于我的动态数据没有固定的特定数据长度,因此我不想修补该库或添加手动计算。

对我来说,解决此问题的方法是将库从nvd3更改为apexcharts(http://apexcharts.com/)。

在更改顶点图表所需的数据格式时,移位仅需要一点时间,但是顶点图表确实具有许多功能,只需在{{1}中设置columnWidth属性即可轻松解决您的问题},共plotOptions

答案 3 :(得分:0)

要回答我自己的问题,我必须使用jQuery“手动”更改值,以便按照我的意愿显示图表。

$(element+' rect.discreteBar').attr('transform', 'translate(17)').attr('width', 20)
$(element+' .nv-axis g text').attr('transform', 'translate(0, 5)') 

正如Lars所指出的,图书馆根据项目数量动态计算宽度,这是有道理的。