Как отформатировать научные данные в соответствующие серии данных для отображения графиков в Ruby (Rails 3.1.x)? - PullRequest
1 голос
/ 06 января 2012

Требуется некоторое руководство о том, как правильно отображать данные, которые очень малы и хранятся как BigDecimal.

Если бы у кого-то был опыт использования BigDecimals в любом графическом сценарии, я считаю, что ваш вклад в то, как вы поместили их в пригодную для использования последовательность, был бы неоценим.

В настоящее время я использую lazy_high_charts , и действительно кажется, что это сработает исключительно хорошо, однако я столкнулся с проблемой, когда я не имел дело с данными по минутной шкале BigDecimal до настоящего времени.

Учитывая мои запросы, я вытащу около 1000 точек данных для нескольких различных серий данных с точностью в диапазоне от 0,100E-9 до 0,100E-1.

Как лучше всего подготовить эти ряды данных для представления на таком графике, который имеет научное применение и поэтому важна точность? Я не уверен, смогу ли я продолжить или продолжить в BigDecimal или что-то еще?


В настоящее время я запрашиваю базу данных с помощью строки, аналогичной:

series_a = dataset.order("date").select('data_set.data1').limit(1000).all.zip

Буду признателен за некоторые рекомендации по переходу от этого результата (опять-таки, к выводу массива BigDecimals) к соответствующему формату для того, что войдет в серию диаграмм.

Контекстуальный пример кода, который я использую для построения диаграммы в моем контроллере:

@h = LazyHighCharts::HighChart.new('graph') do |f|
  series_a = dataset.order("date").select('data_set.data1').limit(1000).all.zip
  series_b = dataset.order("date").select('data_set.data3').limit(1000).all.zip

  f.series(:name => 'Data 1', :data => series_a)
  f.series(:name => 'Data 2', :data => series_b)

  f.chart({:defaultSeriesType => "line" })
  f.yAxis [
        {:title => { :text => "Left Y Label", :margin => 10} },
        {:title => { :text => "Right Y Label"}, :opposite => true }
  ]
  f.xAxis(:title => { :text => "X Label"} )
  f.title(:text => "Graph Title")
  f.legend(:align => 'right', :verticalAlign => 'top', :y => 75, :x => -50, :layout => 'vertical')
end

Я думаю, что я немного продвинулся в своем понимании того, что я решил преобразовать BigDecimals в строки согласно " Как получить доступ к полям по имени атрибута из результатов строки ActiveRecord? " Однако, похоже, в конечном итоге это не дает результатов и дает ошибочные результаты, так как поле функций серии :data ожидает, я думаю, числового ввода. Я думаю, что в конечном итоге это приводит к тому, что json отправляется в верхние чарты, однако я все еще застрял на данный момент, пытаясь правильно передать эти значения.

1 Ответ

1 голос
/ 09 января 2012

Когда вы сделаете это:

series_a = dataset.order("date").select('data_set.data1').limit(1000).all.zip

вы получите массив массивов, как мы уже обсуждали в другом месте .Если вы избавитесь от zip, вы должны получить массив объектов в series_a.Я предполагаю, что диаграмма будет более счастливой с массивом чисел, так:

series_a = dataset.order("date").
                   select('data_set.data1').
                   limit(1000).
                   all.
                   map(&:data1)

или, если data1 является BigDecimal (из-за использования типа с фиксированной точностью в базе данных), тогда, возможно, вы 'Я хотел бы получить:

series_a = dataset.order("date").
                   select('data_set.data1').
                   limit(1000).
                   all.
                   map { |o| o.data1.to_f }

, чтобы получить массив значений с плавающей запятой, с которыми диаграмма должна знать, что делать.

Я не знаком с Highcharts, поэтому здесь есть некоторые догадки.

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