2016-07-09 4 views
1

Я работаю над проектом визуализации данных, и я использую библиотеку dc.js. После преобразования данных в плоскую структуру данных (для кросса-фильтра), данные выглядит следующим образом:Как использовать функцию агрегирования исключений Reductio для нескольких столбцов данных?

[{"date":"2015-01-01","region":1,"cancer":10,"diabetes":5,"aqi_index":66,"pm2_5":20,"pm10":35},{"date":"2015-01-01","region":2,"cancer":30,"diabetes":25,"aqi_index":66,"pm2_5":20,"pm10":35}] 

У меня есть график линии для отображения данных загрязнения воздуха и многослойная области диаграмма для отображения медицинских записей.

Здесь я столкнулся с проблемой. Как вы можете видеть, моя таблица содержит две строки для каждой даты, по одной для каждого региона. Медицинские данные различаются в зависимости от региона; Тем не менее, данные о загрязнении воздуха одинаковы для обоих регионов на ту же дату. Как я использую следующий код, чтобы получить график чтения загрязнителей воздуха в зависимости от времени:

var ndx = crossfilter(data); 
var dateDim = ndx.dimension(function(d) {return d["date"];}); 

var aqi = dateDim.group().reduceSum(function(d) {return d["aqi_index"];}); 
var pm2_5 = dateDim.group().reduceSum(function(d) {return d["pm2_5"];}); 
var pm10 = dateDim.group().reduceSum(function(d) {return d["pm10"];}); 

Моего график для данных загрязнения воздуха становится неточным, как я показывать удвоенное количество загрязняющих веществ для каждой даты. Как я могу отобразить уникальное значение каждого показания загрязняющих веществ (индекс AQI, PM 2.5, PM 10) для каждой даты с использованием функции агрегации исключения Reductio? Будет ли это влиять на мою диаграмму для медицинских данных?

ответ

1

Я думаю, что это должно работать:

var ndx = crossfilter(data); 
var dateDim = ndx.dimension(function(d) {return d["date"];}); 
var dateGroup = dateDim.group() 
var reducer = reductio() 

// Value allows multiple aggregations on the same group. 
// Here aggregate all values on the "cancer" property for a date. 
reducer.value("cancer").sum("cancer") 

// Here aggregate only the first value of the "aqi_index" property for a date to 
// avoid double-counting 
reducer.value("aqi_index").exception("date").exceptionSum("aqi_index") 

reducer(dateGroup) 

Добавьте столько агрегирование значений, как вы хотите, чтобы объединить все ваши меры по группе. Дайте мне знать, если вы получите сообщение об ошибке.

Пример JSFiddle (см консоль для результатов): https://jsfiddle.net/esjewett/5onebhsd/1/

+0

я получил следующее сообщение об ошибке, когда я попробовал ваш код: 'TypeError: group.all не является функцией. (В 'group.all()', 'group.all' не определено) ' –

+0

Я не вижу места в вашем вопросе или моем примере, где будет вызываться group.all. Вы опубликовали полный код? –

+0

Собственно, сообщение об ошибке было отправлено в ссылку на файл dc.js, когда я добавил код. Однако мне удалось обойти проблему, разделив данные на две таблицы и используя два отдельных экземпляра перекрестного фильтра, а затем добавив метод прослушивателя событий, чтобы связать обе диаграммы вместе при фильтрации (что хорошо работает для моего проекта). Большое спасибо за вашу помощь! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^