Rails Chartkick。具有嵌套哈希的多系列折线图
Rails Chartkick. Multiple Series line chart with nested hash
正在尝试制作多系列折线图。 (可视化工具是 Chartjs。)来自 README
:
<%= line_chart [
{name: "Series A", data: series_a},
{name: "Series B", data: series_b}
] %>
我的数据已经采用 JSON 格式,但需要一些操作才能正确。原始表格如下所示:
=> [{"id"=>30,
"runner"=>"Golden State Warriors",
"price"=>1.51,
"histories"=>[{"price"=>1.51, "created_at"=>"2016-11-19T17:42:18.699Z"}, {"price"=>1.51, "created_at"=>"2016-11-20T07:56:55.662Z"}]},
{"id"=>32, ETC
所以,有了
markets.map{ |m| [name: m['runner'], data: m['histories'].map{|h| [h['created_at'], 1/h['price']] }]}.flatten!
产生:
=> [
{:name=>"Golden State Warriors", :data=>[["2016-11-19T17:42:18.699Z", 0.6622516556291391], ["2016-11-20T07:56:55.662Z", 0.6622516556291391]]},
{:name=>"Los Angeles Clippers", :data=>[["2016-11-19T17:42:18.795Z", 0.1], ["2016-11-20T07:56:55.717Z", 0.1]]}, ETC
虽然我没有收到错误,但图表是一个空象限,[object Object]
在 0,0。
该图表在我的视图中位于 @markets.each
块中,因为我想创建多个图表,页面显示相同的内容但数据不同。我玩了一个 .each_with_index
,我可以通过手动输入数据来部分显示图表,如 README
所示:
<%= line_chart [
{name: markets[i]['runner'], data: markets[i]['histories'].map{|h| [h['created_at'], 1/h['price']]}},
{name: markets[i+1]['runner'], data: markets[i+1]['histories'].map{|h| [h['created_at'], 1/h['price']]}}
] %>
它显示了图表上的前两个系列,但不是正确的方法,因为每个图表有不同的 i 个元素。
我能做什么?
使用 .each
方法解决了这个问题。我敢肯定有一种更简洁的方法可以做到这一点,但它目前有效。
def chart(markets)
chart_data = markets.map{ |m| [name: m['runner'], data: m['histories'].map{|h| [h['created_at'], 1/h['price']]}]}.flatten
line_chart chart_data.each do |m|
[{name: [:name], data: [:data]}]
end
end
正在尝试制作多系列折线图。 (可视化工具是 Chartjs。)来自 README
:
<%= line_chart [
{name: "Series A", data: series_a},
{name: "Series B", data: series_b}
] %>
我的数据已经采用 JSON 格式,但需要一些操作才能正确。原始表格如下所示:
=> [{"id"=>30,
"runner"=>"Golden State Warriors",
"price"=>1.51,
"histories"=>[{"price"=>1.51, "created_at"=>"2016-11-19T17:42:18.699Z"}, {"price"=>1.51, "created_at"=>"2016-11-20T07:56:55.662Z"}]},
{"id"=>32, ETC
所以,有了
markets.map{ |m| [name: m['runner'], data: m['histories'].map{|h| [h['created_at'], 1/h['price']] }]}.flatten!
产生:
=> [
{:name=>"Golden State Warriors", :data=>[["2016-11-19T17:42:18.699Z", 0.6622516556291391], ["2016-11-20T07:56:55.662Z", 0.6622516556291391]]},
{:name=>"Los Angeles Clippers", :data=>[["2016-11-19T17:42:18.795Z", 0.1], ["2016-11-20T07:56:55.717Z", 0.1]]}, ETC
虽然我没有收到错误,但图表是一个空象限,[object Object]
在 0,0。
该图表在我的视图中位于 @markets.each
块中,因为我想创建多个图表,页面显示相同的内容但数据不同。我玩了一个 .each_with_index
,我可以通过手动输入数据来部分显示图表,如 README
所示:
<%= line_chart [
{name: markets[i]['runner'], data: markets[i]['histories'].map{|h| [h['created_at'], 1/h['price']]}},
{name: markets[i+1]['runner'], data: markets[i+1]['histories'].map{|h| [h['created_at'], 1/h['price']]}}
] %>
它显示了图表上的前两个系列,但不是正确的方法,因为每个图表有不同的 i 个元素。
我能做什么?
使用 .each
方法解决了这个问题。我敢肯定有一种更简洁的方法可以做到这一点,但它目前有效。
def chart(markets)
chart_data = markets.map{ |m| [name: m['runner'], data: m['histories'].map{|h| [h['created_at'], 1/h['price']]}]}.flatten
line_chart chart_data.each do |m|
[{name: [:name], data: [:data]}]
end
end