Перекрестный фильтр: фильтрация по X и Y для точечной диаграммы

#crossfilter

#перекрестный фильтр

Вопрос:

Предполагая, что у меня есть массив подобных объектов:

 [{xVal: 9.7, yVal: 100},
{xVal: 12.3, yVal: 40},
{xVal: 12.4, yVal: 60}, ...]
  

Я хотел бы отфильтровать его и значительно уменьшить его размер для использования в точечной диаграмме. Я пробовал некоторые вещи, но в какой-то момент был немного сбит с толку правильными практиками, а также документацией API. Насколько я понимаю, фильтры стекаются, поэтому я попробовал это:

 let xDim: Dimension<ITest, number> = cf.dimension((d: ITest) => d.xVal)
let yDim: Dimension<ITest, number> = cf.dimension((d: ITest) => d.yVal)
yDim.filterRange([40, 80])
let xDimGrouped: any = xDim.group((d: number) => Math.round(d))
  

Мое намерение состоит в том, чтобы в конечном итоге сгруппировать на основе x и y, а также иметь возможность фильтровать их. В приведенном выше коде фильтр игнорируется, как только он группируется ( xDim.top(3) хотя возвращает отфильтрованный массив).

Для группировки по двум значениям я пробовал это:

 let combDim: Dimension<ITest, string> = cf.dimension((d: ITest) => Math.round(d.xVal) ':' d.yVal)
let yDim: Dimension<ITest, number> = cf.dimension((d: ITest) => d.yVal)
  

Это работает, но в конце потребуется разделить все ключи, чтобы получить x и y для графика. Если только я чего-то не упустил. Но здесь также возникает та же проблема. Фильтрация yDim повлияла бы combDim.top(3) на группу, но не на нее.

В документации API говорится, что «группировка пересекает текущие фильтры перекрестного фильтра, за исключением фильтра связанного измерения. Таким образом, групповые методы рассматривают только записи, которые удовлетворяют всем фильтрам, кроме фильтра этого измерения. Итак, если перекрестный фильтр платежей фильтруется по типу и сумме, то group by total учитывает фильтр только по типу.»

Не означает ли это, что фильтр on yDim должен влиять на grouping of combDim ?

Редактировать:

Я создал пример того, что я имел в виду: https://jsfiddle.net/e98not64/2 /

Оказывается, что all() всегда возвращает всех членов группы, но обновляет value свойство в соответствии с его вхождениями с примененными фильтрами. Я не замечал этого раньше и думал, что это игнорирует фильтры, потому что я проверил размер групп и возвращенный массив: x Я мог бы просто проверить, равно ли значение > 0 , и разделить key значение, чтобы получить x и y . Было бы это правильным подходом / хорошим способом сделать это?

Комментарии:

1. Мне кажется, что это должно сработать. Вы не показываете нам свои выходные данные группы или то, что вы ожидаете. Пожалуйста, добавьте это, а также полный код, который вы используете, чтобы добраться до этой точки. Еще лучше был бы интерактивный пример, но полное объяснение того, что вы сделали, что произошло и чем это отличается от того, что вы ожидаете, — это действительно минимум, который нам нужен, чтобы быть в состоянии помочь.

2. Спасибо. Я думал, что большую часть этого уже сделал, но тогда это, по крайней мере, было не очень понятно. Я добавил пример jsfiddle и попытался подробнее рассказать о своей проблеме / путанице ранее.

3. Круто, спасибо. И да, описанный вами подход хорош!

4. Полагаю, вы ответили на мой вопрос, заставив меня тогда написать правильный пример: D Это показалось немного.. «халтурно», но если это правильный подход, то, я думаю, я могу начать добавлять фильтры повсюду. Спасибо!

5. Да, именно так работают группы перекрестных фильтров. Изменяется только значение. Как только группа существует, она обычно сохраняется. Причина в том, что группа подсчета — это всего лишь частный случай группы более общего назначения, в которой вы можете выполнять любые вычисления, какие захотите. Таким образом, библиотека не хотела бы предполагать, что значение 0 каким-либо образом является особенным.