2

我正在阅读 tryfsharp.org 上的图表和比较价格教程,而我在 Fsharp.Charting 库中的 Chart.Combine 函数将不起作用,但其他图表,例如 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")])
4

1 回答 1

2

我建议你用更简单的东西代替你的数据生成器函数,并首先用这个模型实现正确的绘图。例如,以下脚本:

#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")])

必须毫无问题地绘制组合模型图,就像在我的本地盒子上一样。从这里您可以深入了解原始问题的原因,并将您的recentPricesrecentPricesMock.

编辑:在获得完整的有问题的源代码之后,我可以指出两个问题,正如我所期望的那样,这些问题在于您选择的数据而不是图表本身:

首先,您的定义recentPrices将日期转换为一年中的连续日期row.Date.DayOfYearrecentPrices如果您想保留当前的功能,那么重新定义如下是有意义的

let recentPrices symbol =
    let data = stockData symbol (DateTime(2012,1,1)) DateTime.Now
    [ for row in data.Data -> row.Date, row.Close ]

其次,您选择了一对无法很好地组合在单个图表上的股票(AAPL 为数百美元,而 MSFT 为低 10 美元),这增加了第一个问题中数据点的重复。除了上述recentPrices定义更改之外,将您的代码 AAPL 更改为 YHOO 之后

Chart.Combine ([
            Chart.Line(recentPrices "YHOO", Name="Yahoo")
            Chart.Line(recentPrices "MSFT", Name="Microsoft")
            ])

产生一个漂亮的平滑图表组合: 组合图

于 2013-07-01T19:41:50.893 回答