7

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

这是我当前的图表设置。

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

4 回答 4

11

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

于 2014-02-06T14:40:28.013 回答
3

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

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

这就是我们在应用程序中所做的,效果很好。

于 2016-03-25T17:35:41.560 回答
2

在 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/)。

这种转变只需要一点时间来更改 apexcharts 所需的数据格式,但 apexcharts 确实有很多功能,只需将columnWidth属性设置plotOptionsbar.

于 2020-06-28T15:35:44.707 回答
1

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

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

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

于 2013-07-17T23:14:23.507 回答