График и сравнение цен в F# - Chart.Combine не будет производить график
Я работаю над учебником по графику и сравнению цен на tryfsharp.org, и моя функция Chart.Combine в библиотеке Fsharp.Charting не будет работать, но другие диаграммы, такие как Chart.Line, будут работать! Код ниже.
// Helper function returns dates & closing prices from 2012
let recentPrices symbol =
let data = stockData symbol (DateTime(2012,1,1)) DateTime.Now
[ for row in data.Data -> row.Date.DayOfYear, row.Close ]
Chart.Line(recentPrices "AAPL", Name="Apple") //These two guys work when I try to plot them.
Chart.Line(recentPrices "MSFT", Name="Microsoft")
Chart.Combine( // This guy will not plot. Syntax found here: http://fsharp.github.io/FSharp.Charting/PointAndLineCharts.html
[ Chart.Line(recentPrices "AAPL", Name="Apple")
Chart.Line(recentPrices "MSFT", Name="Microsoft")])
1 ответ
Я бы посоветовал вам заменить функцию генератора данных на что-то более простое и сначала добиться правильного построения графика с помощью этого макета. Например, следующий скрипт:
#load @"<your path here>\Fsharp.Charting.fsx"
open System
open FSharp.Charting
let rand = System.Random
let recentPricesMock symbol =
[for i in 1..12 -> DateTime(2012,i,1),rand.Next(100)]
Chart.Combine (
[ Chart.Line(recentPricesMock "AAPL", Name="Apple")
Chart.Line(recentPricesMock "MSFT", Name="Microsoft")])
Я должен построить комбинированный макет без проблем, как это делается на моем локальном блоке. Отсюда вы можете найти причину оригинальной проблемы, сравнивая ваши recentPrices
с recentPricesMock
,
РЕДАКТИРОВАТЬ: после получения полного проблемного исходного кода я могу указать на две проблемы, которые, как я ожидал, скорее связаны с выбором данных, чем с диаграммами как таковыми:
Во-первых, ваше определение recentPrices
преобразует даты в последовательный день года (row.Date.DayOfYear
), поэтому переход с 2012 на 2013 портит ваши данные и, следовательно, графики. Если вы хотите сохранить текущую функциональность, то имеет смысл переопределить recentPrices
как показано ниже
let recentPrices symbol =
let data = stockData symbol (DateTime(2012,1,1)) DateTime.Now
[ for row in data.Data -> row.Date, row.Close ]
Во-вторых, вы выбрали пару акций, которые плохо масштабируются при объединении на одном графике (AAPL в больших сотнях $$, в то время как MSFT в низких десятках $$), что добавляет повторение точек данных из первой проблемы. После изменения в вашем коде AAPL на YHOO в дополнение к recentPrices
изменение определения, описанное выше
Chart.Combine ([
Chart.Line(recentPrices "YHOO", Name="Yahoo")
Chart.Line(recentPrices "MSFT", Name="Microsoft")
])
дает красивый гладкий график: