dcjs动态缩放以适合值范围

以撒

我在DCjs中有一个行图,用于绘制给定参数的前N个值。但是,对于未过滤的数据,它们之间的差异很小。

绘制的帐户没有过滤器,帐户ID和完整范围

我必须用每行的唯一标识符来标记每一行,因为我的随机生成器会产生两个相同的名称,这意味着如果使用名称作为维,则最终将得到价值大于100%的一万个数据点之一。

但是,这里的主要问题是每行之间的差异很小,并且可能在0.0001左右。

但是,如果我使用放大X轴的该部分

var max = dim.top[1][0].value;
var min = dim.top(10)[9].value;    

chart
  .dimension(dim)
  .group(group)
  .x(d3.scaleLinear()
     .range([-100, chart.width()])
     .domain([min-(max-min)*0.1,max])
  )
  .cap(10)
  .othersGrouper(null)
  .colors(['#ff0000']);

在此处输入图片说明

首先,我松开左侧的ID标签。其次,由于我还必须使用.elasticX(false)来进行缩放,这意味着当我添加滤镜时,x轴的范围不会随例如值的变化而变化。

在此处输入图片说明

是否有办法获得动态缩放,以使x轴的范围取决于显示的值的范围?

高登

elasticX 是一个非常简单的功能,几乎可以执行您的代码,尽管它根据数据是正数还是负数将最小值或最大值锁定为零:

        var extent = d3.extent(_rowData, _chart.cappedValueAccessor);
        if (extent[0] > 0) {
            extent[0] = 0;
        }
        if (extent[1] < 0) {
            extent[1] = 0;
        }

calculateAxisScale源

在每次渲染和重绘之前,都会(间接)调用此代码。

这是一些通用建议,用于何时elasticXelasticY不完全按照您的要求进行操作。我从未见过失败!(这是在诸如dc.js这样的古怪代码库中说的。)

首先,禁用elasticX然后创建一个计算X域并对其进行设置的函数:

function custom_elastic(chart) {
  var max = chart.dimension().top[1][0].value;
  var min = chart.dimension().top(10)[9].value;
  chart.x().domain([min,max]);
}

为了普遍起见,我已经在图表上对其进行了参数化。

现在我们可以在preRender和preRedraw事件上调用此函数这些事件在触发时将通过图表:

chart.on('preRender', custom_elastic)
     .on('preRedraw', custom_elastic);

那应该做到的!

顺便说一句,您可能不想设置刻度范围-它是由图表自动设置的,并且比起您要设置的要复杂一些,因为它考虑了边距。

调试最小和最大

看着你的小提琴,我意识到我没有再看你如何计算最小和最大。

我也没有注意到您的范围从-100开始。

良好的第一步,将其记录下来;它报告

min: 0.81, max: 0.82

这是不正确的。前十名从0.96到1。

问题是维度的键是id,因此返回的行的.top()字母顺序相反(“最大”字符串)。

再次,您在正确的道路上

console.log(Group.top(Infinity))

是! 该小组将按值列出前10名。

var top10 = thischart.group().top(10);
var max = top10[0].value;
var min = top10[9].value;

真好!

半工作条弹性

小提琴

但是,等等,看起来条形图在图表的左侧延伸了吗?

用renderlet破坏行图以从左边缘开始绘制条形

好的,现在很清楚,行图不支持此功能。这是一种将条形调整到左侧边缘的技巧:

chart.on('renderlet', function(chart) {
    var transform = chart.select('g.row rect').attr('transform');
    var tx = +transform.split('(')[1].split(',')[0];
    chart.selectAll('g.row rect')
        .attr('transform', null)
        .attr('width', function(d) {
            return +d3.select(this).attr('width') + tx;
        })
    chart.selectAll('g.row text.row')
        .attr('transform', null);    
})

所有行rect将被一个较大的负数抵消,这是我们首先在中获取的tx然后,我们transform从矩形和文本中都删除,并增加到tx矩形行的宽度。

好,除了最后一个酒吧

小提琴

大!但是最后一个酒吧在哪里?好吧,我们采用了最小值和最大值的前十个值,因此第十个小节是最小值。

您必须找出最适合自己的方法,但是我发现查看前20个值会使前10个值保持良好状态:

var N = 20;
var topN = thischart.group().top(N);
var max = topN[0].value;
var min = topN[N-1].value;

好的界限

最后的小提琴

该技巧不适用于内置过渡,因此我在此图表中将其关闭:

chart.transitionDuration(0)

破解该部分将需要做更多的工作,并且最好在图表本身中进行修复

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章