我有一个用Highcharts渲染折线图的方法。图中的数据是avg_rates
变量中的数组,具有以下值:
[0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0, 0, 0, 0, 0, 0]
当我使用变量时,它不会渲染该行:
f.series(
name: "Average rates",
data: avg_rates
)
当我使用数组时,它会渲染线:
f.series(
name: "Average rates",
data: [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0, 0, 0, 0, 0, 0]
)
我不知道为什么会这样吗?这是完整的方法:
def create_avg_rates_chart(avg_rates)
months = ['jan','feb','mar','apr','mei','jun','jul','aug','sep','okt','nov', 'dec']
min = avg_rates[0] - 5
max = avg_rates[0] + 5
avg_rates_chart = LazyHighCharts::HighChart.new('graph') do |f|
f.chart(type: 'line', height: '150', width: '1000')
f.pane(size: '100%')
f.colors(['#0092C9'])
f.xAxis(
categories: months.map{ |m| [m] },
labels: {
style: { "fontSize": "12px" }
}
)
f.yAxis(
title: {
text: 0
},
min: min,
max: max
)
f.plotOptions(
line: {
dataLabels: {
enabled: true,
padding: 10
},
enableMouseTracking: false,
lineWidth: 4,
marker: {
radius: 5
}
}
)
f.series(
name: "Average rates",
data: avg_rates
)
f.legend(enabled: false)
end
end
答案 0 :(得分:1)
最有可能发生这种情况的原因是,当您从数组变量中复制内容时,您不会复制实际对象,而只是复制了控制台表示形式(也就是#inspect
的结果)。
数组avg_rates
最有可能包含BigDecimal
:
# avg_rates comes in from outside the function, the line below is a mock.
avg_rates = %w[89.36 89.01 90.15 90.43 89.94 91.05 0 0 0 0 0 0].map(&:to_d)
这些值在控制台中使用#inspect
方法表示,并产生以下可视输出:
#=> [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
此可视输出也是完全有效的Ruby代码。但是,如果在控制台中键入0.8936e2
,则将实例化Float
而不是BigDecimal
。如果只看输入数组表示形式的返回值,就可以看出这一点:
avg_rates_repr = [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
#=> [89.36, 89.01, 90.15, 90.43, 89.94, 91.05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
avg_rates.map(&:class).uniq
#=> [BigDecimal]
avg_rates_repr.map(&:class).uniq
#=> [Float]
正如您所说,使用avg_rates
变量时图形不会呈现,但是复制表示时会呈现。这意味着LazyHighCharts::HighChart
不接受BigDecimal
,但接受Float
。因此,您的解决方案应该是将值转换为Float
,然后再将其传递给:data
的{{1}}选项。
#series