【问题标题】:Highstocks add n number of series to chart in railsHighstocks 将 n 个系列添加到 rails 中的图表
【发布时间】:2013-03-11 14:36:27
【问题描述】:

我有一个名为“hack”的模型,它可以有许多“序列”。每个“系列”可以有许多“观察”。 “观察”是图表数据(例如日期和值所在的位置)。我希望能够创建一个单一黑客图表,该图表可以具有可变数量的连续剧,每个连续剧都包含“观察”中图表的值。

我的 hack 控制器的“显示”操作如下所示:

def show
  @hack = Hack.find(params[:id])
  @obj = {}
  @hack.serials.each do |s|
    @obj[:name] = s.series_name
    data = s.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '')
    @obj[:data] = data
  end
end

show.html.erb 文件如下所示:

<div id="container" style="height: 500px; min-width: 500px"></div>

<script>
$(function() {
  // Create the chart
  window.chart = new Highcharts.StockChart({
    chart : {
      renderTo : 'container'
    },
    series : 
      <%= raw @obj.to_json %>
    });
});
</script>   

运行此代码时,图表显示“无效日期”。我知道数据是正确的,因为 Highstocks 在我使用单个数据系列时会正确生成图表。在这种情况下,hack 控制器的显示操作是:

def show
  @hack = Hack.find(params[:id])
end

show.html.erb 文件为:

<div id="container" style="height: 500px; min-width: 500px"></div>

<script>
$(function() {
  // Create the chart
  window.chart = new Highcharts.StockChart({
    chart : {
      renderTo : 'container'
    },
    series : [{
      name: 'first',
      data: <%= raw @serial.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '') %>
            }]
   });
 });
 </script>  

我的问题是如何从 rails 向 Highstocks 图表添加 n 个连续剧,其中 n = 特定 hack 中的连续剧数?

【问题讨论】:

  • 整个连续剧、hacks 等有点难以理解,但一个“连续剧”是否等于图中的一个“线”?
  • @MatthewKremer,是的。序列可以类似于“美国 GDP”,其中观察值是给定日期范围内 GDP 的实际值。

标签: ruby-on-rails ruby-on-rails-3 highcharts


【解决方案1】:

好的,如果我理解正确,您希望每个序列在一个图表中显示为自己的线。我不知道 Ruby on Rails,所以我要在这里“评论”代码。

基本概念是每个系列都应该是系列列表中自己的系列{}。

def show
  @hack = Hack.find(params[:id])
  @objs = []
  @hack.serials.each do |s|
    @obj = {}
    @obj[:name] = s.series_name
    data = s.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '')
    @obj[:data] = data
    @objs APPEND THE NEW @obj
  end
end

然后在 eval 中使用 to_json 和新的 @objs 数组:

var d = eval('<%= raw @objs.to_json %>');

在我们完成之后,您必须查看字符串数组以将它们转换为 javascript 数组,然后您可以传递“d”作为系列的值。

for (var i=0;i<d.length;i++){
   d[i]['data'] = eval(d[i]['data']);   
}

这是一个 JSFiddle 展示了这个概念。

【讨论】:

  • 我希望每个 hack 能够在同一个图表中处理多个系列。因此,如果 hack1 有三个系列,它将生成一个比较这三个系列的图表,如果 hack2 有两个系列,它将生成一个比较这两个系列的图表,等等。
  • 正确,很抱歉,如果我的第一句话措辞错误,这个解决方案应该适合你。你能试试并告诉我吗?您希望每个连续剧都是一个 {},其名称和数据位于列表中。所以你会得到 [{name: 'Test', data: stuff},{name: 'Test 2', data: stuff}]。
  • 我仍然从 Highstocks 获得无效日期。以下是通过视图源呈现的部分内容: series : [{"name":"AFEXPND","data":"[[-1293840000000, 2.6], [-1262304000000, 2.7], [-1230768000000, 4.0], Highstocks不幸的是不喜欢它。
  • 我很确定负数不能用作日期,请在发送数据之前尝试将它们转换为正数。
  • 负数有效,它们只是 1970 年之前的日期(纪元时间)。我知道它有效,因为当我渲染单个系列时,图表会正确渲染。我认为这个问题与整个数组的格式有关。我发现了这个小提琴jsfiddle.net/jlbriggs/JVNjs/89,它显示了格式化具有多个对象的数组。不同的是,数组 serObj 中的散列有一个名为 data: 的键,它周围没有引号。我只是不知道如何从 Rails 中产生相同的数组结果。
【解决方案2】:

使用to_json 使其更具可读性

series: <%= @serials.to_json %>

在您的控制器中,@serials

@serials = []
@hack.serials.each do |s|
  s.observations.each do |o|
    @serials << [o.hs_date, o.value]
  end
end

【讨论】:

  • 首先感谢您的回复。当我使用您的 sn-p 时,我在控制台“未捕获的语法错误:意外令牌 &”中收到以下错误。 Rails 像 [[“-1293840000000”、“2.6”] 之类的数据进行包装。为了解决这个问题,我使用了 'series: ' 但是我得到了无效日期的原始错误。最后,我需要在每个系列之前插入 :name 键,以便引用每个系列。
猜你喜欢
  • 1970-01-01
  • 2015-06-03
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多