多个图表上的组合elasticY

问题描述 投票:1回答:1

我想通过函数设置条形图的轴,但不在elasticY()语法的范围内。这里的用例是我在同一维/组中有两个条形图,如下所示:

chart1
.dimension(dim).group(gr)
.valueAccessor(d => d.value.one)
.elasticY()

chart1
.dimension(dim).group(gr)
.valueAccessor(d => d.value.two)
.elasticY()

这些工作,但是elasticY()分别设置域,这意味着两个图表的轴不对齐。我可以设置.y(d3.scaleLinear().domain([0,100])),但这会使图表保持静态。我更喜欢做的是:

.valueAccessor(function(d) {
result = func(d)// function to return the max of value.one and value.two
chart1.y().domain([0, result])
return d.value.one;
}

但是这似乎不起作用。

d3.js dc.js
1个回答
0
投票

[.elasticY(true)使图表每次绘制图表时都计算最小值和最大值,并将它们应用于Y比例尺的域。

如果您想要更复杂的行为,则可以设置elasticY(false) and add preRenderandpreRedraw` handlers来按照您想要的方式设置域。

这里是一个功能,>

  • 获取图表列表
  • 创建一个preRender / preRedraw处理程序,
    • 通过连接所有图表的.group().all()并应用d3.max(),计算所有图表中所有值的最大值
    • 并将域[0, maxY]应用于图表
    • 呼叫.rescale()告诉图表比例已更改:

处理程序:

const common_elasticY = charts => chart => {
    const maxY = d3.max(Array.prototype.concat.apply([],
        charts.map(c => c.group().all())), kv => kv.value);
    chart.y().domain([0, maxY]);
    chart.rescale();
};

在图表列表上实例化处理程序:

const preHandler = common_elasticY([yearBarChart, spendBarChart]);

为每个图表安装preRenderpreRedraw事件的处理程序:

yearBarChart.on('preRender', preHandler)
  .on('preRedraw', preHandler);
spendBarChart.on('preRender', preHandler)
  .on('preRedraw', preHandler);

two bar charts with combined elasticY

Demo fiddle

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.