График и сравнение цен в 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")
            ])

дает красивый гладкий график:combochart

Другие вопросы по тегам